Modify add dataExtra function and callback function id in HookParam, YukiMemberHookCreator

This commit is contained in:
2023-01-12 23:57:50 +08:00
parent 0c131792ac
commit 3edc7dac19
4 changed files with 78 additions and 7 deletions

View File

@@ -13,7 +13,11 @@ You can use the **Chrome Translation Plugin** to translate entire pages for refe
# HookParam <span class="symbol">- class</span> # HookParam <span class="symbol">- class</span>
```kotlin:no-line-numbers ```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** **Change Records**
@@ -26,6 +30,10 @@ class HookParam internal constructor(private val creatorInstance: YukiMemberHook
修正拼写错误的 **creater** 命名到 **creator** 修正拼写错误的 **creater** 命名到 **creator**
`v1.1.5` `modified`
新增 `paramId` 参数
**Function Illustrate** **Function Illustrate**
> Hook 方法、构造方法的目标对象实现类。 > Hook 方法、构造方法的目标对象实现类。
@@ -158,6 +166,20 @@ var result: Any?
> 获取、设置当前 Hook 对象的 `method` 或 `constructor` 的返回值。 > 获取、设置当前 Hook 对象的 `method` 或 `constructor` 的返回值。
## dataExtra <span class="symbol">- field</span>
```kotlin:no-line-numbers
val dataExtra: Bundle
```
**Change Records**
`v1.1.5` `added`
**Function Illustrate**
> 获取当前回调方法体范围内的数据存储实例。
## hasThrowable <span class="symbol">- field</span> ## hasThrowable <span class="symbol">- field</span>
```kotlin:no-line-numbers ```kotlin:no-line-numbers

View File

@@ -5,7 +5,11 @@ pageClass: code-page
# HookParam <span class="symbol">- class</span> # HookParam <span class="symbol">- class</span>
```kotlin:no-line-numbers ```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** 修正拼写错误的 **creater** 命名到 **creator**
`v1.1.5` `修改`
新增 `paramId` 参数
**功能描述** **功能描述**
> Hook 方法、构造方法的目标对象实现类。 > Hook 方法、构造方法的目标对象实现类。
@@ -150,6 +158,20 @@ var result: Any?
> 获取、设置当前 Hook 对象的 `method` 或 `constructor` 的返回值。 > 获取、设置当前 Hook 对象的 `method` 或 `constructor` 的返回值。
## dataExtra <span class="symbol">- field</span>
```kotlin:no-line-numbers
val dataExtra: Bundle
```
**变更记录**
`v1.1.5` `新增`
**功能描述**
> 获取当前回调方法体范围内的数据存储实例。
## hasThrowable <span class="symbol">- field</span> ## hasThrowable <span class="symbol">- field</span>
```kotlin:no-line-numbers ```kotlin:no-line-numbers

View File

@@ -52,6 +52,7 @@ import com.highcapable.yukihookapi.hook.log.yLoggerW
import com.highcapable.yukihookapi.hook.param.HookParam import com.highcapable.yukihookapi.hook.param.HookParam
import com.highcapable.yukihookapi.hook.param.PackageParam import com.highcapable.yukihookapi.hook.param.PackageParam
import com.highcapable.yukihookapi.hook.type.java.* 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.utils.await
import com.highcapable.yukihookapi.hook.xposed.bridge.type.HookEntryType import com.highcapable.yukihookapi.hook.xposed.bridge.type.HookEntryType
import java.lang.reflect.Constructor import java.lang.reflect.Constructor
@@ -220,6 +221,15 @@ class YukiMemberHookCreator @PublishedApi internal constructor(
/** 是否已经执行 Hook */ /** 是否已经执行 Hook */
private var isHooked = false 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] 回调 */ /** [beforeHook] 回调 */
private var beforeHookCallback: (HookParam.() -> Unit)? = null private var beforeHookCallback: (HookParam.() -> Unit)? = null
@@ -574,7 +584,7 @@ class YukiMemberHookCreator @PublishedApi internal constructor(
/** 定义替换 Hook 回调方法体 */ /** 定义替换 Hook 回调方法体 */
val replaceMent = object : YukiMemberReplacement(priority.toPriority()) { val replaceMent = object : YukiMemberReplacement(priority.toPriority()) {
override fun replaceHookedMember(param: Param) = override fun replaceHookedMember(param: Param) =
replaceHookParam.assign(param).let { assign -> replaceHookParam.assign(replaceHookId, param).let { assign ->
runCatching { runCatching {
replaceHookCallback?.invoke(assign).also { replaceHookCallback?.invoke(assign).also {
checkingReturnType((param.member as? Method?)?.returnType, it?.javaClass) checkingReturnType((param.member as? Method?)?.returnType, it?.javaClass)
@@ -600,7 +610,7 @@ class YukiMemberHookCreator @PublishedApi internal constructor(
/** 定义前后 Hook 回调方法体 */ /** 定义前后 Hook 回调方法体 */
val beforeAfterHook = object : YukiMemberHook(priority.toPriority()) { val beforeAfterHook = object : YukiMemberHook(priority.toPriority()) {
override fun beforeHookedMember(param: Param) { override fun beforeHookedMember(param: Param) {
beforeHookParam.assign(param).also { assign -> beforeHookParam.assign(beforeHookId, param).also { assign ->
runCatching { runCatching {
beforeHookCallback?.invoke(assign) beforeHookCallback?.invoke(assign)
checkingReturnType((param.member as? Method?)?.returnType, param.result?.javaClass) checkingReturnType((param.member as? Method?)?.returnType, param.result?.javaClass)
@@ -616,7 +626,7 @@ class YukiMemberHookCreator @PublishedApi internal constructor(
} }
override fun afterHookedMember(param: Param) { override fun afterHookedMember(param: Param) {
afterHookParam.assign(param).also { assign -> afterHookParam.assign(afterHookId, param).also { assign ->
runCatching { runCatching {
afterHookCallback?.invoke(assign) afterHookCallback?.invoke(assign)
if (afterHookCallback != null) onHookLogMsg(msg = "After Hook Member [${this@hook}] done [$tag]") if (afterHookCallback != null) onHookLogMsg(msg = "After Hook Member [${this@hook}] done [$tag]")

View File

@@ -29,6 +29,7 @@
package com.highcapable.yukihookapi.hook.param package com.highcapable.yukihookapi.hook.param
import android.os.Bundle
import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator
import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator.MemberHookCreator import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator.MemberHookCreator
import com.highcapable.yukihookapi.hook.core.api.helper.YukiHookHelper import com.highcapable.yukihookapi.hook.core.api.helper.YukiHookHelper
@@ -42,12 +43,20 @@ import java.lang.reflect.Method
/** /**
* Hook 方法、构造方法的目标对象实现类 * Hook 方法、构造方法的目标对象实现类
* @param creatorInstance [YukiMemberHookCreator] 的实例对象 * @param creatorInstance [YukiMemberHookCreator] 的实例对象
* @param paramId 当前回调方法体 ID
* @param param Hook 结果回调接口 * @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 { internal companion object {
/** 每个回调方法体的数据存储实例数据 */
private val dataExtras = HashMap<String, Bundle>()
/** [HookParam] 是否已经执行首次回调事件 */ /** [HookParam] 是否已经执行首次回调事件 */
internal var isCallbackCalled = false internal var isCallbackCalled = false
@@ -59,10 +68,12 @@ class HookParam internal constructor(private val creatorInstance: YukiMemberHook
/** /**
* 在回调中设置 [HookParam] 使用的 [YukiHookCallback.Param] * 在回调中设置 [HookParam] 使用的 [YukiHookCallback.Param]
* @param paramId 当前回调方法体 ID
* @param param Hook 结果回调接口 * @param param Hook 结果回调接口
* @return [HookParam] * @return [HookParam]
*/ */
internal fun assign(param: YukiHookCallback.Param): HookParam { internal fun assign(paramId: String, param: YukiHookCallback.Param): HookParam {
this.paramId = paramId
this.param = param this.param = param
return this return this
} }
@@ -124,6 +135,12 @@ class HookParam internal constructor(private val creatorInstance: YukiMemberHook
param?.result = value param?.result = value
} }
/**
* 获取当前回调方法体范围内的数据存储实例
* @return [Bundle]
*/
val dataExtra get() = dataExtras[paramId] ?: Bundle().apply { dataExtras[paramId] = this }
/** /**
* 判断是否存在设置过的方法调用抛出异常 * 判断是否存在设置过的方法调用抛出异常
* @return [Boolean] * @return [Boolean]