add onHookClassNotFoundFailure function and fix some bugs

This commit is contained in:
2022-03-02 02:02:30 +08:00
parent 88051fabe1
commit 3acaf7d79f

View File

@@ -29,6 +29,7 @@
package com.highcapable.yukihookapi.hook.core package com.highcapable.yukihookapi.hook.core
import android.os.SystemClock
import com.highcapable.yukihookapi.YukiHookAPI import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.annotation.DoNotUseMethod import com.highcapable.yukihookapi.annotation.DoNotUseMethod
import com.highcapable.yukihookapi.hook.bean.HookClass import com.highcapable.yukihookapi.hook.bean.HookClass
@@ -63,6 +64,9 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
/** 设置要 Hook 的方法、构造类 */ /** 设置要 Hook 的方法、构造类 */
private var hookMembers = HashMap<String, MemberHookCreater>() private var hookMembers = HashMap<String, MemberHookCreater>()
/** [hookClass] 找不到时出现的错误回调 */
private var onHookClassNotFoundFailureCallback: ((Throwable) -> Unit)? = null
/** /**
* 得到当前被 Hook 的 [Class] * 得到当前被 Hook 的 [Class]
* *
@@ -89,12 +93,20 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
* *
* - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法
* @throws IllegalStateException 如果必要参数没有被设置 * @throws IllegalStateException 如果必要参数没有被设置
* @return [Result]
*/ */
@DoNotUseMethod @DoNotUseMethod
fun hook() { fun hook(): Result {
if (!YukiHookAPI.hasXposedBridge) return if (!YukiHookAPI.hasXposedBridge) return Result()
if (hookMembers.isEmpty()) error("Hook Members is empty,hook aborted") if (hookMembers.isEmpty()) error("Hook Members is empty,hook aborted")
hookMembers.forEach { (_, member) -> member.hook() } if (hookClass.instance != null) hookMembers.forEach { (_, member) -> member.hook() }
else Thread {
SystemClock.sleep(10)
if (onHookClassNotFoundFailureCallback == null)
loggerE(msg = "HookClass [${hookClass.name}] not found", e = hookClass.throwable)
else onHookClassNotFoundFailureCallback?.invoke(hookClass.throwable ?: Throwable("[${hookClass.name}] not found"))
}.start()
return Result()
} }
/** /**
@@ -120,9 +132,6 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
/** Hook 开始时出现错误回调 */ /** Hook 开始时出现错误回调 */
private var onHookingFailureCallback: ((Throwable) -> Unit)? = null private var onHookingFailureCallback: ((Throwable) -> Unit)? = null
/** [hookClass] 找不到时出现的错误回调 */
private var onHookClassNotFoundFailureCallback: ((Throwable) -> Unit)? = null
/** 全部错误回调 */ /** 全部错误回调 */
private var onAllFailureCallback: ((Throwable) -> Unit)? = null private var onAllFailureCallback: ((Throwable) -> Unit)? = null
@@ -336,11 +345,10 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
fun hook() { fun hook() {
if (!YukiHookAPI.hasXposedBridge) return if (!YukiHookAPI.hasXposedBridge) return
if (hookClass.instance == null) { if (hookClass.instance == null) {
(hookClass.throwable ?: Throwable("Failed Hooked Class [${hookClass.name}]")).also { (hookClass.throwable ?: Throwable("HookClass [${hookClass.name}] not found")).also {
onHookClassNotFoundFailureCallback?.invoke(it)
onHookingFailureCallback?.invoke(it) onHookingFailureCallback?.invoke(it)
onAllFailureCallback?.invoke(it) onAllFailureCallback?.invoke(it)
if (isNotIgnoredHookingFailure && onHookClassNotFoundFailureCallback == null) onHookFailureMsg(it) if (isNotIgnoredHookingFailure) onHookFailureMsg(it)
} }
return return
} }
@@ -507,22 +515,6 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
*/ */
fun ignoredHookingFailure() = onHookingFailure {} fun ignoredHookingFailure() = onHookingFailure {}
/**
* 监听 [hookClass] 找不到时发生错误的回调方法
* @param initiate 回调错误
* @return [Result] 可继续向下监听
*/
fun onHookClassNotFoundFailure(initiate: (Throwable) -> Unit): Result {
onHookClassNotFoundFailureCallback = initiate
return this
}
/**
* 忽略 [hookClass] 找不到时出现的错误
* @return [Result] 可继续向下监听
*/
fun ignoredHookClassNotFoundFailure() = onHookClassNotFoundFailure {}
/** /**
* 监听全部 Hook 过程发生错误的回调方法 * 监听全部 Hook 过程发生错误的回调方法
* @param initiate 回调错误 * @param initiate 回调错误
@@ -540,4 +532,35 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
fun ignoredAllFailure() = onAllFailure {} fun ignoredAllFailure() = onAllFailure {}
} }
} }
/**
* 监听全部 Hook 结果实现类
*
* 可在这里处理失败事件监听
*/
inner class Result {
/**
* 创建监听失败事件方法体
* @param initiate 方法体
* @return [Result] 可继续向下监听
*/
fun failures(initiate: Result.() -> Unit) = apply(initiate)
/**
* 监听 [hookClass] 找不到时发生错误的回调方法
* @param initiate 回调错误
* @return [Result] 可继续向下监听
*/
fun onHookClassNotFoundFailure(initiate: (Throwable) -> Unit): Result {
onHookClassNotFoundFailureCallback = initiate
return this
}
/**
* 忽略 [hookClass] 找不到时出现的错误
* @return [Result] 可继续向下监听
*/
fun ignoredHookClassNotFoundFailure() = onHookClassNotFoundFailure {}
}
} }