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>
```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 <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>
```kotlin:no-line-numbers

View File

@@ -5,7 +5,11 @@ pageClass: code-page
# HookParam <span class="symbol">- class</span>
```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 <span class="symbol">- field</span>
```kotlin:no-line-numbers
val dataExtra: Bundle
```
**变更记录**
`v1.1.5` `新增`
**功能描述**
> 获取当前回调方法体范围内的数据存储实例。
## hasThrowable <span class="symbol">- field</span>
```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.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]")

View File

@@ -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<String, Bundle>()
/** [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]