refactor: merge hook priority to YukiHookPriority

This commit is contained in:
2023-10-04 03:07:50 +08:00
parent fa24de805a
commit d04b9a5211
3 changed files with 84 additions and 44 deletions

View File

@@ -87,28 +87,51 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
* 创建 [YukiMemberHookCreator.MemberHookCreator] * 创建 [YukiMemberHookCreator.MemberHookCreator]
* @param packageParam 需要传入 [PackageParam] 实现方法调用 * @param packageParam 需要传入 [PackageParam] 实现方法调用
* @param members 要指定的 [Member] 数组 * @param members 要指定的 [Member] 数组
* @param priority Hook 优先级
* @param initiate 方法体 * @param initiate 方法体
* @return [YukiMemberHookCreator.MemberHookCreator.Result] * @return [YukiMemberHookCreator.MemberHookCreator.Result]
*/ */
internal inline fun createMemberHook( internal inline fun createMemberHook(
packageParam: PackageParam, packageParam: PackageParam,
members: List<Member>, members: List<Member>,
priority: YukiHookPriority,
initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit
): YukiMemberHookCreator.MemberHookCreator.Result { ): YukiMemberHookCreator.MemberHookCreator.Result {
val creator = YukiMemberHookCreator(packageParam, HookClass.createPlaceholder()) val creator = YukiMemberHookCreator(packageParam, HookClass.createPlaceholder())
val result = creator.injectMember { if (members.isNotEmpty()) members(*members.toTypedArray()); apply(initiate) } val result = creator.injectMember(priority) { if (members.isNotEmpty()) members(*members.toTypedArray()); apply(initiate) }
creator.hook() creator.hook()
return result return result
} }
} }
/** 默认 Hook 回调优先级 */ /**
* 默认 Hook 回调优先级
*
* - 此方法已弃用 - 在之后的版本中将直接被删除
*
* - 请现在迁移到 [YukiHookPriority]
*/
@Deprecated(message = "请使用新方式来实现此功能")
val PRIORITY_DEFAULT = 0x0 val PRIORITY_DEFAULT = 0x0
/** 延迟回调 Hook 方法结果 */ /**
* 延迟回调 Hook 方法结果
*
* - 此方法已弃用 - 在之后的版本中将直接被删除
*
* - 请现在迁移到 [YukiHookPriority]
*/
@Deprecated(message = "请使用新方式来实现此功能")
val PRIORITY_LOWEST = 0x1 val PRIORITY_LOWEST = 0x1
/** 更快回调 Hook 方法结果 */ /**
* 更快回调 Hook 方法结果
*
* - 此方法已弃用 - 在之后的版本中将直接被删除
*
* - 请现在迁移到 [YukiHookPriority]
*/
@Deprecated(message = "请使用新方式来实现此功能")
val PRIORITY_HIGHEST = 0x2 val PRIORITY_HIGHEST = 0x2
/** Hook 操作选项内容 */ /** Hook 操作选项内容 */
@@ -151,11 +174,12 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
/** /**
* 注入要 Hook 的 [Method]、[Constructor] * 注入要 Hook 的 [Method]、[Constructor]
* @param priority Hook 优先级 - 默认为 [YukiHookPriority.DEFAULT]
* @param initiate 方法体 * @param initiate 方法体
* @return [MemberHookCreator.Result] * @return [MemberHookCreator.Result]
*/ */
@LegacyHookApi @LegacyHookApi
inline fun injectMember(priority: Int = PRIORITY_DEFAULT, initiate: MemberHookCreator.() -> Unit) = inline fun injectMember(priority: YukiHookPriority = YukiHookPriority.DEFAULT, initiate: MemberHookCreator.() -> Unit) =
MemberHookCreator(priority).apply(initiate).apply { preHookMembers[toString()] = this }.build() MemberHookCreator(priority).apply(initiate).apply { preHookMembers[toString()] = this }.build()
/** /**
@@ -166,10 +190,11 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
* - 请现在迁移到另一个 [injectMember] * - 请现在迁移到另一个 [injectMember]
* @return [MemberHookCreator.Result] * @return [MemberHookCreator.Result]
*/ */
@Suppress("DEPRECATION")
@LegacyHookApi @LegacyHookApi
@Deprecated(message = "请使用新方式来实现 Hook 功能", ReplaceWith("injectMember(initiate = initiate)")) @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) =
injectMember(priority, initiate) injectMember(initiate = initiate)
/** /**
* 允许 Hook 过程中的所有危险行为 * 允许 Hook 过程中的所有危险行为
@@ -250,25 +275,13 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
} }
} }
/**
* 转换到 [YukiHookPriority] 优先级
* @return [YukiHookPriority]
* @throws IllegalStateException 如果优先级不为 [PRIORITY_DEFAULT]、[PRIORITY_LOWEST]、[PRIORITY_HIGHEST]
*/
private fun Int.toPriority() = when (this) {
PRIORITY_DEFAULT -> YukiHookPriority.DEFAULT
PRIORITY_LOWEST -> YukiHookPriority.LOWEST
PRIORITY_HIGHEST -> YukiHookPriority.HIGHEST
else -> error("Invalid Hook Priority $this")
}
/** /**
* Hook 核心功能实现类 * Hook 核心功能实现类
* *
* 查找和处理需要 Hook 的 [Method]、[Constructor] * 查找和处理需要 Hook 的 [Method]、[Constructor]
* @param priority Hook 优先级 * @param priority Hook 优先级
*/ */
inner class MemberHookCreator internal constructor(private val priority: Int) { inner class MemberHookCreator internal constructor(private val priority: YukiHookPriority) {
/** Hook 结果实例 */ /** Hook 结果实例 */
private var result: Result? = null private var result: Result? = null
@@ -430,6 +443,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
* *
* - 嵌套 Hook 功能已弃用 * - 嵌套 Hook 功能已弃用
*/ */
@Suppress("DEPRECATION")
@LegacyHookApi @LegacyHookApi
@Deprecated(message = "嵌套 Hook 功能已弃用") @Deprecated(message = "嵌套 Hook 功能已弃用")
inline fun HookParam.injectMember( inline fun HookParam.injectMember(
@@ -625,7 +639,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
*/ */
private fun Member.hook(): YukiHookResult { private fun Member.hook(): YukiHookResult {
/** 定义替换 Hook 回调方法体 */ /** 定义替换 Hook 回调方法体 */
val replaceMent = object : YukiMemberReplacement(priority.toPriority()) { val replaceMent = object : YukiMemberReplacement(priority) {
override fun replaceHookedMember(param: Param) = override fun replaceHookedMember(param: Param) =
HookParam.create(this@YukiMemberHookCreator, replaceHookId, param).let { assign -> HookParam.create(this@YukiMemberHookCreator, replaceHookId, param).let { assign ->
runCatching { runCatching {
@@ -645,7 +659,7 @@ class YukiMemberHookCreator internal constructor(private val packageParam: Packa
} }
/** 定义前后 Hook 回调方法体 */ /** 定义前后 Hook 回调方法体 */
val beforeAfterHook = object : YukiMemberHook(priority.toPriority()) { val beforeAfterHook = object : YukiMemberHook(priority) {
override fun beforeHookedMember(param: Param) { override fun beforeHookedMember(param: Param) {
HookParam.create(this@YukiMemberHookCreator, beforeHookId, param).also { assign -> HookParam.create(this@YukiMemberHookCreator, beforeHookId, param).also { assign ->
runCatching { runCatching {

View File

@@ -30,7 +30,7 @@ package com.highcapable.yukihookapi.hook.core.api.priority
/** /**
* Hook 回调优先级配置类 * Hook 回调优先级配置类
*/ */
internal enum class YukiHookPriority { enum class YukiHookPriority {
/** 默认 Hook 回调优先级 */ /** 默认 Hook 回调优先级 */
DEFAULT, DEFAULT,

View File

@@ -43,6 +43,7 @@ import com.highcapable.yukihookapi.hook.bean.HookResources
import com.highcapable.yukihookapi.hook.bean.VariousClass import com.highcapable.yukihookapi.hook.bean.VariousClass
import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator import com.highcapable.yukihookapi.hook.core.YukiMemberHookCreator
import com.highcapable.yukihookapi.hook.core.YukiResourcesHookCreator import com.highcapable.yukihookapi.hook.core.YukiResourcesHookCreator
import com.highcapable.yukihookapi.hook.core.api.priority.YukiHookPriority
import com.highcapable.yukihookapi.hook.core.finder.base.BaseFinder import com.highcapable.yukihookapi.hook.core.finder.base.BaseFinder
import com.highcapable.yukihookapi.hook.core.finder.classes.DexClassFinder import com.highcapable.yukihookapi.hook.core.finder.classes.DexClassFinder
import com.highcapable.yukihookapi.hook.core.finder.members.ConstructorFinder import com.highcapable.yukihookapi.hook.core.finder.members.ConstructorFinder
@@ -643,83 +644,108 @@ open class PackageParam internal constructor(internal var wrapper: PackageParamW
* 直接 Hook 方法、构造方法 * 直接 Hook 方法、构造方法
* *
* - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API * - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API
* @param priority Hook 优先级 - 默认为 [YukiHookPriority.DEFAULT]
* @param initiate 方法体 * @param initiate 方法体
* @return [YukiMemberHookCreator.MemberHookCreator.Result] * @return [YukiMemberHookCreator.MemberHookCreator.Result]
*/ */
inline fun Member.hook(initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit) = listOf(this).baseHook(initiate) inline fun Member.hook(
priority: YukiHookPriority = YukiHookPriority.DEFAULT,
initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit
) = listOf(this).baseHook(priority, initiate)
/** /**
* 通过 [BaseFinder.BaseResult] 直接 Hook 方法、构造方法 * 通过 [BaseFinder.BaseResult] 直接 Hook 方法、构造方法
* *
* - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API * - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API
* @param priority Hook 优先级 - 默认为 [YukiHookPriority.DEFAULT]
* @param initiate 方法体 * @param initiate 方法体
* @return [YukiMemberHookCreator.MemberHookCreator.Result] * @return [YukiMemberHookCreator.MemberHookCreator.Result]
*/ */
inline fun BaseFinder.BaseResult.hook(initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit) = baseHook(isMultiple = false, initiate) inline fun BaseFinder.BaseResult.hook(
priority: YukiHookPriority = YukiHookPriority.DEFAULT,
initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit
) = baseHook(isMultiple = false, priority, initiate)
/** /**
* 直接 Hook 方法、构造方法 (批量) * 直接 Hook 方法、构造方法 (批量)
* *
* - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API * - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API
* @param priority Hook 优先级 - 默认为 [YukiHookPriority.DEFAULT]
* @param initiate 方法体 * @param initiate 方法体
* @return [YukiMemberHookCreator.MemberHookCreator.Result] * @return [YukiMemberHookCreator.MemberHookCreator.Result]
*/ */
inline fun Array<Member>.hookAll(initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit) = toList().baseHook(initiate) inline fun Array<Member>.hookAll(
priority: YukiHookPriority = YukiHookPriority.DEFAULT,
initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit
) = toList().baseHook(priority, initiate)
/** /**
* 直接 Hook 方法、构造方法 (批量) * 直接 Hook 方法、构造方法 (批量)
* *
* - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API * - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API
* @param priority Hook 优先级 - 默认为 [YukiHookPriority.DEFAULT]
* @param initiate 方法体 * @param initiate 方法体
* @return [YukiMemberHookCreator.MemberHookCreator.Result] * @return [YukiMemberHookCreator.MemberHookCreator.Result]
*/ */
inline fun List<Member>.hookAll(initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit) = baseHook(initiate) inline fun List<Member>.hookAll(
priority: YukiHookPriority = YukiHookPriority.DEFAULT,
initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit
) = baseHook(priority, initiate)
/** /**
* 通过 [BaseFinder.BaseResult] 直接 Hook 方法、构造方法 (批量) * 通过 [BaseFinder.BaseResult] 直接 Hook 方法、构造方法 (批量)
* *
* - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API * - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API
* @param priority Hook 优先级 - 默认为 [YukiHookPriority.DEFAULT]
* @param initiate 方法体 * @param initiate 方法体
* @return [YukiMemberHookCreator.MemberHookCreator.Result] * @return [YukiMemberHookCreator.MemberHookCreator.Result]
*/ */
inline fun BaseFinder.BaseResult.hookAll(initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit) = baseHook(isMultiple = true, initiate) inline fun BaseFinder.BaseResult.hookAll(
priority: YukiHookPriority = YukiHookPriority.DEFAULT,
initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit
) = baseHook(isMultiple = true, priority, initiate)
/** /**
* 通过 [BaseFinder.BaseResult] 直接 Hook 方法、构造方法 * 通过 [BaseFinder.BaseResult] 直接 Hook 方法、构造方法
* *
* - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API * - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API
* @param isMultiple 是否为多重查找 * @param isMultiple 是否为多重查找
* @param priority Hook 优先级
* @param initiate 方法体 * @param initiate 方法体
* @return [YukiMemberHookCreator.MemberHookCreator.Result] * @return [YukiMemberHookCreator.MemberHookCreator.Result]
*/ */
private inline fun BaseFinder.BaseResult.baseHook(isMultiple: Boolean, initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit) = private inline fun BaseFinder.BaseResult.baseHook(
when (this) { isMultiple: Boolean,
is DexClassFinder.Result -> priority: YukiHookPriority,
error("Use of searchClass { ... }.hook { ... } is an error, please use like searchClass { ... }.get()?.hook { ... }") initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit
is ConstructorFinder.Result -> { ) = when (this) {
val members = if (isMultiple) giveAll() is DexClassFinder.Result ->
else mutableListOf<Member>().also { give()?.also { e -> it.add(e) } } error("Use of searchClass { ... }.hook { ... } is an error, please use like searchClass { ... }.get()?.hook { ... }")
YukiMemberHookCreator.createMemberHook(packageParam = this@PackageParam, members, initiate) is ConstructorFinder.Result -> {
} val members = if (isMultiple) giveAll()
is MethodFinder.Result -> { else mutableListOf<Member>().also { give()?.also { e -> it.add(e) } }
val members = if (isMultiple) giveAll() YukiMemberHookCreator.createMemberHook(packageParam = this@PackageParam, members, priority, initiate)
else mutableListOf<Member>().also { give()?.also { e -> it.add(e) } }
YukiMemberHookCreator.createMemberHook(packageParam = this@PackageParam, members, initiate)
}
else -> error("This type [$this] not support to hook, supported are Constructors and Methods")
} }
is MethodFinder.Result -> {
val members = if (isMultiple) giveAll()
else mutableListOf<Member>().also { give()?.also { e -> it.add(e) } }
YukiMemberHookCreator.createMemberHook(packageParam = this@PackageParam, members, priority, initiate)
}
else -> error("This type [$this] not support to hook, supported are Constructors and Methods")
}
/** /**
* 直接 Hook 方法、构造方法 * 直接 Hook 方法、构造方法
* *
* - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API * - 此功能尚在试验阶段 - 在 1.x.x 版本将暂定于此 - 在 2.x.x 版本将完全合并到新 API
* @param priority Hook 优先级
* @param initiate 方法体 * @param initiate 方法体
* @return [YukiMemberHookCreator.MemberHookCreator.Result] * @return [YukiMemberHookCreator.MemberHookCreator.Result]
*/ */
private inline fun List<Member>.baseHook(initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit) = private inline fun List<Member>.baseHook(priority: YukiHookPriority, initiate: YukiMemberHookCreator.MemberHookCreator.() -> Unit) =
YukiMemberHookCreator.createMemberHook(packageParam = this@PackageParam, onEach { YukiMemberHookCreator.createMemberHook(packageParam = this@PackageParam, onEach {
if (it !is Constructor<*> && it !is Method) error("This type [$it] not support to hook, supported are Constructors and Methods") if (it !is Constructor<*> && it !is Method) error("This type [$it] not support to hook, supported are Constructors and Methods")
}, initiate) }, priority, initiate)
/** /**
* Hook APP 的 Resources * Hook APP 的 Resources