refactor: remove hook tag and remove old api usage

This commit is contained in:
2023-10-04 02:23:25 +08:00
parent 786b2ad9ea
commit edcc17907b
5 changed files with 40 additions and 67 deletions

View File

@@ -26,7 +26,7 @@
* This file is created by fankes on 2022/2/2. * This file is created by fankes on 2022/2/2.
*/ */
@file:Suppress( @file:Suppress(
"unused", "MemberVisibilityCanBePrivate", "UnusedReceiverParameter", "unused", "MemberVisibilityCanBePrivate", "UnusedReceiverParameter", "DeprecatedCallableAddReplaceWith",
"PropertyName", "NON_PUBLIC_CALL_FROM_PUBLIC_INLINE", "OPT_IN_USAGE" "PropertyName", "NON_PUBLIC_CALL_FROM_PUBLIC_INLINE", "OPT_IN_USAGE"
) )
@@ -42,10 +42,8 @@ import com.highcapable.yukihookapi.hook.core.api.proxy.YukiMemberHook
import com.highcapable.yukihookapi.hook.core.api.proxy.YukiMemberReplacement import com.highcapable.yukihookapi.hook.core.api.proxy.YukiMemberReplacement
import com.highcapable.yukihookapi.hook.core.api.result.YukiHookResult import com.highcapable.yukihookapi.hook.core.api.result.YukiHookResult
import com.highcapable.yukihookapi.hook.core.finder.members.ConstructorFinder import com.highcapable.yukihookapi.hook.core.finder.members.ConstructorFinder
import com.highcapable.yukihookapi.hook.core.finder.members.FieldFinder
import com.highcapable.yukihookapi.hook.core.finder.members.MethodFinder import com.highcapable.yukihookapi.hook.core.finder.members.MethodFinder
import com.highcapable.yukihookapi.hook.core.finder.type.factory.ConstructorConditions import com.highcapable.yukihookapi.hook.core.finder.type.factory.ConstructorConditions
import com.highcapable.yukihookapi.hook.core.finder.type.factory.FieldConditions
import com.highcapable.yukihookapi.hook.core.finder.type.factory.MethodConditions import com.highcapable.yukihookapi.hook.core.finder.type.factory.MethodConditions
import com.highcapable.yukihookapi.hook.factory.MembersType import com.highcapable.yukihookapi.hook.factory.MembersType
import com.highcapable.yukihookapi.hook.factory.allConstructors import com.highcapable.yukihookapi.hook.factory.allConstructors
@@ -71,7 +69,6 @@ import com.highcapable.yukihookapi.hook.utils.factory.await
import com.highcapable.yukihookapi.hook.utils.factory.conditions import com.highcapable.yukihookapi.hook.utils.factory.conditions
import com.highcapable.yukihookapi.hook.xposed.bridge.type.HookEntryType import com.highcapable.yukihookapi.hook.xposed.bridge.type.HookEntryType
import java.lang.reflect.Constructor import java.lang.reflect.Constructor
import java.lang.reflect.Field
import java.lang.reflect.Member import java.lang.reflect.Member
import java.lang.reflect.Method import java.lang.reflect.Method
@@ -154,14 +151,25 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
/** /**
* 注入要 Hook 的 [Method]、[Constructor] * 注入要 Hook 的 [Method]、[Constructor]
* @param priority Hook 优先级 - 默认 [PRIORITY_DEFAULT]
* @param tag 可设置标签 - 在发生错误时方便进行调试
* @param initiate 方法体 * @param initiate 方法体
* @return [MemberHookCreator.Result] * @return [MemberHookCreator.Result]
*/ */
@LegacyHookApi @LegacyHookApi
inline fun injectMember(priority: Int = PRIORITY_DEFAULT, initiate: MemberHookCreator.() -> Unit) =
MemberHookCreator(priority).apply(initiate).apply { preHookMembers[toString()] = this }.build()
/**
* 注入要 Hook 的 [Method]、[Constructor]
*
* - 此方法已弃用 - 在之后的版本中将直接被删除
*
* - 请现在迁移到另一个 [injectMember]
* @return [MemberHookCreator.Result]
*/
@LegacyHookApi
@Deprecated(message = "请使用新方式来实现 Hook 功能", ReplaceWith("injectMember(initiate = initiate)"))
inline fun injectMember(priority: Int = PRIORITY_DEFAULT, tag: String = "Default", initiate: MemberHookCreator.() -> Unit) = inline fun injectMember(priority: Int = PRIORITY_DEFAULT, tag: String = "Default", initiate: MemberHookCreator.() -> Unit) =
MemberHookCreator(priority, tag).apply(initiate).apply { preHookMembers[toString()] = this }.build() injectMember(priority, initiate)
/** /**
* 允许 Hook 过程中的所有危险行为 * 允许 Hook 过程中的所有危险行为
@@ -259,9 +267,8 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
* *
* 查找和处理需要 Hook 的 [Method]、[Constructor] * 查找和处理需要 Hook 的 [Method]、[Constructor]
* @param priority Hook 优先级 * @param priority Hook 优先级
* @param tag 当前设置的标签
*/ */
inner class MemberHookCreator internal constructor(private val priority: Int, internal val tag: String) { inner class MemberHookCreator internal constructor(private val priority: Int) {
/** Hook 结果实例 */ /** Hook 结果实例 */
private var result: Result? = null private var result: Result? = null
@@ -416,46 +423,20 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
ConstructorFinder.fromHooker(hookInstance = this).denied(it) ConstructorFinder.fromHooker(hookInstance = this).denied(it)
} }
/**
* 使用当前 [hookClass] 查找并得到 [Field]
* @param initiate 方法体
* @return [FieldFinder.Result]
*/
inline fun HookParam.field(initiate: FieldConditions) =
if (hookClass.instance == null) FieldFinder.fromHooker(hookInstance = this@MemberHookCreator).failure(hookClass.throwable)
else FieldFinder.fromHooker(hookInstance = this@MemberHookCreator, hookClass.instance).apply(initiate).build()
/**
* 使用当前 [hookClass] 查找并得到 [Method]
* @param initiate 方法体
* @return [MethodFinder.Result]
*/
inline fun HookParam.method(initiate: MethodConditions) =
if (hookClass.instance == null) MethodFinder.fromHooker(hookInstance = this@MemberHookCreator).failure(hookClass.throwable)
else MethodFinder.fromHooker(hookInstance = this@MemberHookCreator, hookClass.instance).apply(initiate).build()
/**
* 使用当前 [hookClass] 查找并得到 [Constructor]
* @param initiate 方法体
* @return [ConstructorFinder.Result]
*/
inline fun HookParam.constructor(initiate: ConstructorConditions = { emptyParam() }) =
if (hookClass.instance == null) ConstructorFinder.fromHooker(hookInstance = this@MemberHookCreator).failure(hookClass.throwable)
else ConstructorFinder.fromHooker(hookInstance = this@MemberHookCreator, hookClass.instance).apply(initiate).build()
/** /**
* 注入要 Hook 的 [Method]、[Constructor] (嵌套 Hook) * 注入要 Hook 的 [Method]、[Constructor] (嵌套 Hook)
* @param priority Hook 优先级 - 默认 [PRIORITY_DEFAULT] *
* @param tag 可设置标签 - 在发生错误时方便进行调试 * - 此方法已弃用 - 在之后的版本中将直接被删除
* @param initiate 方法体 *
* @return [MemberHookCreator.Result] * - 嵌套 Hook 功能已弃用
*/ */
@LegacyHookApi @LegacyHookApi
@Deprecated(message = "嵌套 Hook 功能已弃用")
inline fun HookParam.injectMember( inline fun HookParam.injectMember(
priority: Int = PRIORITY_DEFAULT, priority: Int = PRIORITY_DEFAULT,
tag: String = "InnerDefault", tag: String = "InnerDefault",
initiate: MemberHookCreator.() -> Unit initiate: MemberHookCreator.() -> Unit
) = this@YukiMemberHookCreator.injectMember(priority, tag, initiate).also { this@YukiMemberHookCreator.hook() } ) = Unit
/** /**
* 在 [Member] 执行完成前 Hook * 在 [Member] 执行完成前 Hook
@@ -619,7 +600,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
onAllFailureCallback?.invoke(it) onAllFailureCallback?.invoke(it)
if (isNotIgnoredHookingFailure) hookErrorMsg(it, member) if (isNotIgnoredHookingFailure) hookErrorMsg(it, member)
} }
} ?: Throwable("Finding Error isSetUpMember [$isHookMemberSetup] [$tag]").also { } ?: Throwable("Finding Error isSetUpMember [$isHookMemberSetup]").also {
onNoSuchMemberFailureCallback?.invoke(it) onNoSuchMemberFailureCallback?.invoke(it)
onHookingFailureCallback?.invoke(it) onHookingFailureCallback?.invoke(it)
onAllFailureCallback?.invoke(it) onAllFailureCallback?.invoke(it)
@@ -627,12 +608,12 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
msg = when { msg = when {
hookClass.isPlaceholder -> hookClass.isPlaceholder ->
if (isHookMemberSetup) if (isHookMemberSetup)
"Hooked Member with a finding error [$tag]" "Hooked Member with a finding error"
else "Hooked Member cannot be null [$tag]" else "Hooked Member cannot be null"
else -> else ->
if (isHookMemberSetup) if (isHookMemberSetup)
"Hooked Member with a finding error by $hookClass [$tag]" "Hooked Member with a finding error by $hookClass"
else "Hooked Member cannot be null by $hookClass [$tag]" else "Hooked Member cannot be null by $hookClass]"
}, e = findingThrowable ?: it }, e = findingThrowable ?: it
) )
} }
@@ -650,7 +631,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
runCatching { runCatching {
replaceHookCallback?.invoke(assign).also { replaceHookCallback?.invoke(assign).also {
checkingReturnType((param.member as? Method?)?.returnType, it?.javaClass) checkingReturnType((param.member as? Method?)?.returnType, it?.javaClass)
if (replaceHookCallback != null) YLog.innerD("Replace Hook Member [${this@hook}] done [$tag]") if (replaceHookCallback != null) YLog.innerD("Replace Hook Member [${this@hook}] done")
HookParam.invoke() HookParam.invoke()
} }
}.getOrElse { }.getOrElse {
@@ -670,7 +651,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
runCatching { runCatching {
beforeHookCallback?.invoke(assign) beforeHookCallback?.invoke(assign)
checkingReturnType((param.member as? Method?)?.returnType, param.result?.javaClass) checkingReturnType((param.member as? Method?)?.returnType, param.result?.javaClass)
if (beforeHookCallback != null) YLog.innerD("Before Hook Member [${this@hook}] done [$tag]") if (beforeHookCallback != null) YLog.innerD("Before Hook Member [${this@hook}] done")
HookParam.invoke() HookParam.invoke()
}.onFailure { }.onFailure {
onConductFailureCallback?.invoke(assign, it) onConductFailureCallback?.invoke(assign, it)
@@ -685,7 +666,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
HookParam.create(this@YukiMemberHookCreator, afterHookId, param).also { assign -> HookParam.create(this@YukiMemberHookCreator, afterHookId, param).also { assign ->
runCatching { runCatching {
afterHookCallback?.invoke(assign) afterHookCallback?.invoke(assign)
if (afterHookCallback != null) YLog.innerD("After Hook Member [${this@hook}] done [$tag]") if (afterHookCallback != null) YLog.innerD("After Hook Member [${this@hook}] done")
HookParam.invoke() HookParam.invoke()
}.onFailure { }.onFailure {
onConductFailureCallback?.invoke(assign, it) onConductFailureCallback?.invoke(assign, it)
@@ -722,8 +703,8 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
*/ */
private fun hookErrorMsg(e: Throwable, member: Member? = null) = private fun hookErrorMsg(e: Throwable, member: Member? = null) =
if (hookClass.isPlaceholder) if (hookClass.isPlaceholder)
YLog.innerE("Try to hook ${member?.let { "[$it]" } ?: "nothing"} got an Exception [$tag]", e) YLog.innerE("Try to hook ${member?.let { "[$it]" } ?: "nothing"} got an Exception", e)
else YLog.innerE("Try to hook [${hookClass.instance ?: hookClass.name}]${member?.let { "[$it]" } ?: ""} got an Exception [$tag]", e) else YLog.innerE("Try to hook [${hookClass.instance ?: hookClass.name}]${member?.let { "[$it]" } ?: ""} got an Exception", e)
/** /**
* 判断是否没有设置 Hook 过程中的任何异常拦截 * 判断是否没有设置 Hook 过程中的任何异常拦截
@@ -738,9 +719,8 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
internal val isNotIgnoredNoSuchMemberFailure get() = onNoSuchMemberFailureCallback == null && isNotIgnoredHookingFailure internal val isNotIgnoredNoSuchMemberFailure get() = onNoSuchMemberFailureCallback == null && isNotIgnoredHookingFailure
override fun toString() = override fun toString() =
if (hookClass.isPlaceholder) if (hookClass.isPlaceholder) "[priority] $priority [members] $members"
"[tag] $tag [priority] $priority [members] $members" else "[priority] $priority [class] $hookClass [members] $members"
else "[tag] $tag [priority] $priority [class] $hookClass [members] $members"
/** /**
* Hook 方法体回调实现类 * Hook 方法体回调实现类
@@ -880,7 +860,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
hookedMembers.takeIf { it.isNotEmpty() }?.apply { hookedMembers.takeIf { it.isNotEmpty() }?.apply {
forEach { forEach {
it.remove() it.remove()
YLog.innerD("Remove Hooked Member [${it.member}] done [$tag]") YLog.innerD("Remove Hooked Member [${it.member}] done")
} }
runCatching { preHookMembers.remove(this@MemberHookCreator.toString()) } runCatching { preHookMembers.remove(this@MemberHookCreator.toString()) }
clear() clear()

View File

@@ -94,8 +94,7 @@ abstract class MemberBaseFinder internal constructor(private val tag: String, in
* @param msg 消息内容 * @param msg 消息内容
*/ */
internal fun debugMsg(msg: String) { internal fun debugMsg(msg: String) {
if (HookApiCategoryHelper.hasAvailableHookApi && hookerManager.instance != null) if (HookApiCategoryHelper.hasAvailableHookApi && hookerManager.instance != null) YLog.innerD(msg)
YLog.innerD("$msg${hookerManager.tailTag}")
} }
/** /**
@@ -111,7 +110,7 @@ abstract class MemberBaseFinder internal constructor(private val tag: String, in
await { await {
if (isIgnoreErrorLogs || hookerManager.isNotIgnoredNoSuchMemberFailure.not()) return@await if (isIgnoreErrorLogs || hookerManager.isNotIgnoredNoSuchMemberFailure.not()) return@await
if (isAlwaysMode.not() && isUsingRemedyPlan) return@await if (isAlwaysMode.not() && isUsingRemedyPlan) return@await
YLog.innerE("NoSuch$tag happend in [$classSet] $msg${hookerManager.tailTag}".trim(), e) YLog.innerE("NoSuch$tag happend in [$classSet] $msg".trim(), e)
es.forEachIndexed { index, e -> YLog.innerE("Throwable [${index + 1}]", e) } es.forEachIndexed { index, e -> YLog.innerE("Throwable [${index + 1}]", e) }
} }
} }
@@ -150,12 +149,6 @@ abstract class MemberBaseFinder internal constructor(private val tag: String, in
*/ */
internal val isNotIgnoredNoSuchMemberFailure get() = instance?.isNotIgnoredNoSuchMemberFailure ?: true internal val isNotIgnoredNoSuchMemberFailure get() = instance?.isNotIgnoredNoSuchMemberFailure ?: true
/**
* 获取当前日志尾部打印的 TAG 用于标识当前 Hook 实例
* @return [String]
*/
internal val tailTag get() = instance?.tag?.let { if (it.isNotBlank()) " [$it]" else "" } ?: ""
/** /**
* 绑定当前 [Member] 到当前 Hooker * 绑定当前 [Member] 到当前 Hooker
* @param member 当前 [Member] * @param member 当前 [Member]

View File

@@ -333,7 +333,7 @@ class ConstructorFinder internal constructor(override val classSet: Class<*>? =
if (isFindSuccess) return if (isFindSuccess) return
errorMsg(msg = "RemedyPlan failed after ${remedyPlans.size} attempts", es = errors, isAlwaysMode = true) errorMsg(msg = "RemedyPlan failed after ${remedyPlans.size} attempts", es = errors, isAlwaysMode = true)
remedyPlans.clear() remedyPlans.clear()
} else YLog.innerW("RemedyPlan is empty, forgot it?${hookerManager.tailTag}") } else YLog.innerW("RemedyPlan is empty, forgot it?")
} }
/** /**

View File

@@ -282,7 +282,7 @@ class FieldFinder internal constructor(override val classSet: Class<*>? = null)
if (isFindSuccess) return if (isFindSuccess) return
errorMsg(msg = "RemedyPlan failed after ${remedyPlans.size} attempts", es = errors, isAlwaysMode = true) errorMsg(msg = "RemedyPlan failed after ${remedyPlans.size} attempts", es = errors, isAlwaysMode = true)
remedyPlans.clear() remedyPlans.clear()
} else YLog.innerW("RemedyPlan is empty, forgot it?${hookerManager.tailTag}") } else YLog.innerW("RemedyPlan is empty, forgot it?")
} }
/** /**

View File

@@ -427,7 +427,7 @@ class MethodFinder internal constructor(override val classSet: Class<*>? = null)
if (isFindSuccess) return if (isFindSuccess) return
errorMsg(msg = "RemedyPlan failed after ${remedyPlans.size} attempts", es = errors, isAlwaysMode = true) errorMsg(msg = "RemedyPlan failed after ${remedyPlans.size} attempts", es = errors, isAlwaysMode = true)
remedyPlans.clear() remedyPlans.clear()
} else YLog.innerW("RemedyPlan is empty, forgot it?${hookerManager.tailTag}") } else YLog.innerW("RemedyPlan is empty, forgot it?")
} }
/** /**