Modify change invokeOriginal function and add callOriginal function in HookParam

This commit is contained in:
2022-08-27 12:40:16 +08:00
parent d2f23a35eb
commit d27ca2b914
5 changed files with 113 additions and 24 deletions

View File

@@ -355,28 +355,100 @@ args(index = 1).setTrue()
args(index = 1).setFalse() args(index = 1).setFalse()
``` ```
### Member.invokeOriginal *- i-ext-method* ### callOriginal *- method*
```kotlin ```kotlin
fun <T> Member.invokeOriginal(vararg args: Any?): Any? fun callOriginal(): Any?
```
```kotlin
fun <T> callOriginal(): T?
```
**变更记录**
`v1.0.93` `新增`
**功能描述**
> 执行原始 `Member`。
调用自身未进行 Hook 的原始 `Member` 并调用原始参数执行。
**功能实例**
此方法可以 `invoke` 原始未经 Hook 的 `Member` 对象,取决于原始 `Member` 的参数。
调用自身原始的方法不会再经过当前 `beforeHook``afterHook` 以及 `replaceUnit``replaceAny`
比如我们 Hook 的这个方法被这样调用 `test("test value")`,使用此方法会调用其中的 `"test value"` 作为参数。
> 示例如下
```kotlin
injectMember {
method {
name = "test"
param(StringType)
returnType = StringType
}
afterHook {
// <方案1> 不使用泛型,不获取方法执行结果,调用将使用原方法传入的 args 自动传参
callOriginal()
// <方案2> 使用泛型,已知方法执行结果参数类型进行 cast假设返回值为 String失败会返回 null调用将使用原方法传入的 args 自动传参
val value = callOriginal<String>()
}
}
```
### invokeOriginal *- method*
```kotlin
fun invokeOriginal(vararg args: Any?): Any?
```
```kotlin
fun <T> invokeOriginal(vararg args: Any?): T?
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.93` `修改`
不再需要使用 `member.invokeOriginal` 进行调用
**功能描述** **功能描述**
> 执行原始 `Member`。 > 执行原始 `Member`。
调用自身未进行 Hook 的原始 `Member` 并自定义 `args` 执行。
**功能实例** **功能实例**
此方法可以 `invoke` 原始未经 Hook 的 `Member` 对象,取决于原始 `Member` 的参数和类型 此方法可以 `invoke` 原始未经 Hook 的 `Member` 对象,可自定义需要调用的参数内容
调用自身原始的方法不会再经过当前 `beforeHook``afterHook` 以及 `replaceUnit``replaceAny`
比如我们 Hook 的这个方法被这样调用 `test("test value")`,使用此方法可自定义其中的 `args` 作为参数。
> 示例如下 > 示例如下
```kotlin ```kotlin
member.invokeOriginal("test value") injectMember {
method {
name = "test"
param(StringType)
returnType = StringType
}
afterHook {
// <方案1> 不使用泛型,不获取方法执行结果
invokeOriginal("test value")
// <方案2> 使用泛型,已知方法执行结果参数类型进行 cast假设返回值为 String失败会返回 null
val value = invokeOriginal<String>("test value")
}
}
``` ```
### resultTrue *- method* ### resultTrue *- method*

View File

@@ -127,8 +127,10 @@ afterHook {
resultNull() resultNull()
// 向 Hook APP 抛出异常 // 向 Hook APP 抛出异常
Throwable("Fatal").throwToApp() Throwable("Fatal").throwToApp()
// 执行未经 Hook 的原始方法 // 执行未经 Hook 的原始方法并使用原始方法参数调用,泛型可略
method.invokeOriginal(...) callOriginal<Any?>()
// 执行未经 Hook 的原始方法并自定义方法参数调用,泛型可略
invokeOriginal<Any?>(...)
} }
``` ```

View File

@@ -566,7 +566,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
onAllFailureCallback?.invoke(e) onAllFailureCallback?.invoke(e)
if (onConductFailureCallback == null && onAllFailureCallback == null) onHookFailureMsg(e) if (onConductFailureCallback == null && onAllFailureCallback == null) onHookFailureMsg(e)
/** 若发生异常则会自动调用未经 Hook 的原始方法保证 Hook APP 正常运行 */ /** 若发生异常则会自动调用未经 Hook 的原始方法保证 Hook APP 正常运行 */
param.member?.also { member -> param.invokeOriginalMember(member, param.args) } assign.callOriginal()
} }
} }
} }

View File

@@ -34,6 +34,7 @@ import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreater.MemberHookCre
import com.highcapable.yukihookapi.hook.factory.classOf import com.highcapable.yukihookapi.hook.factory.classOf
import com.highcapable.yukihookapi.hook.log.yLoggerE import com.highcapable.yukihookapi.hook.log.yLoggerE
import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiHookCallback import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiHookCallback
import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiHookHelper
import java.lang.reflect.Constructor import java.lang.reflect.Constructor
import java.lang.reflect.Member import java.lang.reflect.Member
import java.lang.reflect.Method import java.lang.reflect.Method
@@ -182,11 +183,38 @@ class HookParam internal constructor(private val createrInstance: YukiMemberHook
/** /**
* 执行原始 [Member] * 执行原始 [Member]
* *
* 未进行 Hook 的 [Member] * 调用自身未进行 Hook 的原始 [Member] 并调用原始参数执行
* @param args 参数实例 * @return [Any] or null
* @return [T]
*/ */
fun <T> Member.invokeOriginal(vararg args: Any?) = param?.invokeOriginalMember(member = this, *args) as? T? fun callOriginal() = callOriginal<Any>()
/**
* 执行原始 [Member]
*
* 调用自身未进行 Hook 的原始 [Member] 并调用原始参数执行
* @return [T] or null
*/
@JvmName(name = "callOriginal_Generics")
fun <T> callOriginal() = invokeOriginal<T>(*args)
/**
* 执行原始 [Member]
*
* 调用自身未进行 Hook 的原始 [Member] 并自定义 [args] 执行
* @param args 参数实例
* @return [Any] or null
*/
fun invokeOriginal(vararg args: Any?) = invokeOriginal<Any>(*args)
/**
* 执行原始 [Member]
*
* 调用自身未进行 Hook 的原始 [Member] 并自定义 [args] 执行
* @param args 参数实例
* @return [T] or null
*/
@JvmName(name = "invokeOriginal_Generics")
fun <T> invokeOriginal(vararg args: Any?) = YukiHookHelper.invokeOriginalMember(member, instance, *args) as T?
/** /**
* 设置当前 Hook 对象方法的 [result] 返回值为 true * 设置当前 Hook 对象方法的 [result] 返回值为 true

View File

@@ -187,9 +187,6 @@ internal object YukiHookHelper {
override fun args(index: Int, value: Any?) { override fun args(index: Int, value: Any?) {
this@compat.args[index] = value this@compat.args[index] = value
} }
override fun invokeOriginalMember(member: Member, vararg args: Any?) =
YukiHookHelper.invokeOriginalMember(member, this@compat.thisObject, args)
} }
} }
@@ -308,15 +305,5 @@ internal abstract class YukiHookCallback(open val priority: Int) {
* @param value 参数对象实例 * @param value 参数对象实例
*/ */
fun args(index: Int, value: Any?) fun args(index: Int, value: Any?)
/**
* 执行原始 [Member]
*
* 未进行 Hook 的 [Member]
* @param member 实例
* @param args 参数实例
* @return [Any] or null
*/
fun invokeOriginalMember(member: Member, vararg args: Any?): Any?
} }
} }