mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 17:55:24 +08:00
Update version to 1.0.6
This commit is contained in:
13
README.md
13
README.md
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||

|

|
||||||

|

|
||||||

|

|
||||||
[](https://t.me/XiaofangInternet)
|
[](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
|
||||||
|
|
||||||
|
@@ -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" +
|
||||||
|
@@ -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")
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 得到变量实例
|
* 得到变量实例
|
||||||
|
@@ -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()]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user