diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiHookCreater.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiHookCreater.kt index df4f910c..484e9f87 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiHookCreater.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiHookCreater.kt @@ -318,8 +318,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl (hookClass.throwable ?: Throwable("Failed Hooked Class [${hookClass.name}]")).also { onHookingFailureCallback?.invoke(it) onAllFailureCallback?.invoke(it) - if (onHookingFailureCallback == null && onAllFailureCallback == null) - onHookFailureMsg(it) + if (isNotIgnoredHookingFailure) onHookFailureMsg(it) } return } @@ -335,8 +334,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl } catch (e: Throwable) { onConductFailureCallback?.invoke(param, e) onAllFailureCallback?.invoke(e) - if (onConductFailureCallback == null && onAllFailureCallback == null) - onHookFailureMsg(e) + if (onConductFailureCallback == null && onAllFailureCallback == null) onHookFailureMsg(e) null } } @@ -355,8 +353,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl }.onFailure { onConductFailureCallback?.invoke(param, it) onAllFailureCallback?.invoke(it) - if (onConductFailureCallback == null && onAllFailureCallback == null) - onHookFailureMsg(it) + if (onConductFailureCallback == null && onAllFailureCallback == null) onHookFailureMsg(it) } } } @@ -371,8 +368,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl }.onFailure { onConductFailureCallback?.invoke(param, it) onAllFailureCallback?.invoke(it) - if (onConductFailureCallback == null && onAllFailureCallback == null) - onHookFailureMsg(it) + if (onConductFailureCallback == null && onAllFailureCallback == null) onHookFailureMsg(it) } } } @@ -387,13 +383,13 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl }.onFailure { onHookingFailureCallback?.invoke(it) onAllFailureCallback?.invoke(it) - if (onHookingFailureCallback == null && onAllFailureCallback == null) onHookFailureMsg(it) + if (isNotIgnoredHookingFailure) onHookFailureMsg(it) } } else { onHookingFailureCallback?.invoke(Throwable()) onAllFailureCallback?.invoke(Throwable()) - if (onHookingFailureCallback == null && onAllFailureCallback == null) + if (isNotIgnoredHookingFailure) loggerE( msg = if (isHookMemberSetup) "Hooked Member with a finding error in Class [$hookClass] [$tag]" @@ -414,8 +410,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl } }.onFailure { onAllFailureCallback?.invoke(it) - if (onHookingFailureCallback == null && onAllFailureCallback == null) - loggerE(msg = "Hooked All Members with an error in Class [$hookClass] [$tag]") + if (isNotIgnoredHookingFailure) loggerE(msg = "Hooked All Members with an error in Class [$hookClass] [$tag]") } } @@ -434,6 +429,12 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl private fun onHookFailureMsg(throwable: Throwable) = loggerE(msg = "Try to hook ${hookClass.instance ?: hookClass.name}[$member] got an Exception [$tag]", e = throwable) + /** + * 判断是否没有设置 Hook 过程中的任何异常拦截 + * @return [Boolean] 没有设置任何异常拦截 + */ + internal val isNotIgnoredHookingFailure get() = onHookingFailureCallback == null && onAllFailureCallback == null + override fun toString() = "${hookClass.name}$member$tag#YukiHookAPI" /** diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/ConstructorFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/ConstructorFinder.kt index 7e5cfdfd..7bd1cffe 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/ConstructorFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/ConstructorFinder.kt @@ -29,6 +29,7 @@ package com.highcapable.yukihookapi.hook.core.finder +import android.os.SystemClock import com.highcapable.yukihookapi.annotation.DoNotUseMethod import com.highcapable.yukihookapi.hook.core.YukiHookCreater import com.highcapable.yukihookapi.hook.log.loggerE @@ -49,6 +50,9 @@ class ConstructorFinder(private val hookInstance: YukiHookCreater.MemberHookCrea /** [Constructor] 参数数组 */ private var params: Array>? = null + /** 是否使用了 [RemedyPlan] */ + private var isUsingRemedyPlan = false + /** * [Constructor] 参数 * @@ -105,9 +109,15 @@ class ConstructorFinder(private val hookInstance: YukiHookCreater.MemberHookCrea * 发生错误时输出日志 * @param msg 消息日志 * @param throwable 错误 + * @param isAlwaysPrint 忽略条件每次都打印错误 */ - private fun onFailureMsg(msg: String = "", throwable: Throwable? = null) = - loggerE(msg = "NoSuchConstructor happend in [$hookClass] $msg [${hookInstance.tag}]", e = throwable) + private fun onFailureMsg(msg: String = "", throwable: Throwable? = null, isAlwaysPrint: Boolean = false) { + Thread { + SystemClock.sleep(10) + if ((hookInstance.isNotIgnoredHookingFailure && !isUsingRemedyPlan) || isAlwaysPrint) + loggerE(msg = "NoSuchConstructor happend in [$hookClass] $msg [${hookInstance.tag}]", e = throwable) + }.start() + } /** * [Constructor] 重查找实现类 @@ -152,13 +162,14 @@ class ConstructorFinder(private val hookInstance: YukiHookCreater.MemberHookCrea return@run }.onFailure { lastError = it - onFailureMsg(msg = "trying ${p + 1} times by RemedyPlan --> $it") + onFailureMsg(msg = "trying ${p + 1} times by RemedyPlan --> $it", isAlwaysPrint = true) } } if (!isFindSuccess) { onFailureMsg( msg = "trying ${remedyPlans.size} times and all failure by RemedyPlan", - throwable = lastError + throwable = lastError, + isAlwaysPrint = true ) remedyPlans.clear() } @@ -190,6 +201,7 @@ class ConstructorFinder(private val hookInstance: YukiHookCreater.MemberHookCrea * @return [Result] 可继续向下监听 */ fun remedys(initiate: RemedyPlan.() -> Unit): Result { + isUsingRemedyPlan = true if (isNoSuch) RemedyPlan().apply(initiate).build() return this } diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt index eb325d54..4bb89c98 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt @@ -29,6 +29,7 @@ package com.highcapable.yukihookapi.hook.core.finder +import android.os.SystemClock import com.highcapable.yukihookapi.annotation.DoNotUseMethod import com.highcapable.yukihookapi.hook.core.YukiHookCreater import com.highcapable.yukihookapi.hook.log.loggerE @@ -93,7 +94,11 @@ class FieldFinder(private val hookInstance: YukiHookCreater.MemberHookCreater, p } Result() } catch (e: Throwable) { - loggerE(msg = "NoSuchField happend in [$classSet] [${hookInstance.tag}]", e = e) + Thread { + SystemClock.sleep(10) + if (hookInstance.isNotIgnoredHookingFailure) + loggerE(msg = "NoSuchField happend in [$classSet] [${hookInstance.tag}]", e = e) + }.start() Result(isNoSuch = true, e) } } diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/MethodFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/MethodFinder.kt index 0bd67dc1..fecedad6 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/MethodFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/MethodFinder.kt @@ -29,6 +29,7 @@ package com.highcapable.yukihookapi.hook.core.finder +import android.os.SystemClock import com.highcapable.yukihookapi.annotation.DoNotUseMethod import com.highcapable.yukihookapi.hook.core.YukiHookCreater import com.highcapable.yukihookapi.hook.log.loggerE @@ -49,6 +50,9 @@ class MethodFinder(private val hookInstance: YukiHookCreater.MemberHookCreater, /** [Method] 参数数组 */ private var params: Array>? = null + /** 是否使用了 [RemedyPlan] */ + private var isUsingRemedyPlan = false + /** * [Method] 名称 * @@ -123,9 +127,15 @@ class MethodFinder(private val hookInstance: YukiHookCreater.MemberHookCreater, * 发生错误时输出日志 * @param msg 消息日志 * @param throwable 错误 + * @param isAlwaysPrint 忽略条件每次都打印错误 */ - private fun onFailureMsg(msg: String = "", throwable: Throwable? = null) = - loggerE(msg = "NoSuchMethod happend in [$hookClass] $msg [${hookInstance.tag}]", e = throwable) + private fun onFailureMsg(msg: String = "", throwable: Throwable? = null, isAlwaysPrint: Boolean = false) { + Thread { + SystemClock.sleep(10) + if ((hookInstance.isNotIgnoredHookingFailure && !isUsingRemedyPlan) || isAlwaysPrint) + loggerE(msg = "NoSuchMethod happend in [$hookClass] $msg [${hookInstance.tag}]", e = throwable) + }.start() + } /** * [Method] 重查找实现类 @@ -170,13 +180,14 @@ class MethodFinder(private val hookInstance: YukiHookCreater.MemberHookCreater, return@run }.onFailure { lastError = it - onFailureMsg(msg = "trying ${p + 1} times by RemedyPlan --> $it") + onFailureMsg(msg = "trying ${p + 1} times by RemedyPlan --> $it", isAlwaysPrint = true) } } if (!isFindSuccess) { onFailureMsg( msg = "trying ${remedyPlans.size} times and all failure by RemedyPlan", - throwable = lastError + throwable = lastError, + isAlwaysPrint = true ) remedyPlans.clear() } @@ -210,6 +221,7 @@ class MethodFinder(private val hookInstance: YukiHookCreater.MemberHookCreater, * @return [Result] 可继续向下监听 */ fun remedys(initiate: RemedyPlan.() -> Unit): Result { + isUsingRemedyPlan = true if (isNoSuch) RemedyPlan().apply(initiate).build() return this }