Added new function on hook success callback

This commit is contained in:
2022-04-03 13:43:52 +08:00
parent 756fcff0d2
commit de402ecd7a

View File

@@ -135,6 +135,9 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
/** [replaceAny]、[replaceUnit]、[replaceTo] 等回调 */ /** [replaceAny]、[replaceUnit]、[replaceTo] 等回调 */
private var replaceHookCallback: (HookParam.() -> Any?)? = null private var replaceHookCallback: (HookParam.() -> Any?)? = null
/** Hook 成功时回调 */
private var onHookedCallback: ((Member) -> Unit)? = null
/** 找不到 [member] 出现错误回调 */ /** 找不到 [member] 出现错误回调 */
private var onNoSuchMemberFailureCallback: ((Throwable) -> Unit)? = null private var onNoSuchMemberFailureCallback: ((Throwable) -> Unit)? = null
@@ -442,8 +445,10 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
member.also { member -> member.also { member ->
runCatching { runCatching {
if (isReplaceHookMode) if (isReplaceHookMode)
XposedBridge.hookMethod(member, replaceMent) XposedBridge.hookMethod(member, replaceMent)?.hookedMethod?.also { onHookedCallback?.invoke(it) }
else XposedBridge.hookMethod(member, beforeAfterHook) ?: error("Hook Member [$member] failed")
else XposedBridge.hookMethod(member, beforeAfterHook)?.hookedMethod?.also { onHookedCallback?.invoke(it) }
?: error("Hook Member [$member] failed")
}.onFailure { }.onFailure {
onHookingFailureCallback?.invoke(it) onHookingFailureCallback?.invoke(it)
onAllFailureCallback?.invoke(it) onAllFailureCallback?.invoke(it)
@@ -466,16 +471,24 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
when (hookMemberMode) { when (hookMemberMode) {
HookMemberMode.HOOK_ALL_METHODS -> HookMemberMode.HOOK_ALL_METHODS ->
if (isReplaceHookMode) if (isReplaceHookMode)
XposedBridge.hookAllMethods(hookClass.instance, allMethodsName, replaceMent) XposedBridge.hookAllMethods(hookClass.instance, allMethodsName, replaceMent).also {
.also { if (it.size <= 0) throw NoSuchMethodError("No method name \"$allMethodsName\" matched") } if (it.isEmpty()) throw NoSuchMethodError("No method name \"$allMethodsName\" matched")
else XposedBridge.hookAllMethods(hookClass.instance, allMethodsName, beforeAfterHook) else it.forEach { e -> onHookedCallback?.invoke(e.hookedMethod) }
.also { if (it.size <= 0) throw NoSuchMethodError("No method name \"$allMethodsName\" matched") } }
else XposedBridge.hookAllMethods(hookClass.instance, allMethodsName, beforeAfterHook).also {
if (it.isEmpty()) throw NoSuchMethodError("No method name \"$allMethodsName\" matched")
else it.forEach { e -> onHookedCallback?.invoke(e.hookedMethod) }
}
HookMemberMode.HOOK_ALL_CONSTRUCTORS -> HookMemberMode.HOOK_ALL_CONSTRUCTORS ->
if (isReplaceHookMode) if (isReplaceHookMode)
XposedBridge.hookAllConstructors(hookClass.instance, replaceMent) XposedBridge.hookAllConstructors(hookClass.instance, replaceMent).also {
.also { if (it.size <= 0) throw NoSuchMethodError("No constructor matched") } if (it.isEmpty()) throw NoSuchMethodError("No constructor matched")
else XposedBridge.hookAllConstructors(hookClass.instance, beforeAfterHook) else it.forEach { e -> onHookedCallback?.invoke(e.hookedMethod) }
.also { if (it.size <= 0) throw NoSuchMethodError("No constructor matched") } }
else XposedBridge.hookAllConstructors(hookClass.instance, beforeAfterHook).also {
if (it.isEmpty()) throw NoSuchMethodError("No constructor matched")
else it.forEach { e -> onHookedCallback?.invoke(e.hookedMethod) }
}
else -> error("Hooked got a no error possible") else -> error("Hooked got a no error possible")
} }
}.onFailure { }.onFailure {
@@ -544,6 +557,18 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
return this return this
} }
/**
* 监听 [member] Hook 成功的回调方法
*
* 在首次 Hook 成功后回调
* @param initiate 回调被 Hook 的 [Member]
* @return [Result] 可继续向下监听
*/
fun onHooked(initiate: (Member) -> Unit): Result {
onHookedCallback = initiate
return this
}
/** /**
* 监听 [member] 不存在发生错误的回调方法 * 监听 [member] 不存在发生错误的回调方法
* @param initiate 回调错误 * @param initiate 回调错误