Modify change hooking callback delegate parameter to fix effective immediately function in HookCompatHelper, YukiHookDelegateFactory

This commit is contained in:
2023-01-31 20:39:05 +08:00
parent c0855e089c
commit 686bcdb674
2 changed files with 36 additions and 38 deletions

View File

@@ -48,7 +48,11 @@ internal object HookCompatHelper {
* 兼容对接已 Hook 的 [Member] 接口 * 兼容对接已 Hook 的 [Member] 接口
* @return [YukiMemberHook.HookedMember] * @return [YukiMemberHook.HookedMember]
*/ */
private fun XC_MethodHook.Unhook.compat() = YukiHookCallbackDelegate.createHookedMemberCallback(hookedMethod) { unhook() } private fun XC_MethodHook.Unhook.compat() =
YukiHookCallbackDelegate.createHookedMemberCallback(
member = { hookedMethod },
onRemove = { unhook() }
)
/** /**
* [HookApiCategory.ROVO89_XPOSED] * [HookApiCategory.ROVO89_XPOSED]
@@ -58,14 +62,12 @@ internal object HookCompatHelper {
*/ */
private fun XC_MethodHook.MethodHookParam.compat() = private fun XC_MethodHook.MethodHookParam.compat() =
YukiHookCallbackDelegate.createParamCallback( YukiHookCallbackDelegate.createParamCallback(
member = method, member = { method },
instance = thisObject, instance = { thisObject },
args = args, args = { args },
hasThrowable = hasThrowable(), hasThrowable = { hasThrowable() },
resultCallback = { result = it }, result = { it, assign -> if (assign) result = it; result },
throwableCallback = { throwable = it }, throwable = { it, assign -> if (assign) throwable = it; throwable }
result = result,
throwable = throwable
) )
/** /**

View File

@@ -40,54 +40,50 @@ internal object YukiHookCallbackDelegate {
/** /**
* 创建 [YukiMemberHook.HookedMember] 实例 * 创建 [YukiMemberHook.HookedMember] 实例
* @param member 当前 [Member] * @param member [Member] 实例 (代理回调)
* @param removeCallback 回调解除 Hook 事件 * @param onRemove 回调解除 Hook 事件 (代理回调)
* @return [YukiMemberHook.HookedMember] * @return [YukiMemberHook.HookedMember]
*/ */
internal fun createHookedMemberCallback(member: Member, removeCallback: () -> Unit) = internal fun createHookedMemberCallback(member: () -> Member?, onRemove: () -> Unit) =
object : YukiMemberHook.HookedMember() { object : YukiMemberHook.HookedMember() {
override val member get() = member override val member get() = member()
override fun remove() { override fun remove() {
removeCallback() onRemove()
runCatching { YukiHookCacheStore.hookedMembers.remove(this) } runCatching { YukiHookCacheStore.hookedMembers.remove(this) }
} }
} }
/** /**
* 创建 [YukiHookCallback.Param] 实例 * 创建 [YukiHookCallback.Param] 实例
* @param member [Member] 实例 * @param member [Member] 实例 (代理回调)
* @param instance 当前实例对象 * @param instance 当前实例对象 (代理回调)
* @param args 方法、构造方法数组 * @param args 方法、构造方法数组 (代理回调)
* @param hasThrowable 是否存在设置过的方法调用抛出异常 * @param hasThrowable 是否存在设置过的方法调用抛出异常 (代理回调)
* @param resultCallback 回调设置当前 Hook 方法返回值 (结果) * @param result 当前 Hook 方法返回值 (结果) (代理回调)
* @param throwableCallback 回调设置当前 Hook 方法调用抛出的异常 * @param throwable 当前 Hook 方法调用抛出的异常 (代理回调)
* @param result 当前 Hook 方法返回值 (结果)
* @param throwable 当前 Hook 方法调用抛出的异常
* @return [YukiHookCallback.Param] * @return [YukiHookCallback.Param]
*/ */
internal fun createParamCallback( internal fun createParamCallback(
member: Member?, member: () -> Member?,
instance: Any?, instance: () -> Any?,
args: Array<Any?>?, args: () -> Array<Any?>?,
hasThrowable: Boolean, hasThrowable: () -> Boolean,
resultCallback: (Any?) -> Unit, result: (Any?, Boolean) -> Any?,
throwableCallback: (Throwable?) -> Unit, throwable: (Throwable?, Boolean) -> Throwable?
result: Any?,
throwable: Throwable?
) = object : YukiHookCallback.Param { ) = object : YukiHookCallback.Param {
override val member get() = member override val member get() = member()
override val instance get() = instance override val instance get() = instance()
override val args get() = args override val args get() = args()
override val hasThrowable get() = hasThrowable override val hasThrowable get() = hasThrowable()
override var result override var result
get() = result get() = result(null, false)
set(value) { set(value) {
resultCallback(value) result(value, true)
} }
override var throwable override var throwable
get() = throwable get() = throwable(null, false)
set(value) { set(value) {
throwableCallback(value) throwable(value, true)
} }
} }
} }