Fix bug in YukiMemberHookCreater.kt and added packageName in global log

This commit is contained in:
2022-05-04 05:03:16 +08:00
parent 15c35e0fed
commit 6768b5f30f
5 changed files with 58 additions and 28 deletions

View File

@@ -1,7 +1,7 @@
## YukiMemberHookCreater [class] ## YukiMemberHookCreater [class]
```kotlin ```kotlin
class YukiMemberHookCreater(private val packageParam: PackageParam, internal val hookClass: HookClass) class YukiMemberHookCreater(internal val packageParam: PackageParam, internal val hookClass: HookClass)
``` ```
**变更记录** **变更记录**
@@ -133,7 +133,7 @@ injectMember(priority = PRIORITY_HIGHEST) {
### MemberHookCreater [class] ### MemberHookCreater [class]
```kotlin ```kotlin
inner class MemberHookCreater(private val priority: Int, internal val tag: String) inner class MemberHookCreater(private val priority: Int, internal val tag: String, internal val packageName: String)
``` ```
**变更记录** **变更记录**
@@ -144,6 +144,10 @@ inner class MemberHookCreater(private val priority: Int, internal val tag: Strin
增加 `priority` Hook 优先级 增加 `priority` Hook 优先级
`v1.0.81` `修改`
增加 `packageName` 当前 Hook 的 APP 包名
**功能描述** **功能描述**
> Hook 核心功能实现类,查找和处理需要 Hook 的方法、构造类。 > Hook 核心功能实现类,查找和处理需要 Hook 的方法、构造类。

View File

@@ -35,6 +35,7 @@ import com.highcapable.yukihookapi.hook.bean.HookClass
import com.highcapable.yukihookapi.hook.core.finder.ConstructorFinder import com.highcapable.yukihookapi.hook.core.finder.ConstructorFinder
import com.highcapable.yukihookapi.hook.core.finder.FieldFinder import com.highcapable.yukihookapi.hook.core.finder.FieldFinder
import com.highcapable.yukihookapi.hook.core.finder.MethodFinder import com.highcapable.yukihookapi.hook.core.finder.MethodFinder
import com.highcapable.yukihookapi.hook.core.finder.base.BaseFinder
import com.highcapable.yukihookapi.hook.log.yLoggerE import com.highcapable.yukihookapi.hook.log.yLoggerE
import com.highcapable.yukihookapi.hook.log.yLoggerI import com.highcapable.yukihookapi.hook.log.yLoggerI
import com.highcapable.yukihookapi.hook.param.HookParam import com.highcapable.yukihookapi.hook.param.HookParam
@@ -52,7 +53,7 @@ import java.lang.reflect.Member
* @param packageParam 需要传入 [PackageParam] 实现方法调用 * @param packageParam 需要传入 [PackageParam] 实现方法调用
* @param hookClass 要 Hook 的 [HookClass] 实例 * @param hookClass 要 Hook 的 [HookClass] 实例
*/ */
class YukiMemberHookCreater(private val packageParam: PackageParam, @PublishedApi internal val hookClass: HookClass) { class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackageParam, @PublishedApi internal val hookClass: HookClass) {
/** 默认 Hook 回调优先级 */ /** 默认 Hook 回调优先级 */
val PRIORITY_DEFAULT = 50 val PRIORITY_DEFAULT = 50
@@ -98,7 +99,7 @@ class YukiMemberHookCreater(private val packageParam: PackageParam, @PublishedAp
* @return [MemberHookCreater.Result] * @return [MemberHookCreater.Result]
*/ */
inline fun injectMember(priority: Int = PRIORITY_DEFAULT, tag: String = "Default", initiate: MemberHookCreater.() -> Unit) = inline fun injectMember(priority: Int = PRIORITY_DEFAULT, tag: String = "Default", initiate: MemberHookCreater.() -> Unit) =
MemberHookCreater(priority, tag).apply(initiate).apply { preHookMembers.add(this) }.build() MemberHookCreater(priority, tag, packageParam.packageName).apply(initiate).apply { preHookMembers.add(this) }.build()
/** /**
* Hook 执行入口 * Hook 执行入口
@@ -122,7 +123,7 @@ class YukiMemberHookCreater(private val packageParam: PackageParam, @PublishedAp
} }
isDisableCreaterRunHook.not() && hookClass.instance == null -> isDisableCreaterRunHook.not() && hookClass.instance == null ->
if (onHookClassNotFoundFailureCallback == null) if (onHookClassNotFoundFailureCallback == null)
yLoggerE(msg = "HookClass [${hookClass.name}] not found", e = hookClass.throwable) yLoggerE(msg = "[${packageParam.packageName}] HookClass [${hookClass.name}] not found", e = hookClass.throwable)
else onHookClassNotFoundFailureCallback?.invoke(hookClass.throwable ?: Throwable("[${hookClass.name}] not found")) else onHookClassNotFoundFailureCallback?.invoke(hookClass.throwable ?: Throwable("[${hookClass.name}] not found"))
} }
}.start() }.start()
@@ -135,8 +136,9 @@ class YukiMemberHookCreater(private val packageParam: PackageParam, @PublishedAp
* 查找和处理需要 Hook 的方法、构造类 * 查找和处理需要 Hook 的方法、构造类
* @param priority Hook 优先级 * @param priority Hook 优先级
* @param tag 当前设置的标签 * @param tag 当前设置的标签
* @param packageName 当前 Hook 的 APP 包名
*/ */
inner class MemberHookCreater(private val priority: Int, internal val tag: String) { inner class MemberHookCreater(private val priority: Int, internal val tag: String, internal val packageName: String) {
/** [beforeHook] 回调 */ /** [beforeHook] 回调 */
private var beforeHookCallback: (HookParam.() -> Unit)? = null private var beforeHookCallback: (HookParam.() -> Unit)? = null
@@ -187,6 +189,10 @@ class YukiMemberHookCreater(private val packageParam: PackageParam, @PublishedAp
@PublishedApi @PublishedApi
internal var hookMemberMode = HookMemberMode.HOOK_CONVENTIONAL internal var hookMemberMode = HookMemberMode.HOOK_CONVENTIONAL
/** 当前的查找实例 */
@PublishedApi
internal var finder: BaseFinder? = null
/** 全部方法的名称 */ /** 全部方法的名称 */
private var allMethodsName = "" private var allMethodsName = ""
@@ -244,7 +250,7 @@ class YukiMemberHookCreater(private val packageParam: PackageParam, @PublishedAp
inline fun method(initiate: MethodFinder.() -> Unit) = try { inline fun method(initiate: MethodFinder.() -> Unit) = try {
hookMemberMode = HookMemberMode.HOOK_CONVENTIONAL hookMemberMode = HookMemberMode.HOOK_CONVENTIONAL
isHookMemberSetup = true isHookMemberSetup = true
MethodFinder(hookInstance = this, hookClass.instance).apply(initiate).build(isBind = true) MethodFinder(hookInstance = this, hookClass.instance).apply(initiate).apply { finder = this }.build(isBind = true)
} catch (e: Throwable) { } catch (e: Throwable) {
findingThrowable = e findingThrowable = e
MethodFinder(hookInstance = this).failure(e) MethodFinder(hookInstance = this).failure(e)
@@ -262,7 +268,7 @@ class YukiMemberHookCreater(private val packageParam: PackageParam, @PublishedAp
inline fun constructor(initiate: ConstructorFinder.() -> Unit = {}) = try { inline fun constructor(initiate: ConstructorFinder.() -> Unit = {}) = try {
hookMemberMode = HookMemberMode.HOOK_CONVENTIONAL hookMemberMode = HookMemberMode.HOOK_CONVENTIONAL
isHookMemberSetup = true isHookMemberSetup = true
ConstructorFinder(hookInstance = this, hookClass.instance).apply(initiate).build(isBind = true) ConstructorFinder(hookInstance = this, hookClass.instance).apply(initiate).apply { finder = this }.build(isBind = true)
} catch (e: Throwable) { } catch (e: Throwable) {
findingThrowable = e findingThrowable = e
ConstructorFinder(hookInstance = this).failure(e) ConstructorFinder(hookInstance = this).failure(e)
@@ -403,6 +409,7 @@ class YukiMemberHookCreater(private val packageParam: PackageParam, @PublishedAp
@PublishedApi @PublishedApi
internal fun hook() { internal fun hook() {
if (YukiHookBridge.hasXposedBridge.not() || isDisableMemberRunHook) return if (YukiHookBridge.hasXposedBridge.not() || isDisableMemberRunHook) return
finder?.printLogIfExist()
if (hookClass.instance == null) { if (hookClass.instance == null) {
(hookClass.throwable ?: Throwable("HookClass [${hookClass.name}] not found")).also { (hookClass.throwable ?: Throwable("HookClass [${hookClass.name}] not found")).also {
onHookingFailureCallback?.invoke(it) onHookingFailureCallback?.invoke(it)
@@ -487,13 +494,12 @@ class YukiMemberHookCreater(private val packageParam: PackageParam, @PublishedAp
onNoSuchMemberFailureCallback?.invoke(it) onNoSuchMemberFailureCallback?.invoke(it)
onHookingFailureCallback?.invoke(it) onHookingFailureCallback?.invoke(it)
onAllFailureCallback?.invoke(it) onAllFailureCallback?.invoke(it)
if (isNotIgnoredNoSuchMemberFailure) if (isNotIgnoredNoSuchMemberFailure) yLoggerE(
yLoggerE( msg = "[$packageName] " + (if (isHookMemberSetup)
msg = if (isHookMemberSetup) "Hooked Member with a finding error by $hookClass [$tag]"
"Hooked Member with a finding error by $hookClass [$tag]" else "Hooked Member cannot be non-null by $hookClass [$tag]"),
else "Hooked Member cannot be non-null by $hookClass [$tag]", e = findingThrowable ?: it
e = findingThrowable ?: it )
)
} }
else runCatching { else runCatching {
when (hookMemberMode) { when (hookMemberMode) {
@@ -525,7 +531,7 @@ class YukiMemberHookCreater(private val packageParam: PackageParam, @PublishedAp
if (isMemberNotFound) onNoSuchMemberFailureCallback?.invoke(it) if (isMemberNotFound) onNoSuchMemberFailureCallback?.invoke(it)
onAllFailureCallback?.invoke(it) onAllFailureCallback?.invoke(it)
if ((isNotIgnoredHookingFailure && isMemberNotFound.not()) || (isNotIgnoredNoSuchMemberFailure && isMemberNotFound)) if ((isNotIgnoredHookingFailure && isMemberNotFound.not()) || (isNotIgnoredNoSuchMemberFailure && isMemberNotFound))
yLoggerE(msg = "Hooked All Members with an error in Class [$hookClass] [$tag]", e = it) yLoggerE(msg = "[$packageName] Hooked All Members with an error in Class [$hookClass] [$tag]", e = it)
} }
} }
@@ -534,7 +540,7 @@ class YukiMemberHookCreater(private val packageParam: PackageParam, @PublishedAp
* @param msg 调试日志内容 * @param msg 调试日志内容
*/ */
private fun onHookLogMsg(msg: String) { private fun onHookLogMsg(msg: String) {
if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = "[${packageParam.packageName}] $msg") if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = "[$packageName] $msg")
} }
/** /**
@@ -542,7 +548,7 @@ class YukiMemberHookCreater(private val packageParam: PackageParam, @PublishedAp
* @param throwable 异常信息 * @param throwable 异常信息
*/ */
private fun onHookFailureMsg(throwable: Throwable) = private fun onHookFailureMsg(throwable: Throwable) =
yLoggerE(msg = "Try to hook ${hookClass.instance ?: hookClass.name}[$member] got an Exception [$tag]", e = throwable) yLoggerE(msg = "[$packageName] Try to hook ${hookClass.instance ?: hookClass.name}[$member] got an Exception [$tag]", e = throwable)
/** /**
* 判断是否没有设置 Hook 过程中的任何异常拦截 * 判断是否没有设置 Hook 过程中的任何异常拦截

View File

@@ -61,9 +61,6 @@ class ConstructorFinder(
/** 是否在未找到后继续在当前 [classSet] 的父类中查找 */ /** 是否在未找到后继续在当前 [classSet] 的父类中查找 */
private var isFindInSuperClass = false private var isFindInSuperClass = false
/** 是否将结果设置到目标 [YukiMemberHookCreater.MemberHookCreater] */
private var isBindToHooker = false
/** 当前重查找结果回调 */ /** 当前重查找结果回调 */
private var remedyPlansCallback: (() -> Unit)? = null private var remedyPlansCallback: (() -> Unit)? = null

View File

@@ -61,9 +61,6 @@ class MethodFinder(
/** 是否在未找到后继续在当前 [classSet] 的父类中查找 */ /** 是否在未找到后继续在当前 [classSet] 的父类中查找 */
private var isFindInSuperClass = false private var isFindInSuperClass = false
/** 是否将结果设置到目标 [YukiMemberHookCreater.MemberHookCreater] */
private var isBindToHooker = false
/** 当前重查找结果回调 */ /** 当前重查找结果回调 */
private var remedyPlansCallback: (() -> Unit)? = null private var remedyPlansCallback: (() -> Unit)? = null

View File

@@ -120,6 +120,9 @@ abstract class BaseFinder(
@PublishedApi @PublishedApi
internal var isUsingRemedyPlan = false internal var isUsingRemedyPlan = false
/** 是否将结果设置到目标 [YukiMemberHookCreater.MemberHookCreater] */
internal var isBindToHooker = false
/** 是否开启忽略错误警告功能 */ /** 是否开启忽略错误警告功能 */
internal var isShutErrorPrinting = false internal var isShutErrorPrinting = false
@@ -138,6 +141,9 @@ abstract class BaseFinder(
*/ */
internal val isNotIgnoredNoSuchMemberFailure get() = hookInstance?.isNotIgnoredNoSuchMemberFailure ?: true internal val isNotIgnoredNoSuchMemberFailure get() = hookInstance?.isNotIgnoredNoSuchMemberFailure ?: true
/** 需要输出的日志内容 */
private var loggingContent: Pair<String, Throwable?>? = null
/** /**
* 将目标类型转换为可识别的兼容类型 * 将目标类型转换为可识别的兼容类型
* @return [Class] or null * @return [Class] or null
@@ -157,21 +163,41 @@ abstract class BaseFinder(
* @param isAlwaysPrint 忽略条件每次都打印错误 * @param isAlwaysPrint 忽略条件每次都打印错误
*/ */
internal fun onFailureMsg(msg: String = "", throwable: Throwable? = null, isAlwaysPrint: Boolean = false) { internal fun onFailureMsg(msg: String = "", throwable: Throwable? = null, isAlwaysPrint: Boolean = false) {
fun print() = yLoggerE(msg = "NoSuch$tag happend in [$classSet] $msg [${hookTag}]", e = throwable) /** 创建日志 */
if (isAlwaysPrint) print() fun build() {
if (isNotIgnoredNoSuchMemberFailure && isUsingRemedyPlan.not() && isShutErrorPrinting.not())
loggingContent = Pair(msg, throwable)
}
/** 判断绑定到 Hooker 时仅创建日志 */
if (isBindToHooker) return Thread {
/** 延迟使得方法取到返回值 */
SystemClock.sleep(1)
build()
}.start()
/** 判断始终输出日志或等待结果后输出日志 */
if (isAlwaysPrint) build().run { printLogIfExist() }
else Thread { else Thread {
/** 延迟使得方法取到返回值 */ /** 延迟使得方法取到返回值 */
SystemClock.sleep(1) SystemClock.sleep(1)
if (isNotIgnoredNoSuchMemberFailure && isUsingRemedyPlan.not() && isShutErrorPrinting.not()) print() build().run { printLogIfExist() }
}.start() }.start()
} }
/** 存在日志时输出日志 */
internal fun printLogIfExist() {
if (loggingContent == null) return
yLoggerE(msg = "NoSuch$tag happend in [$classSet] ${loggingContent?.first} [${hookTag}]", e = loggingContent?.second)
/** 仅输出一次 - 然后清掉日志 */
loggingContent = null
}
/** /**
* Hook 过程中开启了 [YukiHookAPI.Configs.isDebug] 输出调试信息 * Hook 过程中开启了 [YukiHookAPI.Configs.isDebug] 输出调试信息
* @param msg 调试日志内容 * @param msg 调试日志内容
*/ */
internal fun onHookLogMsg(msg: String) { internal fun onHookLogMsg(msg: String) {
if (YukiHookAPI.Configs.isDebug && YukiHookBridge.hasXposedBridge) yLoggerI(msg = msg) if (YukiHookAPI.Configs.isDebug && YukiHookBridge.hasXposedBridge)
hookInstance?.also { yLoggerI(msg = "[${it.packageName}] $msg") } ?: yLoggerI(msg = msg)
} }
/** /**