mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-06 10:45:47 +08:00
refactor: remove hook tag and remove old api usage
This commit is contained in:
@@ -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()
|
||||||
|
@@ -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]
|
||||||
|
@@ -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?")
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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?")
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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?")
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Reference in New Issue
Block a user