From 3edc7dac19c5acfc853afde6315e8cfe1d9d4926 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Thu, 12 Jan 2023 23:57:50 +0800 Subject: [PATCH] Modify add dataExtra function and callback function id in HookParam, YukiMemberHookCreator --- .../yukihookapi/hook/param/HookParam.md | 24 ++++++++++++++++++- .../yukihookapi/hook/param/HookParam.md | 24 ++++++++++++++++++- .../hook/core/YukiMemberHookCreator.kt | 16 ++++++++++--- .../yukihookapi/hook/param/HookParam.kt | 21 ++++++++++++++-- 4 files changed, 78 insertions(+), 7 deletions(-) diff --git a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md index 5f84e6f2..6c776d6e 100644 --- a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md +++ b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md @@ -13,7 +13,11 @@ You can use the **Chrome Translation Plugin** to translate entire pages for refe # HookParam - class ```kotlin:no-line-numbers -class HookParam internal constructor(private val creatorInstance: YukiMemberHookCreator, private var param: YukiHookCallback.Param?) +class HookParam internal constructor( + private val creatorInstance: YukiMemberHookCreator, + private var paramId: String, + private var param: YukiHookCallback.Param? +) ``` **Change Records** @@ -26,6 +30,10 @@ class HookParam internal constructor(private val creatorInstance: YukiMemberHook 修正拼写错误的 **creater** 命名到 **creator** +`v1.1.5` `modified` + +新增 `paramId` 参数 + **Function Illustrate** > Hook 方法、构造方法的目标对象实现类。 @@ -158,6 +166,20 @@ var result: Any? > 获取、设置当前 Hook 对象的 `method` 或 `constructor` 的返回值。 +## dataExtra - field + +```kotlin:no-line-numbers +val dataExtra: Bundle +``` + +**Change Records** + +`v1.1.5` `added` + +**Function Illustrate** + +> 获取当前回调方法体范围内的数据存储实例。 + ## hasThrowable - field ```kotlin:no-line-numbers diff --git a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md index 42dd84de..14e89840 100644 --- a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md +++ b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/param/HookParam.md @@ -5,7 +5,11 @@ pageClass: code-page # HookParam - class ```kotlin:no-line-numbers -class HookParam internal constructor(private val creatorInstance: YukiMemberHookCreator, private var param: YukiHookCallback.Param?) +class HookParam internal constructor( + private val creatorInstance: YukiMemberHookCreator, + private var paramId: String, + private var param: YukiHookCallback.Param? +) ``` **变更记录** @@ -18,6 +22,10 @@ class HookParam internal constructor(private val creatorInstance: YukiMemberHook 修正拼写错误的 **creater** 命名到 **creator** +`v1.1.5` `修改` + +新增 `paramId` 参数 + **功能描述** > Hook 方法、构造方法的目标对象实现类。 @@ -150,6 +158,20 @@ var result: Any? > 获取、设置当前 Hook 对象的 `method` 或 `constructor` 的返回值。 +## dataExtra - field + +```kotlin:no-line-numbers +val dataExtra: Bundle +``` + +**变更记录** + +`v1.1.5` `新增` + +**功能描述** + +> 获取当前回调方法体范围内的数据存储实例。 + ## hasThrowable - field ```kotlin:no-line-numbers diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.kt index 2f173428..e8917fac 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreator.kt @@ -52,6 +52,7 @@ import com.highcapable.yukihookapi.hook.log.yLoggerW import com.highcapable.yukihookapi.hook.param.HookParam import com.highcapable.yukihookapi.hook.param.PackageParam import com.highcapable.yukihookapi.hook.type.java.* +import com.highcapable.yukihookapi.hook.utils.RandomSeed import com.highcapable.yukihookapi.hook.utils.await import com.highcapable.yukihookapi.hook.xposed.bridge.type.HookEntryType import java.lang.reflect.Constructor @@ -220,6 +221,15 @@ class YukiMemberHookCreator @PublishedApi internal constructor( /** 是否已经执行 Hook */ private var isHooked = false + /** [beforeHook] 回调方法体 ID */ + private val beforeHookId = RandomSeed.createString() + + /** [afterHook] 回调方法体 ID */ + private val afterHookId = RandomSeed.createString() + + /** [replaceAny]、[replaceUnit] 回调方法体 ID */ + private val replaceHookId = RandomSeed.createString() + /** [beforeHook] 回调 */ private var beforeHookCallback: (HookParam.() -> Unit)? = null @@ -574,7 +584,7 @@ class YukiMemberHookCreator @PublishedApi internal constructor( /** 定义替换 Hook 回调方法体 */ val replaceMent = object : YukiMemberReplacement(priority.toPriority()) { override fun replaceHookedMember(param: Param) = - replaceHookParam.assign(param).let { assign -> + replaceHookParam.assign(replaceHookId, param).let { assign -> runCatching { replaceHookCallback?.invoke(assign).also { checkingReturnType((param.member as? Method?)?.returnType, it?.javaClass) @@ -600,7 +610,7 @@ class YukiMemberHookCreator @PublishedApi internal constructor( /** 定义前后 Hook 回调方法体 */ val beforeAfterHook = object : YukiMemberHook(priority.toPriority()) { override fun beforeHookedMember(param: Param) { - beforeHookParam.assign(param).also { assign -> + beforeHookParam.assign(beforeHookId, param).also { assign -> runCatching { beforeHookCallback?.invoke(assign) checkingReturnType((param.member as? Method?)?.returnType, param.result?.javaClass) @@ -616,7 +626,7 @@ class YukiMemberHookCreator @PublishedApi internal constructor( } override fun afterHookedMember(param: Param) { - afterHookParam.assign(param).also { assign -> + afterHookParam.assign(afterHookId, param).also { assign -> runCatching { afterHookCallback?.invoke(assign) if (afterHookCallback != null) onHookLogMsg(msg = "After Hook Member [${this@hook}] done [$tag]") 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 d41f0818..63f9bc1b 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 android.os.Bundle import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator.MemberHookCreator import com.highcapable.yukihookapi.hook.core.api.helper.YukiHookHelper @@ -42,12 +43,20 @@ import java.lang.reflect.Method /** * Hook 方法、构造方法的目标对象实现类 * @param creatorInstance [YukiMemberHookCreator] 的实例对象 + * @param paramId 当前回调方法体 ID * @param param Hook 结果回调接口 */ -class HookParam internal constructor(private val creatorInstance: YukiMemberHookCreator, private var param: YukiHookCallback.Param? = null) { +class HookParam internal constructor( + private val creatorInstance: YukiMemberHookCreator, + private var paramId: String = "", + private var param: YukiHookCallback.Param? = null +) { internal companion object { + /** 每个回调方法体的数据存储实例数据 */ + private val dataExtras = HashMap() + /** [HookParam] 是否已经执行首次回调事件 */ internal var isCallbackCalled = false @@ -59,10 +68,12 @@ class HookParam internal constructor(private val creatorInstance: YukiMemberHook /** * 在回调中设置 [HookParam] 使用的 [YukiHookCallback.Param] + * @param paramId 当前回调方法体 ID * @param param Hook 结果回调接口 * @return [HookParam] */ - internal fun assign(param: YukiHookCallback.Param): HookParam { + internal fun assign(paramId: String, param: YukiHookCallback.Param): HookParam { + this.paramId = paramId this.param = param return this } @@ -124,6 +135,12 @@ class HookParam internal constructor(private val creatorInstance: YukiMemberHook param?.result = value } + /** + * 获取当前回调方法体范围内的数据存储实例 + * @return [Bundle] + */ + val dataExtra get() = dataExtras[paramId] ?: Bundle().apply { dataExtras[paramId] = this } + /** * 判断是否存在设置过的方法调用抛出异常 * @return [Boolean]