Update version to 1.0.6

This commit is contained in:
2022-03-20 03:22:18 +08:00
parent e1046e9016
commit e4c8950115
5 changed files with 55 additions and 10 deletions

View File

@@ -2,7 +2,7 @@
![Eclipse Marketplace](https://img.shields.io/badge/build-passing-brightgreen) ![Eclipse Marketplace](https://img.shields.io/badge/build-passing-brightgreen)
![Eclipse Marketplace](https://img.shields.io/badge/license-MIT-blue) ![Eclipse Marketplace](https://img.shields.io/badge/license-MIT-blue)
![Eclipse Marketplace](https://img.shields.io/badge/version-v1.0.55-green) ![Eclipse Marketplace](https://img.shields.io/badge/version-v1.0.6-green)
[![Telegram](https://img.shields.io/static/v1?label=Telegram&message=交流讨论&color=0088cc)](https://t.me/XiaofangInternet) [![Telegram](https://img.shields.io/static/v1?label=Telegram&message=交流讨论&color=0088cc)](https://t.me/XiaofangInternet)
<br/><br/> <br/><br/>
<img src="https://github.com/fankes/YuKiHookAPI/blob/master/img-src/icon.png" width = "100" height = "100"/> <img src="https://github.com/fankes/YuKiHookAPI/blob/master/img-src/icon.png" width = "100" height = "100"/>
@@ -154,7 +154,16 @@ class MainHook : YukiHookXposedInitProxy {
修正一处注释错误;<br/> 修正一处注释错误;<br/>
临时修复一个 BUG<br/> 临时修复一个 BUG<br/>
增加了 `type` 中的大量 `android` 类型以及少量 `java` 类型;<br/> 增加了 `type` 中的大量 `android` 类型以及少量 `java` 类型;<br/>
修复新版与旧版 Kotlin APIs 的兼容性问题。 修复新版与旧版 Kotlin APIs 的兼容性问题。<br/><br/>
- 1.0.6 <br/>
修复 `YukiHookModulePrefs` 在使用一次 `direct` 忽略缓存后每次都忽略的 BUG<br/>
增加新的 API作废了 `isActive` 判断模块激活的传统用法;<br/>
修复非 Xposed 环境使用 API 时打印调试日志的问题;<br/>
修复查找 `Field` 时的日志输出问题和未拦截的异常问题;<br/>
解耦合 `ReflectionUtils` 中的 Xposed API<br/>
增加 `YukiHookModuleStatus` 方法名称的混淆,以精简模块生成的体积;<br/>
装载模块自身 Hook 时将不再打印欢迎信息;<br/>
修复上一个版本仍然存在的某些 BUG。
# Cooperations # Cooperations

View File

@@ -296,6 +296,7 @@ class YukiHookXposedProcessor : SymbolProcessorProvider {
" object : XC_MethodReplacement() {\n" + " object : XC_MethodReplacement() {\n" +
" override fun replaceHookedMethod(param: MethodHookParam?) = XposedBridge.getXposedVersion()\n" + " override fun replaceHookedMethod(param: MethodHookParam?) = XposedBridge.getXposedVersion()\n" +
" })\n" + " })\n" +
" YukiHookAPI.isModulePackageXposedEnv = true" +
" }\n" + " }\n" +
" YukiHookAPI.modulePackageName = \"$realPackageName\"\n" + " YukiHookAPI.modulePackageName = \"$realPackageName\"\n" +
" YukiHookAPI.onXposedLoaded(lpparam)\n" + " YukiHookAPI.onXposedLoaded(lpparam)\n" +

View File

@@ -65,10 +65,10 @@ object YukiHookAPI {
private var isXposedInitialized = false private var isXposedInitialized = false
/** 获取当前 [YukiHookAPI] 的版本 */ /** 获取当前 [YukiHookAPI] 的版本 */
const val API_VERSION_NAME = "1.0.55" const val API_VERSION_NAME = "1.0.6"
/** 获取当前 [YukiHookAPI] 的版本号 */ /** 获取当前 [YukiHookAPI] 的版本号 */
const val API_VERSION_CODE = 9 const val API_VERSION_CODE = 10
/** /**
* 模块是否装载了 Xposed 回调方法 * 模块是否装载了 Xposed 回调方法
@@ -80,6 +80,14 @@ object YukiHookAPI {
val isXposedCallbackSetUp val isXposedCallbackSetUp
get() = !isXposedInitialized && packageParamCallback != null get() = !isXposedInitialized && packageParamCallback != null
/**
* 当前 Hook 的对象是模块自身
*
* - ❗这是私有 API - 请勿手动修改 - 会引发未知异常
*/
@DoNotUseField
var isModulePackageXposedEnv = false
/** /**
* 预设的 Xposed 模块包名 * 预设的 Xposed 模块包名
* *
@@ -291,7 +299,7 @@ object YukiHookAPI {
/** 输出欢迎信息调试日志 */ /** 输出欢迎信息调试日志 */
private fun printSplashLog() { private fun printSplashLog() {
if (!Configs.isDebug || !isShowSplashLogOnceTime) return if (!Configs.isDebug || !isShowSplashLogOnceTime || isModulePackageXposedEnv) return
isShowSplashLogOnceTime = false isShowSplashLogOnceTime = false
yLoggerI(msg = "Welcome to YukiHookAPI $API_VERSION_NAME($API_VERSION_CODE)! Using $executorName API $executorVersion") yLoggerI(msg = "Welcome to YukiHookAPI $API_VERSION_NAME($API_VERSION_CODE)! Using $executorName API $executorVersion")
} }

View File

@@ -89,7 +89,7 @@ class FieldFinder(
} catch (e: Throwable) { } catch (e: Throwable) {
Thread { Thread {
SystemClock.sleep(10) SystemClock.sleep(10)
if (isNotIgnoredNoSuchMemberFailure) yLoggerE(msg = "NoSuchField happend in [$classSet] [${hookTag}]", e = e) onFailureMsg(msg = "NoSuchField happend in [$classSet] [${hookTag}]", throwable = e)
}.start() }.start()
Result(isNoSuch = true, e) Result(isNoSuch = true, e)
} }
@@ -122,10 +122,17 @@ class FieldFinder(
/** /**
* 得到变量实例处理类 * 得到变量实例处理类
*
* - ❗如果目标对象不是静态 - 你必须设置 [instance]
* @param instance 变量所在的实例对象 - 如果是静态可不填 - 默认 null * @param instance 变量所在的实例对象 - 如果是静态可不填 - 默认 null
* @return [Instance] * @return [Instance]
*/ */
fun get(instance: Any? = null) = Instance(instance, give()?.get(instance)) fun get(instance: Any? = null) = try {
Instance(instance, give()?.get(instance))
} catch (e: Throwable) {
onFailureMsg(msg = "Try to get field instance failed", throwable = e)
Instance(instance, self = null)
}
/** /**
* 得到变量实例 * 得到变量实例

View File

@@ -36,8 +36,8 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedList;
import de.robv.android.xposed.XposedHelpers; import java.util.List;
@SuppressWarnings("ALL") @SuppressWarnings("ALL")
@DoNotUseClass @DoNotUseClass
@@ -181,10 +181,30 @@ public class ReflectionUtils {
Class<?> clz = clazz; Class<?> clz = clazz;
if (returnType == null) return findMethodExact(clazz, methodName, parameterTypes); if (returnType == null) return findMethodExact(clazz, methodName, parameterTypes);
do { do {
Method[] methods = XposedHelpers.findMethodsByExactParameters(clazz, returnType, parameterTypes); Method[] methods = findMethodsByExactParameters(clazz, returnType, parameterTypes);
for (Method method : methods) if (method.getName().equals(methodName)) return method; for (Method method : methods) if (method.getName().equals(methodName)) return method;
} while ((clz = clz.getSuperclass()) != null); } while ((clz = clz.getSuperclass()) != null);
} }
throw new IllegalArgumentException("Can't find this method --> name:[" + methodName + "] returnType:[" + returnType.getName() + "] paramType:[" + getParametersString(parameterTypes) + "] in Class [" + clazz.getName() + "] by YukiHookAPI#finder"); throw new IllegalArgumentException("Can't find this method --> name:[" + methodName + "] returnType:[" + returnType.getName() + "] paramType:[" + getParametersString(parameterTypes) + "] in Class [" + clazz.getName() + "] by YukiHookAPI#finder");
} }
private static Method[] findMethodsByExactParameters(Class<?> clazz, Class<?> returnType, Class<?>... parameterTypes) {
List<Method> result = new LinkedList<Method>();
for (Method method : clazz.getDeclaredMethods()) {
if (returnType != null && returnType != method.getReturnType()) continue;
Class<?>[] methodParameterTypes = method.getParameterTypes();
if (parameterTypes.length != methodParameterTypes.length) continue;
boolean match = true;
for (int i = 0; i < parameterTypes.length; i++) {
if (parameterTypes[i] != methodParameterTypes[i]) {
match = false;
break;
}
}
if (!match) continue;
method.setAccessible(true);
result.add(method);
}
return result.toArray(new Method[result.size()]);
}
} }