mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-05 18:25:28 +08:00
refactor: merge hook priority to YukiHookPriority
This commit is contained in:
@@ -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 {
|
||||||
|
@@ -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,
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user