Fix invoke original member "Wrong number of arguments" problem when hooking or called original function

This commit is contained in:
2023-01-20 20:27:01 +08:00
parent 3e9f90e14b
commit ce35291435
4 changed files with 24 additions and 12 deletions

View File

@@ -113,7 +113,7 @@ internal object HookCompatHelper {
* @param args 参数实例 * @param args 参数实例
* @return [Any] or null * @return [Any] or null
*/ */
internal fun invokeOriginalMember(member: Member?, instance: Any?, vararg args: Any?): Any? { internal fun invokeOriginalMember(member: Member?, instance: Any?, args: Array<out Any?>?): Any? {
if (member == null) return null if (member == null) return null
return when (HookApiCategoryHelper.currentCategory) { return when (HookApiCategoryHelper.currentCategory) {
HookApiCategory.ROVO89_XPOSED -> XposedBridge.invokeOriginalMethod(member, instance, args) HookApiCategory.ROVO89_XPOSED -> XposedBridge.invokeOriginalMethod(member, instance, args)

View File

@@ -76,6 +76,16 @@ internal object YukiHookHelper {
} }
} }
/**
* 获取当前 [Member] 是否被 Hook
* @param member 实例
* @return [Boolean]
*/
internal fun isMemberHooked(member: Member?): Boolean {
if (member == null) return false
return HookApiCategoryHelper.hasAvailableHookApi && YukiHookCacheStore.hookedMembers.any { it.member.toString() == member.toString() }
}
/** /**
* 执行原始 [Member] * 执行原始 [Member]
* *
@@ -83,15 +93,15 @@ internal object YukiHookHelper {
* @param member 实例 * @param member 实例
* @param args 参数实例 * @param args 参数实例
* @return [Any] or null * @return [Any] or null
* @throws IllegalStateException 如果 [Member] 参数个数不正确
*/ */
internal fun invokeOriginalMember(member: Member?, instance: Any?, vararg args: Any?) = internal fun invokeOriginalMember(member: Member?, instance: Any?, args: Array<out Any?>?) =
if (HookApiCategoryHelper.hasAvailableHookApi && YukiHookCacheStore.hookedMembers.any { it.member.toString() == member.toString() }) if (isMemberHooked(member)) member?.let {
member?.let { runCatching { HookCompatHelper.invokeOriginalMember(member, instance, args) }.onFailure {
runCatching { HookCompatHelper.invokeOriginalMember(member, instance, args) } if (it.message?.lowercase()?.contains("wrong number of arguments") == true) error(it.message ?: it.toString())
.onFailure { yLoggerE(msg = "Invoke original Member [$member] failed", e = it) } yLoggerE(msg = "Invoke original Member [$member] failed", e = it)
.getOrNull() }.getOrNull()
} } else null
else null
/** /**
* 使用当前 Hook API 自带的日志功能打印日志 * 使用当前 Hook API 自带的日志功能打印日志

View File

@@ -702,8 +702,8 @@ class MethodFinder @PublishedApi internal constructor(
* @return [Any] or null * @return [Any] or null
*/ */
private fun baseCall(vararg param: Any?) = private fun baseCall(vararg param: Any?) =
if (isCallOriginal) if (isCallOriginal && YukiHookHelper.isMemberHooked(method))
method?.let { YukiHookHelper.invokeOriginalMember(it, instance, *param) ?: it.invoke(instance, *param) } YukiHookHelper.invokeOriginalMember(method, instance, param)
else method?.invoke(instance, *param) else method?.invoke(instance, *param)
/** /**

View File

@@ -87,6 +87,8 @@ class HookParam internal constructor(
*/ */
val args get() = param?.args ?: error("Current hooked Member args is null") val args get() = param?.args ?: error("Current hooked Member args is null")
//val instanceOrNull?
/** /**
* 获取当前 Hook 实例的对象 * 获取当前 Hook 实例的对象
* *
@@ -231,7 +233,7 @@ class HookParam internal constructor(
* @return [T] or null * @return [T] or null
*/ */
@JvmName(name = "invokeOriginal_Generics") @JvmName(name = "invokeOriginal_Generics")
fun <T> invokeOriginal(vararg args: Any?) = YukiHookHelper.invokeOriginalMember(member, param?.instance, *args) as T? fun <T> invokeOriginal(vararg args: Any?) = YukiHookHelper.invokeOriginalMember(member, param?.instance, args) as T?
/** /**
* 设置当前 Hook 对象方法的 [result] 返回值为 true * 设置当前 Hook 对象方法的 [result] 返回值为 true