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.
*/
@file:Suppress(
"unused", "MemberVisibilityCanBePrivate", "UnusedReceiverParameter",
"unused", "MemberVisibilityCanBePrivate", "UnusedReceiverParameter", "DeprecatedCallableAddReplaceWith",
"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.result.YukiHookResult
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.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.factory.MembersType
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.xposed.bridge.type.HookEntryType
import java.lang.reflect.Constructor
import java.lang.reflect.Field
import java.lang.reflect.Member
import java.lang.reflect.Method
@@ -154,14 +151,25 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
/**
* 注入要 Hook 的 [Method]、[Constructor]
* @param priority Hook 优先级 - 默认 [PRIORITY_DEFAULT]
* @param tag 可设置标签 - 在发生错误时方便进行调试
* @param initiate 方法体
* @return [MemberHookCreator.Result]
*/
@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) =
MemberHookCreator(priority, tag).apply(initiate).apply { preHookMembers[toString()] = this }.build()
injectMember(priority, initiate)
/**
* 允许 Hook 过程中的所有危险行为
@@ -259,9 +267,8 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
*
* 查找和处理需要 Hook 的 [Method]、[Constructor]
* @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 结果实例 */
private var result: Result? = null
@@ -416,46 +423,20 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
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)
* @param priority Hook 优先级 - 默认 [PRIORITY_DEFAULT]
* @param tag 可设置标签 - 在发生错误时方便进行调试
* @param initiate 方法体
* @return [MemberHookCreator.Result]
*
* - 此方法已弃用 - 在之后的版本中将直接被删除
*
* - 嵌套 Hook 功能已弃用
*/
@LegacyHookApi
@Deprecated(message = "嵌套 Hook 功能已弃用")
inline fun HookParam.injectMember(
priority: Int = PRIORITY_DEFAULT,
tag: String = "InnerDefault",
initiate: MemberHookCreator.() -> Unit
) = this@YukiMemberHookCreator.injectMember(priority, tag, initiate).also { this@YukiMemberHookCreator.hook() }
) = Unit
/**
* 在 [Member] 执行完成前 Hook
@@ -619,7 +600,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
onAllFailureCallback?.invoke(it)
if (isNotIgnoredHookingFailure) hookErrorMsg(it, member)
}
} ?: Throwable("Finding Error isSetUpMember [$isHookMemberSetup] [$tag]").also {
} ?: Throwable("Finding Error isSetUpMember [$isHookMemberSetup]").also {
onNoSuchMemberFailureCallback?.invoke(it)
onHookingFailureCallback?.invoke(it)
onAllFailureCallback?.invoke(it)
@@ -627,12 +608,12 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
msg = when {
hookClass.isPlaceholder ->
if (isHookMemberSetup)
"Hooked Member with a finding error [$tag]"
else "Hooked Member cannot be null [$tag]"
"Hooked Member with a finding error"
else "Hooked Member cannot be null"
else ->
if (isHookMemberSetup)
"Hooked Member with a finding error by $hookClass [$tag]"
else "Hooked Member cannot be null by $hookClass [$tag]"
"Hooked Member with a finding error by $hookClass"
else "Hooked Member cannot be null by $hookClass]"
}, e = findingThrowable ?: it
)
}
@@ -650,7 +631,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
runCatching {
replaceHookCallback?.invoke(assign).also {
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()
}
}.getOrElse {
@@ -670,7 +651,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
runCatching {
beforeHookCallback?.invoke(assign)
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()
}.onFailure {
onConductFailureCallback?.invoke(assign, it)
@@ -685,7 +666,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
HookParam.create(this@YukiMemberHookCreator, afterHookId, param).also { assign ->
runCatching {
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()
}.onFailure {
onConductFailureCallback?.invoke(assign, it)
@@ -722,8 +703,8 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
*/
private fun hookErrorMsg(e: Throwable, member: Member? = null) =
if (hookClass.isPlaceholder)
YLog.innerE("Try to hook ${member?.let { "[$it]" } ?: "nothing"} got an Exception [$tag]", e)
else YLog.innerE("Try to hook [${hookClass.instance ?: hookClass.name}]${member?.let { "[$it]" } ?: ""} 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", e)
/**
* 判断是否没有设置 Hook 过程中的任何异常拦截
@@ -738,9 +719,8 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
internal val isNotIgnoredNoSuchMemberFailure get() = onNoSuchMemberFailureCallback == null && isNotIgnoredHookingFailure
override fun toString() =
if (hookClass.isPlaceholder)
"[tag] $tag [priority] $priority [members] $members"
else "[tag] $tag [priority] $priority [class] $hookClass [members] $members"
if (hookClass.isPlaceholder) "[priority] $priority [members] $members"
else "[priority] $priority [class] $hookClass [members] $members"
/**
* Hook 方法体回调实现类
@@ -880,7 +860,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
hookedMembers.takeIf { it.isNotEmpty() }?.apply {
forEach {
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()) }
clear()

View File

@@ -94,8 +94,7 @@ abstract class MemberBaseFinder internal constructor(private val tag: String, in
* @param msg 消息内容
*/
internal fun debugMsg(msg: String) {
if (HookApiCategoryHelper.hasAvailableHookApi && hookerManager.instance != null)
YLog.innerD("$msg${hookerManager.tailTag}")
if (HookApiCategoryHelper.hasAvailableHookApi && hookerManager.instance != null) YLog.innerD(msg)
}
/**
@@ -111,7 +110,7 @@ abstract class MemberBaseFinder internal constructor(private val tag: String, in
await {
if (isIgnoreErrorLogs || hookerManager.isNotIgnoredNoSuchMemberFailure.not()) 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) }
}
}
@@ -150,12 +149,6 @@ abstract class MemberBaseFinder internal constructor(private val tag: String, in
*/
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
* @param member 当前 [Member]

View File

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