diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiHookCreater.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiHookCreater.kt index bdb6ffdc..d868b4c9 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiHookCreater.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiHookCreater.kt @@ -383,7 +383,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl val replaceMent = object : XC_MethodReplacement() { override fun replaceHookedMethod(baseParam: MethodHookParam?): Any? { if (baseParam == null) return null - return HookParam(HookParamWrapper(baseParam)).let { param -> + return HookParam(createrInstance = this@YukiHookCreater, HookParamWrapper(baseParam)).let { param -> try { if (replaceHookCallback != null) onHookLogMsg(msg = "Replace Hook Member [${member ?: "All Member $allMethodsName"}] done [$tag]") @@ -402,7 +402,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl val beforeAfterHook = object : XC_MethodHook() { override fun beforeHookedMethod(baseParam: MethodHookParam?) { if (baseParam == null) return - HookParam(HookParamWrapper(baseParam)).also { param -> + HookParam(createrInstance = this@YukiHookCreater, HookParamWrapper(baseParam)).also { param -> runCatching { beforeHookCallback?.invoke(param) if (beforeHookCallback != null) @@ -417,7 +417,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl override fun afterHookedMethod(baseParam: MethodHookParam?) { if (baseParam == null) return - HookParam(HookParamWrapper(baseParam)).also { param -> + HookParam(createrInstance = this@YukiHookCreater, HookParamWrapper(baseParam)).also { param -> runCatching { afterHookCallback?.invoke(param) if (afterHookCallback != null) diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt index feafb969..ff8b9d03 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/HookParam.kt @@ -29,6 +29,7 @@ package com.highcapable.yukihookapi.hook.param +import com.highcapable.yukihookapi.hook.core.YukiHookCreater import com.highcapable.yukihookapi.hook.param.wrapper.HookParamWrapper import java.lang.reflect.Constructor import java.lang.reflect.Member @@ -36,9 +37,10 @@ import java.lang.reflect.Method /** * Hook 方法、构造类的目标对象实现类 + * @param createrInstance [YukiHookCreater] 的实例对象 * @param wrapper [HookParam] 的参数包装类实例 */ -class HookParam(private val wrapper: HookParamWrapper) { +class HookParam(private val createrInstance: YukiHookCreater, private val wrapper: HookParamWrapper) { /** * 获取当前 Hook 对象 [method] or [constructor] 的参数对象数组 @@ -62,16 +64,18 @@ class HookParam(private val wrapper: HookParamWrapper) { /** * 获取当前 Hook 实例的对象 + * + * - ❗如果你当前 Hook 的对象是一个静态 - 那么它将不存在实例的对象 * @return [Any] * @throws IllegalStateException 如果对象为空 */ - val instance get() = wrapper.instance ?: error("HookParam must with a non-null instance") + val instance get() = wrapper.instance ?: error("HookParam instance got null,Is this a static member?") /** * 获取当前 Hook 实例的类对象 * @return [Class] */ - val instanceClass get() = instance.javaClass + val instanceClass get() = wrapper.instance?.javaClass ?: createrInstance.instanceClass /** * 获取当前 Hook 对象的方法 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt index a16d3e56..d8d67fc5 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt @@ -136,6 +136,8 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) { * 通过字符串转换为实体类 * * - 使用当前 [appClassLoader] 装载目标 [Class] + * + * - 若要使用指定的 [ClassLoader] 装载 - 请手动调用 [classOf] 方法 * @return [Class] * @throws NoClassDefFoundError 如果找不到 [Class] */ @@ -165,13 +167,13 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) { /** * 通过字符串查找类是否存在 * - * - 使用当前 [appClassLoader] 装载目标 [Class] + * - 默认使用当前 [appClassLoader] 装载目标 [Class] * @return [Boolean] 是否存在 */ val String.hasClass get() = hasClass(appClassLoader) /** - * 通过 [appClassLoader] 查询并装载 [Class] + * 默认使用当前 [appClassLoader] 查询并装载 [Class] * @param name 类名 * @return [HookClass] */ @@ -182,7 +184,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) { } /** - * 通过 [appClassLoader] 查询并装载 [Class] + * 默认使用当前 [appClassLoader] 查询并装载 [Class] * * 使用此方法查询将会取 [name] 其中命中存在的第一个 [Class] 作为结果 * @param name 可填入多个类名 - 自动匹配 @@ -194,32 +196,39 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) { * Hook 方法、构造类 * * - ❗为防止任何字符串都被当做 [Class] 进行 Hook - 推荐优先使用 [findClass] + * @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用 * @param initiate 方法体 * @return [YukiHookCreater.Result] */ - fun String.hook(initiate: YukiHookCreater.() -> Unit) = findClass(name = this).hook(initiate) + fun String.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) = + findClass(name = this).hook(isUseAppClassLoader, initiate) /** * Hook 方法、构造类 + * @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用 * @param initiate 方法体 * @return [YukiHookCreater.Result] */ - fun Class<*>.hook(initiate: YukiHookCreater.() -> Unit) = hookClass.hook(initiate) + fun Class<*>.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) = + hookClass.hook(isUseAppClassLoader, initiate) /** * Hook 方法、构造类 + * @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用 * @param initiate 方法体 * @return [YukiHookCreater.Result] */ - fun VariousClass.hook(initiate: YukiHookCreater.() -> Unit) = hookClass.hook(initiate) + fun VariousClass.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) = + hookClass.hook(isUseAppClassLoader, initiate) /** * Hook 方法、构造类 + * @param isUseAppClassLoader 是否使用 [appClassLoader] 重新绑定当前 [Class] - 默认启用 * @param initiate 方法体 * @return [YukiHookCreater.Result] */ - fun HookClass.hook(initiate: YukiHookCreater.() -> Unit) = - YukiHookCreater(packageParam = thisParam, hookClass = bind()).apply(initiate).hook() + fun HookClass.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) = + YukiHookCreater(packageParam = thisParam, hookClass = if (isUseAppClassLoader) bind() else this).apply(initiate).hook() /** * [VariousClass] 转换为 [HookClass] 并绑定到 [appClassLoader] @@ -235,7 +244,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) { /** * 将目标 [Class] 绑定到 [appClassLoader] * - * - ❗请注意未绑定到 [appClassLoader] 的 [Class] 不能被装载 - 调用 [hook] 方法会自动绑定 + * - ❗请注意未绑定到 [appClassLoader] 的 [Class] 是不安全的 - 调用 [hook] 方法会根据设定自动绑定 * @return [HookClass] */ private fun HookClass.bind() = try {