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()
|
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*
|
||||||
|
@@ -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?>(...)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
@@ -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?
|
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user