mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
Modify change invokeOriginal function and add callOriginal function in HookParam
This commit is contained in:
@@ -355,28 +355,100 @@ args(index = 1).setTrue()
|
||||
args(index = 1).setFalse()
|
||||
```
|
||||
|
||||
### Member.invokeOriginal *- i-ext-method*
|
||||
### callOriginal *- method*
|
||||
|
||||
```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.93` `修改`
|
||||
|
||||
不再需要使用 `member.invokeOriginal` 进行调用
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 执行原始 `Member`。
|
||||
|
||||
调用自身未进行 Hook 的原始 `Member` 并自定义 `args` 执行。
|
||||
|
||||
**功能实例**
|
||||
|
||||
此方法可以 `invoke` 原始未经 Hook 的 `Member` 对象,取决于原始 `Member` 的参数和类型。
|
||||
此方法可以 `invoke` 原始未经 Hook 的 `Member` 对象,可自定义需要调用的参数内容。
|
||||
|
||||
调用自身原始的方法不会再经过当前 `beforeHook`、`afterHook` 以及 `replaceUnit`、`replaceAny`。
|
||||
|
||||
比如我们 Hook 的这个方法被这样调用 `test("test value")`,使用此方法可自定义其中的 `args` 作为参数。
|
||||
|
||||
> 示例如下
|
||||
|
||||
```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*
|
||||
|
@@ -127,8 +127,10 @@ afterHook {
|
||||
resultNull()
|
||||
// 向 Hook APP 抛出异常
|
||||
Throwable("Fatal").throwToApp()
|
||||
// 执行未经 Hook 的原始方法
|
||||
method.invokeOriginal(...)
|
||||
// 执行未经 Hook 的原始方法并使用原始方法参数调用,泛型可略
|
||||
callOriginal<Any?>()
|
||||
// 执行未经 Hook 的原始方法并自定义方法参数调用,泛型可略
|
||||
invokeOriginal<Any?>(...)
|
||||
}
|
||||
```
|
||||
|
||||
|
@@ -566,7 +566,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
onAllFailureCallback?.invoke(e)
|
||||
if (onConductFailureCallback == null && onAllFailureCallback == null) onHookFailureMsg(e)
|
||||
/** 若发生异常则会自动调用未经 Hook 的原始方法保证 Hook APP 正常运行 */
|
||||
param.member?.also { member -> param.invokeOriginalMember(member, param.args) }
|
||||
assign.callOriginal()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -34,6 +34,7 @@ import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreater.MemberHookCre
|
||||
import com.highcapable.yukihookapi.hook.factory.classOf
|
||||
import com.highcapable.yukihookapi.hook.log.yLoggerE
|
||||
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.Member
|
||||
import java.lang.reflect.Method
|
||||
@@ -182,11 +183,38 @@ class HookParam internal constructor(private val createrInstance: YukiMemberHook
|
||||
/**
|
||||
* 执行原始 [Member]
|
||||
*
|
||||
* 未进行 Hook 的 [Member]
|
||||
* @param args 参数实例
|
||||
* @return [T]
|
||||
* 调用自身未进行 Hook 的原始 [Member] 并调用原始参数执行
|
||||
* @return [Any] or null
|
||||
*/
|
||||
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
|
||||
|
@@ -187,9 +187,6 @@ internal object YukiHookHelper {
|
||||
override fun args(index: Int, value: Any?) {
|
||||
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 参数对象实例
|
||||
*/
|
||||
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?
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user