From c93e6a563e0b6550543d6467a4943cff8bd8b1a8 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Sun, 28 Aug 2022 22:39:45 +0800 Subject: [PATCH] Modify move Result to Process for Hooker in MethodFinder, ConstructorFinder and YukiMemberHookCreater --- docs/api/public/ConstructorFinder.md | 111 +++++++++++++++- docs/api/public/MethodFinder.md | 111 +++++++++++++++- docs/api/public/YukiMemberHookCreater.md | 56 ++++---- .../hook/core/YukiMemberHookCreater.kt | 81 ++++++------ .../hook/core/finder/ConstructorFinder.kt | 122 ++++++++++++----- .../hook/core/finder/FieldFinder.kt | 23 +--- .../hook/core/finder/MethodFinder.kt | 123 +++++++++++++----- .../hook/core/finder/base/BaseFinder.kt | 28 +++- 8 files changed, 506 insertions(+), 149 deletions(-) diff --git a/docs/api/public/ConstructorFinder.md b/docs/api/public/ConstructorFinder.md index 7da2c43d..23329d6e 100644 --- a/docs/api/public/ConstructorFinder.md +++ b/docs/api/public/ConstructorFinder.md @@ -228,6 +228,115 @@ constructor { } ``` +### Process *- class* + +```kotlin +inner class Process internal constructor(internal val isNoSuch: Boolean, internal val throwable: Throwable?) : BaseResult +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> `Constructor` 查找结果处理类,为 `hookInstance` 提供。 + +#### result *- method* + +```kotlin +inline fun result(initiate: Process.() -> Unit): Process +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 创建监听结果事件方法体。 + +**功能示例** + +你可以使用 `lambda` 形式创建 `Result` 类。 + +> 示例如下 + +```kotlin +constructor { + // Your code here. +}.result { + all() + remedys {} + onNoSuchConstructor {} +} +``` + +#### all *- method* + +```kotlin +fun all(): Process +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 设置全部查询条件匹配的多个 `Constructor` 实例结果到 `hookInstance`。 + +#### remedys *- method* + +```kotlin +inline fun remedys(initiate: RemedyPlan.() -> Unit): Result +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 创建 `Constructor` 重查找功能。 + +**功能示例** + +当你遇到一种 `Constructor` 可能存在不同形式的存在时,可以使用 `RemedyPlan` 重新查找它,而没有必要使用 `onNoSuchConstructor` 捕获异常二次查找 `Constructor`。 + +若第一次查找失败了,你还可以在这里继续添加此方法体直到成功为止。 + +> 示例如下 + +```kotlin +constructor { + // Your code here. +}.remedys { + constructor { + // Your code here. + } + constructor { + // Your code here. + } +} +``` + +#### onNoSuchConstructor *- method* + +```kotlin +inline fun onNoSuchConstructor(result: (Throwable) -> Unit): Result +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 监听找不到 `Constructor` 时。 + +只会返回第一次的错误信息,不会返回 `RemedyPlan` 的错误信息。 + ### Result *- class* ```kotlin @@ -345,7 +454,7 @@ fun all(): ArrayList > 获得 `Constructor` 实例处理类数组。 -返回全部查询条件匹配的多个 `Constructor` 实例结果并在 `isBindToHooker` 时设置到 `hookInstance`。 +返回全部查询条件匹配的多个 `Constructor` 实例结果。 **功能示例** diff --git a/docs/api/public/MethodFinder.md b/docs/api/public/MethodFinder.md index 033466c0..6a383631 100644 --- a/docs/api/public/MethodFinder.md +++ b/docs/api/public/MethodFinder.md @@ -330,6 +330,115 @@ method { } ``` +### Process *- class* + +```kotlin +inner class Process internal constructor(internal val isNoSuch: Boolean, internal val throwable: Throwable?) : BaseResult +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> `Method` 查找结果处理类,为 `hookInstance` 提供。 + +#### result *- method* + +```kotlin +inline fun result(initiate: Process.() -> Unit): Process +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 创建监听结果事件方法体。 + +**功能示例** + +你可以使用 `lambda` 形式创建 `Result` 类。 + +> 示例如下 + +```kotlin +method { + // Your code here. +}.result { + all() + remedys {} + onNoSuchMethod {} +} +``` + +#### all *- method* + +```kotlin +fun all(): Process +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 设置全部查询条件匹配的多个 `Method` 实例结果到 `hookInstance`。 + +#### remedys *- method* + +```kotlin +inline fun remedys(initiate: RemedyPlan.() -> Unit): Result +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 创建 `Method` 重查找功能。 + +**功能示例** + +当你遇到一种 `Method` 可能存在不同形式的存在时,可以使用 `RemedyPlan` 重新查找它,而没有必要使用 `onNoSuchMethod` 捕获异常二次查找 `Method`。 + +若第一次查找失败了,你还可以在这里继续添加此方法体直到成功为止。 + +> 示例如下 + +```kotlin +method { + // Your code here. +}.remedys { + method { + // Your code here. + } + method { + // Your code here. + } +} +``` + +#### onNoSuchMethod *- method* + +```kotlin +inline fun onNoSuchMethod(result: (Throwable) -> Unit): Result +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 监听找不到 `Method` 时。 + +只会返回第一次的错误信息,不会返回 `RemedyPlan` 的错误信息。 + ### Result *- class* ```kotlin @@ -437,7 +546,7 @@ fun all(instance: Any?): ArrayList > 获得 `Method` 实例处理类数组。 -返回全部查询条件匹配的多个 `Method` 实例结果并在 `isBindToHooker` 时设置到 `hookInstance`。 +返回全部查询条件匹配的多个 `Method` 实例结果。 **功能示例** diff --git a/docs/api/public/YukiMemberHookCreater.md b/docs/api/public/YukiMemberHookCreater.md index 75d25536..9ab9016d 100644 --- a/docs/api/public/YukiMemberHookCreater.md +++ b/docs/api/public/YukiMemberHookCreater.md @@ -96,11 +96,11 @@ inline fun injectMember(priority: Int, tag: String, initiate: MemberHookCreater. **功能描述** -> 注入要 Hook 的方法、构造方法。 +> 注入要 Hook 的 `Method`、`Constructor`。 **功能示例** -你可以注入任意方法与构造方法,使用 `injectMember` 即可创建一个 `Hook` 对象。 +你可以注入任意 `Method` 与 `Constructor`,使用 `injectMember` 即可创建一个 `Hook` 对象。 > 示例如下 @@ -176,7 +176,7 @@ inner class MemberHookCreater internal constructor(private val priority: Int, in **功能描述** -> Hook 核心功能实现类,查找和处理需要 Hook 的方法、构造方法。 +> Hook 核心功能实现类,查找和处理需要 Hook 的 `Method`、`Constructor`。 #### ~~member *- field*~~ @@ -200,13 +200,13 @@ fun members(vararg member: Member?) **功能描述** -> 手动指定要 Hook 的方法、构造方法。 +> 手动指定要 Hook 的 `Method`、`Constructor`。 !> 不建议使用此方法设置目标需要 Hook 的 `Member` 对象,你可以使用 `method` 或 `constructor` 方法。 **功能示例** -你可以调用 `instanceClass` 来手动查询要 Hook 的方法。 +你可以调用 `instanceClass` 来手动查询要 Hook 的 `Method`、`Constructor`。 > 示例如下 @@ -218,7 +218,7 @@ injectMember { } ``` -同样地,你也可以传入一组方法同时进行 Hook。 +同样地,你也可以传入一组 `Member` 同时进行 Hook。 > 示例如下 @@ -266,9 +266,9 @@ fun allMembers(type: MembersType) **功能描述** -> 查找并 Hook `hookClass` 中的全部方法、构造方法。 +> 查找并 Hook `hookClass` 中的全部 `Method`、`Constructor`。 -!> 警告:无法准确处理每个方法的返回值和 `param`,建议使用 `method` or `constructor` 对每个方法单独 Hook。 +!> 警告:无法准确处理每个 `Member` 的返回值和 `param`,建议使用 `method` or `constructor` 对每个 `Member` 单独 Hook。 #### method *- method* @@ -286,7 +286,7 @@ inline fun method(initiate: MethodCondition): MethodFinder.Result **功能描述** -> 查找当前 `Class` 需要 Hook 的方法。 +> 查找当前 `Class` 需要 Hook 的 `Method` 。 **功能示例** @@ -341,7 +341,7 @@ inline fun constructor(initiate: ConstructorCondition): ConstructorFinder.Result **功能描述** -> 查找当前 `Class` 需要 Hook 的构造方法。 +> 查找当前 `Class` 需要 Hook 的 `Constructor`。 **功能示例** @@ -389,7 +389,7 @@ inline fun HookParam.field(initiate: FieldCondition): FieldFinder.Result **功能描述** -> 使用当前 `instanceClass` 查找并得到 `Field`。 +> 使用当前 `hookClass` 查找并得到 `Field`。 **功能示例** @@ -430,7 +430,7 @@ inline fun HookParam.method(initiate: MethodCondition): MethodFinder.Result **功能描述** -> 使用当前 `instanceClass` 查找并得到方法。 +> 使用当前 `hookClass` 查找并得到 `Method` 。 #### HookParam.constructor *- i-ext-method* @@ -448,7 +448,7 @@ inline fun HookParam.constructor(initiate: ConstructorCondition): ConstructorFin **功能描述** -> 使用当前 `instanceClass` 查找并得到构造方法。 +> 使用当前 `hookClass` 查找并得到 `Constructor`。 #### HookParam.injectMember *- i-ext-method* @@ -462,7 +462,7 @@ inline fun HookParam.injectMember(priority: Int, tag: String, initiate: MemberHo **功能描述** -> 注入要 Hook 的方法、构造方法 (嵌套 Hook)。 +> 注入要 Hook 的 `Method`、`Constructor` (嵌套 Hook)。 #### beforeHook *- method* @@ -480,7 +480,7 @@ fun beforeHook(initiate: HookParam.() -> Unit): HookCallback **功能描述** -> 在方法执行完成前 Hook。 +> 在 `Member` 执行完成前 Hook。 #### afterHook *- method* @@ -498,7 +498,7 @@ fun afterHook(initiate: HookParam.() -> Unit): HookCallback **功能描述** -> 在方法执行完成后 Hook。 +> 在 `Member` 执行完成后 Hook。 #### replaceAny *- method* @@ -512,7 +512,7 @@ fun replaceAny(initiate: HookParam.() -> Any?) **功能描述** -> 拦截并替换此方法内容,给出返回值。 +> 拦截并替换此 `Member` 内容,给出返回值。 #### replaceUnit *- method* @@ -526,7 +526,7 @@ fun replaceUnit(initiate: HookParam.() -> Unit) **功能描述** -> 拦截并替换此方法内容,没有返回值,可以称为 `Void`。 +> 拦截并替换此 `Member` 内容,没有返回值,可以称为 `Void`。 #### replaceTo *- method* @@ -540,7 +540,7 @@ fun replaceTo(any: Any?) **功能描述** -> 拦截并替换方法返回值。 +> 拦截并替 `Member` 返回值。 #### replaceToTrue *- method* @@ -554,9 +554,9 @@ fun replaceToTrue() **功能描述** -> 拦截并替换方法返回值为 `true`。 +> 拦截并替换 `Member` 返回值为 `true`。 -!> 确保替换方法的返回对象为 `Boolean`。 +!> 确保替换 `Member` 的返回对象为 `Boolean`。 #### replaceToFalse *- method* @@ -570,9 +570,9 @@ fun replaceToFalse() **功能描述** -> 拦截并替换方法返回值为 `false`。 +> 拦截并替换 `Member` 返回值为 `false`。 -!> 确保替换方法的返回对象为 `Boolean`。 +!> 确保替换 `Member` 的返回对象为 `Boolean`。 #### intercept *- method* @@ -586,11 +586,11 @@ fun intercept() **功能描述** -> 拦截此方法。 +> 拦截此 `Member` 。 -!> 这将会禁止此方法执行并返回 `null`。 +!> 这将会禁止此 `Member` 执行并返回 `null`。 -!> 注意:例如 `Int`、`Long`、`Boolean` 常量返回值的方法一旦被设置为 null 可能会造成 Hook APP 抛出异常。 +!> 注意:例如 `Int`、`Long`、`Boolean` 常量返回值的 `Member` 一旦被设置为 null 可能会造成 Hook APP 抛出异常。 #### removeSelf *- method* @@ -604,7 +604,7 @@ fun removeSelf(result: (Boolean) -> Unit) **功能描述** -> 移除当前注入的 Hook 方法、构造方法 (解除 Hook)。 +> 移除当前注入的 Hook `Method`、`Constructor` (解除 Hook)。 !> 你只能在 Hook 回调方法中使用此功能。 @@ -866,7 +866,7 @@ fun remove(result: (Boolean) -> Unit) **功能描述** -> 移除当前注入的 Hook 方法、构造方法 (解除 Hook)。 +> 移除当前注入的 Hook `Method`、`Constructor` (解除 Hook)。 !> 你只能在 Hook 成功后才能解除 Hook,可监听 `onHooked` 事件。 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreater.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreater.kt index c88972f9..df7e3980 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreater.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/YukiMemberHookCreater.kt @@ -50,6 +50,7 @@ import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiHookHelper import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiHookPriority import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiMemberHook import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiMemberReplacement +import java.lang.reflect.Constructor import java.lang.reflect.Field import java.lang.reflect.Member import java.lang.reflect.Method @@ -82,7 +83,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara @PublishedApi internal var isDisableCreaterRunHook = false - /** 设置要 Hook 的方法、构造方法 */ + /** 设置要 Hook 的 [Method]、[Constructor] */ @PublishedApi internal var preHookMembers = HashMap() @@ -97,7 +98,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara get() = hookClass.instance ?: error("Cannot get hook class \"${hookClass.name}\" cause ${hookClass.throwable?.message}") /** - * 注入要 Hook 的方法、构造方法 + * 注入要 Hook 的 [Method]、[Constructor] * @param priority Hook 优先级 - 默认 [PRIORITY_DEFAULT] * @param tag 可设置标签 - 在发生错误时方便进行调试 * @param initiate 方法体 @@ -188,7 +189,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara /** * Hook 核心功能实现类 * - * 查找和处理需要 Hook 的方法、构造方法 + * 查找和处理需要 Hook 的 [Method]、[Constructor] * @param priority Hook 优先级 * @param tag 当前设置的标签 */ @@ -249,16 +250,16 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara @PublishedApi internal var finder: BaseFinder? = null - /** 当前被 Hook 的方法、构造方法实例数组 */ + /** 当前被 Hook 的 [Method]、[Constructor] 实例数组 */ private val memberUnhooks = HashSet() - /** 当前需要 Hook 的方法、构造方法 */ + /** 当前需要 Hook 的 [Method]、[Constructor] */ internal val members = HashSet() /** - * 手动指定要 Hook 的方法、构造方法 + * 手动指定要 Hook 的 [Method]、[Constructor] * - * 你可以调用 [instanceClass] 来手动查询要 Hook 的方法 + * 你可以调用 [instanceClass] 来手动查询要 Hook 的 [Method]、[Constructor] * * - ❗不建议使用此方法设置目标需要 Hook 的 [Member] 对象 - 你可以使用 [method] 或 [constructor] 方法 * @@ -273,7 +274,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } /** - * 查找并 Hook [hookClass] 中指定 [name] 的全部方法 + * 查找并 Hook [hookClass] 中指定 [name] 的全部 [Method] * * - ❗此方法已弃用 - 在之后的版本中将直接被删除 * @@ -285,7 +286,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara fun allMethods(name: String) = method { this.name = name }.all() /** - * 查找并 Hook [hookClass] 中的全部构造方法 + * 查找并 Hook [hookClass] 中的全部 [Constructor] * * - ❗此方法已弃用 - 在之后的版本中将直接被删除 * @@ -299,13 +300,13 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara fun allConstructors() = allMembers(MembersType.CONSTRUCTOR) /** - * 查找并 Hook [hookClass] 中的全部方法、构造方法 + * 查找并 Hook [hookClass] 中的全部 [Method]、[Constructor] * * - ❗在同一个 [injectMember] 中你只能使用一次 [members]、[allMembers]、[method]、[constructor] 方法 - 否则结果会被替换 * - * - ❗警告:无法准确处理每个方法的返回值和 param - 建议使用 [method] or [constructor] 对每个方法单独 Hook + * - ❗警告:无法准确处理每个 [Member] 的返回值和 param - 建议使用 [method] or [constructor] 对每个 [Member] 单独 Hook * - * - ❗如果 [hookClass] 中没有方法可能会发生错误 + * - ❗如果 [hookClass] 中没有 [Member] 可能会发生错误 * @param type 过滤 [Member] 类型 - 默认为 [MembersType.ALL] */ fun allMembers(type: MembersType = MembersType.ALL) { @@ -318,33 +319,33 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } /** - * 查找 [hookClass] 需要 Hook 的方法 + * 查找 [hookClass] 需要 Hook 的 [Method] * * - ❗在同一个 [injectMember] 中你只能使用一次 [members]、[allMembers]、[method]、[constructor] 方法 - 否则结果会被替换 * @param initiate 方法体 - * @return [MethodFinder.Result] + * @return [MethodFinder.Process] */ inline fun method(initiate: MethodCondition) = try { isHookMemberSetup = true - MethodFinder(hookInstance = this, hookClass.instance).apply(initiate).apply { finder = this }.build(isBind = true) + MethodFinder(hookInstance = this, hookClass.instance).apply(initiate).apply { finder = this }.process() } catch (e: Throwable) { findingThrowable = e - MethodFinder(hookInstance = this).failure(e) + MethodFinder(hookInstance = this).denied(e) } /** - * 查找 [hookClass] 需要 Hook 的构造方法 + * 查找 [hookClass] 需要 Hook 的 [Constructor] * * - ❗在同一个 [injectMember] 中你只能使用一次 [members]、[allMembers]、[method]、[constructor] 方法 - 否则结果会被替换 * @param initiate 方法体 - * @return [ConstructorFinder.Result] + * @return [ConstructorFinder.Process] */ inline fun constructor(initiate: ConstructorCondition = { emptyParam() }) = try { isHookMemberSetup = true - ConstructorFinder(hookInstance = this, hookClass.instance).apply(initiate).apply { finder = this }.build(isBind = true) + ConstructorFinder(hookInstance = this, hookClass.instance).apply(initiate).apply { finder = this }.process() } catch (e: Throwable) { findingThrowable = e - ConstructorFinder(hookInstance = this).failure(e) + ConstructorFinder(hookInstance = this).denied(e) } /** @@ -357,7 +358,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara else FieldFinder(hookInstance = this@MemberHookCreater, hookClass.instance).apply(initiate).build() /** - * 使用当前 [hookClass] 查找并得到方法 + * 使用当前 [hookClass] 查找并得到 [Method] * @param initiate 方法体 * @return [MethodFinder.Result] */ @@ -366,7 +367,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara else MethodFinder(hookInstance = this@MemberHookCreater, hookClass.instance).apply(initiate).build() /** - * 使用当前 [hookClass] 查找并得到构造方法 + * 使用当前 [hookClass] 查找并得到 [Constructor] * @param initiate 方法体 * @return [ConstructorFinder.Result] */ @@ -375,7 +376,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara else ConstructorFinder(hookInstance = this@MemberHookCreater, hookClass.instance).apply(initiate).build() /** - * 注入要 Hook 的方法、构造方法 (嵌套 Hook) + * 注入要 Hook 的 [Method]、[Constructor] (嵌套 Hook) * @param priority Hook 优先级 - 默认 [PRIORITY_DEFAULT] * @param tag 可设置标签 - 在发生错误时方便进行调试 * @param initiate 方法体 @@ -388,7 +389,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara ) = this@YukiMemberHookCreater.injectMember(priority, tag, initiate).also { this@YukiMemberHookCreater.hook() } /** - * 在方法执行完成前 Hook + * 在 [Member] 执行完成前 Hook * * - 不可与 [replaceAny]、[replaceUnit]、[replaceTo] 同时使用 * @param initiate [HookParam] 方法体 @@ -401,7 +402,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } /** - * 在方法执行完成后 Hook + * 在 [Member] 执行完成后 Hook * * - 不可与 [replaceAny]、[replaceUnit]、[replaceTo] 同时使用 * @param initiate [HookParam] 方法体 @@ -414,7 +415,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } /** - * 拦截并替换此方法内容 - 给出返回值 + * 拦截并替换此 [Member] 内容 - 给出返回值 * * - 不可与 [beforeHook]、[afterHook] 同时使用 * @param initiate [HookParam] 方法体 @@ -425,7 +426,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } /** - * 拦截并替换此方法内容 - 没有返回值 ([Unit]) + * 拦截并替换此 [Member] 内容 - 没有返回值 ([Unit]) * * - 不可与 [beforeHook]、[afterHook] 同时使用 * @param initiate [HookParam] 方法体 @@ -436,7 +437,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } /** - * 拦截并替换方法返回值 + * 拦截并替换 [Member] 返回值 * * - 不可与 [beforeHook]、[afterHook] 同时使用 * @param any 要替换为的返回值对象 @@ -447,9 +448,9 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } /** - * 拦截并替换方法返回值为 true + * 拦截并替换 [Member] 返回值为 true * - * - ❗确保替换方法的返回对象为 [Boolean] + * - ❗确保替换 [Member] 的返回对象为 [Boolean] * * - 不可与 [beforeHook]、[afterHook] 同时使用 */ @@ -459,9 +460,9 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } /** - * 拦截并替换方法返回值为 false + * 拦截并替换 [Member] 返回值为 false * - * - ❗确保替换方法的返回对象为 [Boolean] + * - ❗确保替换 [Member] 的返回对象为 [Boolean] * * - 不可与 [beforeHook]、[afterHook] 同时使用 */ @@ -471,11 +472,11 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } /** - * 拦截此方法 + * 拦截此 [Member] * - * - ❗这将会禁止此方法执行并返回 null + * - ❗这将会禁止此 [Member] 执行并返回 null * - * - ❗注意:例如 [Int]、[Long]、[Boolean] 常量返回值的方法一旦被设置为 null 可能会造成 Hook APP 抛出异常 + * - ❗注意:例如 [Int]、[Long]、[Boolean] 常量返回值的 [Member] 一旦被设置为 null 可能会造成 Hook APP 抛出异常 * * - 不可与 [beforeHook]、[afterHook] 同时使用 */ @@ -485,7 +486,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } /** - * 移除当前注入的 Hook 方法、构造方法 (解除 Hook) + * 移除当前注入的 Hook [Method]、[Constructor] (解除 Hook) * * - ❗你只能在 Hook 回调方法中使用此功能 * @param result 回调是否成功 @@ -544,7 +545,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } /** - * Hook 方法、构造方法 + * Hook [Method]、[Constructor] * @return [Pair] - ([YukiMemberHook.Unhook] or null,[Boolean] 是否已经 Hook) */ private fun Member.hook(): Pair { @@ -565,7 +566,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara onConductFailureCallback?.invoke(assign, e) onAllFailureCallback?.invoke(e) if (onConductFailureCallback == null && onAllFailureCallback == null) onHookFailureMsg(e) - /** 若发生异常则会自动调用未经 Hook 的原始方法保证 Hook APP 正常运行 */ + /** 若发生异常则会自动调用未经 Hook 的原始 [Member] 保证 Hook APP 正常运行 */ assign.callOriginal() } } @@ -614,7 +615,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara } /** - * 检查被 Hook 方法的返回值 + * 检查被 Hook [Member] 的返回值 * @param origin 原始返回值 * @param target 目标返回值 * @throws IllegalStateException 如果返回值不正确 @@ -802,7 +803,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara fun ignoredAllFailure() = onAllFailure {} /** - * 移除当前注入的 Hook 方法、构造方法 (解除 Hook) + * 移除当前注入的 Hook [Method]、[Constructor] (解除 Hook) * * - ❗你只能在 Hook 成功后才能解除 Hook - 可监听 [onHooked] 事件 * @param result 回调是否成功 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/ConstructorFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/ConstructorFinder.kt index a72124da..8ca15feb 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/ConstructorFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/ConstructorFinder.kt @@ -41,7 +41,9 @@ import com.highcapable.yukihookapi.hook.factory.hasExtends import com.highcapable.yukihookapi.hook.log.yLoggerW import com.highcapable.yukihookapi.hook.type.defined.UndefinedType import com.highcapable.yukihookapi.hook.utils.runBlocking +import com.highcapable.yukihookapi.hook.utils.unit import java.lang.reflect.Constructor +import java.lang.reflect.Member /** * [Constructor] 查找类 @@ -197,38 +199,44 @@ class ConstructorFinder @PublishedApi internal constructor( /** * 得到 [Constructor] 结果 - * - * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 * @param isBind 是否将结果设置到目标 [YukiMemberHookCreater.MemberHookCreater] - * @return [Result] */ + private fun build(isBind: Boolean) { + if (classSet == null) error("classSet is null") + classSet.checkingInternal() + runBlocking { + isBindToHooker = isBind + setInstance(isBind, result) + }.result { ms -> + memberInstances.takeIf { it.isNotEmpty() }?.forEach { onHookLogMsg(msg = "Find Constructor [$it] takes ${ms}ms [${hookTag}]") } + } + } + @YukiPrivateApi - override fun build(isBind: Boolean) = try { - if (classSet != null) { - classSet.checkingInternal() - runBlocking { - isBindToHooker = isBind - setInstance(isBind, result) - }.result { ms -> - memberInstances.takeIf { it.isNotEmpty() }?.forEach { onHookLogMsg(msg = "Find Constructor [$it] takes ${ms}ms [${hookTag}]") } - } - Result() - } else Result(isNoSuch = true, Throwable("classSet is null")) + override fun build() = try { + build(isBind = false) + Result() } catch (e: Throwable) { onFailureMsg(throwable = e) Result(isNoSuch = true, e) } - /** - * 创建一个异常结果 - * - * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 - * @param throwable 异常 - * @return [Result] - */ + @YukiPrivateApi + override fun process() = try { + build(isBind = true) + Process() + } catch (e: Throwable) { + onFailureMsg(throwable = e) + Process(isNoSuch = true, e) + } + @YukiPrivateApi override fun failure(throwable: Throwable?) = Result(isNoSuch = true, throwable) + + @YukiPrivateApi + override fun denied(throwable: Throwable?) = Process(isNoSuch = true, throwable) + /** * [Constructor] 重查找实现类 * @@ -308,6 +316,68 @@ class ConstructorFinder @PublishedApi internal constructor( } } + /** + * [Constructor] 查找结果处理类 - 为 [hookInstance] 提供 + * @param isNoSuch 是否没有找到构造方法 - 默认否 + * @param throwable 错误信息 + */ + inner class Process internal constructor( + @PublishedApi internal val isNoSuch: Boolean = false, + @PublishedApi internal val throwable: Throwable? = null + ) : BaseResult { + + /** + * 创建监听结果事件方法体 + * @param initiate 方法体 + * @return [Process] 可继续向下监听 + */ + inline fun result(initiate: Process.() -> Unit) = apply(initiate) + + /** + * 设置全部查询条件匹配的多个 [Constructor] 实例结果到 [hookInstance] + * @return [Process] 可继续向下监听 + */ + fun all(): Process { + fun HashSet.bind() = takeIf { it.isNotEmpty() }?.apply { + hookInstance?.members?.clear() + forEach { hookInstance?.members?.add(it) } + }.unit() + if (isUsingRemedyPlan) + remedyPlansCallback = { memberInstances.bind() } + else memberInstances.bind() + return this + } + + /** + * 创建 [Constructor] 重查找功能 + * + * 当你遇到一种 [Constructor] 可能存在不同形式的存在时 + * + * 可以使用 [RemedyPlan] 重新查找它 - 而没有必要使用 [onNoSuchConstructor] 捕获异常二次查找 [Constructor] + * + * 若第一次查找失败了 - 你还可以在这里继续添加此方法体直到成功为止 + * @param initiate 方法体 + * @return [Process] 可继续向下监听 + */ + inline fun remedys(initiate: RemedyPlan.() -> Unit): Process { + isUsingRemedyPlan = true + if (isNoSuch) RemedyPlan().apply(initiate).build() + return this + } + + /** + * 监听找不到 [Constructor] 时 + * + * - 只会返回第一次的错误信息 - 不会返回 [RemedyPlan] 的错误信息 + * @param result 回调错误 + * @return [Process] 可继续向下监听 + */ + inline fun onNoSuchConstructor(result: (Throwable) -> Unit): Process { + if (isNoSuch) result(throwable ?: Throwable("Initialization Error")) + return this + } + } + /** * [Constructor] 查找结果实现类 * @param isNoSuch 是否没有找到构造方法 - 默认否 @@ -340,20 +410,14 @@ class ConstructorFinder @PublishedApi internal constructor( /** * 获得 [Constructor] 实例处理类数组 * - * - 返回全部查询条件匹配的多个 [Constructor] 实例结果并在 [isBindToHooker] 时设置到 [hookInstance] + * - 返回全部查询条件匹配的多个 [Constructor] 实例结果 * * - ❗在 [memberInstances] 结果为空时使用此方法将无法获得对象 * * - ❗若你设置了 [remedys] 请使用 [waitAll] 回调结果方法 * @return [ArrayList]<[Instance]> */ - fun all(): ArrayList { - if (isBindToHooker) memberInstances.takeIf { it.isNotEmpty() }?.apply { - hookInstance?.members?.clear() - forEach { hookInstance?.members?.add(it) } - } - return arrayListOf().apply { giveAll().takeIf { it.isNotEmpty() }?.forEach { add(Instance(it)) } } - } + fun all() = arrayListOf().apply { giveAll().takeIf { it.isNotEmpty() }?.forEach { add(Instance(it)) } } /** * 得到 [Constructor] 本身 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt index a56ed963..64c65220 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/FieldFinder.kt @@ -188,16 +188,8 @@ class FieldFinder @PublishedApi internal constructor( fields.takeIf { it.isNotEmpty() }?.forEach { memberInstances.add(it) } } - /** - * 得到 [Field] 处理结果 - * - * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 - * @param isBind 是否将结果设置到目标 [YukiMemberHookCreater.MemberHookCreater] - * @return [Result] - * @throws IllegalStateException 如果 [name] 没有被设置 - */ @YukiPrivateApi - override fun build(isBind: Boolean) = try { + override fun build() = try { if (classSet != null) { classSet.checkingInternal() runBlocking { @@ -211,16 +203,15 @@ class FieldFinder @PublishedApi internal constructor( Result(isNoSuch = true, e).await { onFailureMsg(throwable = e) } } - /** - * 创建一个异常结果 - * - * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 - * @param throwable 异常 - * @return [Result] - */ + @YukiPrivateApi + override fun process() = error("FieldFinder does not contain this usage") + @YukiPrivateApi override fun failure(throwable: Throwable?) = Result(isNoSuch = true, throwable) + @YukiPrivateApi + override fun denied(throwable: Throwable?) = error("FieldFinder does not contain this usage") + /** * [Field] 重查找实现类 * diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/MethodFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/MethodFinder.kt index 8d116d00..0b631040 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/MethodFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/MethodFinder.kt @@ -42,7 +42,9 @@ import com.highcapable.yukihookapi.hook.factory.hasExtends import com.highcapable.yukihookapi.hook.log.yLoggerW import com.highcapable.yukihookapi.hook.type.defined.UndefinedType import com.highcapable.yukihookapi.hook.utils.runBlocking +import com.highcapable.yukihookapi.hook.utils.unit import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiHookHelper +import java.lang.reflect.Member import java.lang.reflect.Method /** @@ -264,38 +266,44 @@ class MethodFinder @PublishedApi internal constructor( /** * 得到 [Method] 结果 - * - * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 * @param isBind 是否将结果设置到目标 [YukiMemberHookCreater.MemberHookCreater] - * @return [Result] */ + private fun build(isBind: Boolean) { + if (classSet == null) error("classSet is null") + classSet.checkingInternal() + runBlocking { + isBindToHooker = isBind + setInstance(isBind, result) + }.result { ms -> + memberInstances.takeIf { it.isNotEmpty() }?.forEach { onHookLogMsg(msg = "Find Method [$it] takes ${ms}ms [${hookTag}]") } + } + } + @YukiPrivateApi - override fun build(isBind: Boolean) = try { - if (classSet != null) { - classSet.checkingInternal() - runBlocking { - isBindToHooker = isBind - setInstance(isBind, result) - }.result { ms -> - memberInstances.takeIf { it.isNotEmpty() }?.forEach { onHookLogMsg(msg = "Find Method [$it] takes ${ms}ms [${hookTag}]") } - } - Result() - } else Result(isNoSuch = true, Throwable("classSet is null")) + override fun build() = try { + build(isBind = false) + Result() } catch (e: Throwable) { onFailureMsg(throwable = e) Result(isNoSuch = true, e) } - /** - * 创建一个异常结果 - * - * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 - * @param throwable 异常 - * @return [Result] - */ + @YukiPrivateApi + override fun process() = try { + build(isBind = true) + Process() + } catch (e: Throwable) { + onFailureMsg(throwable = e) + Process(isNoSuch = true, e) + } + @YukiPrivateApi override fun failure(throwable: Throwable?) = Result(isNoSuch = true, throwable) + + @YukiPrivateApi + override fun denied(throwable: Throwable?) = Process(isNoSuch = true, throwable) + /** * [Method] 重查找实现类 * @@ -376,6 +384,68 @@ class MethodFinder @PublishedApi internal constructor( } } + /** + * [Method] 查找结果处理类 - 为 [hookInstance] 提供 + * @param isNoSuch 是否没有找到方法 - 默认否 + * @param throwable 错误信息 + */ + inner class Process internal constructor( + @PublishedApi internal val isNoSuch: Boolean = false, + @PublishedApi internal val throwable: Throwable? = null + ) : BaseResult { + + /** + * 创建监听结果事件方法体 + * @param initiate 方法体 + * @return [Process] 可继续向下监听 + */ + inline fun result(initiate: Process.() -> Unit) = apply(initiate) + + /** + * 设置全部查询条件匹配的多个 [Method] 实例结果到 [hookInstance] + * @return [Process] 可继续向下监听 + */ + fun all(): Process { + fun HashSet.bind() = takeIf { it.isNotEmpty() }?.apply { + hookInstance?.members?.clear() + forEach { hookInstance?.members?.add(it) } + }.unit() + if (isUsingRemedyPlan) + remedyPlansCallback = { memberInstances.bind() } + else memberInstances.bind() + return this + } + + /** + * 创建 [Method] 重查找功能 + * + * 当你遇到一种 [Method] 可能存在不同形式的存在时 + * + * 可以使用 [RemedyPlan] 重新查找它 - 而没有必要使用 [onNoSuchMethod] 捕获异常二次查找 [Method] + * + * 若第一次查找失败了 - 你还可以在这里继续添加此方法体直到成功为止 + * @param initiate 方法体 + * @return [Process] 可继续向下监听 + */ + inline fun remedys(initiate: RemedyPlan.() -> Unit): Process { + isUsingRemedyPlan = true + if (isNoSuch) RemedyPlan().apply(initiate).build() + return this + } + + /** + * 监听找不到 [Method] 时 + * + * - 只会返回第一次的错误信息 - 不会返回 [RemedyPlan] 的错误信息 + * @param result 回调错误 + * @return [Process] 可继续向下监听 + */ + inline fun onNoSuchMethod(result: (Throwable) -> Unit): Process { + if (isNoSuch) result(throwable ?: Throwable("Initialization Error")) + return this + } + } + /** * [Method] 查找结果实现类 * @param isNoSuch 是否没有找到方法 - 默认否 @@ -409,7 +479,7 @@ class MethodFinder @PublishedApi internal constructor( /** * 获得 [Method] 实例处理类数组 * - * - 返回全部查询条件匹配的多个 [Method] 实例结果并在 [isBindToHooker] 时设置到 [hookInstance] + * - 返回全部查询条件匹配的多个 [Method] 实例结果 * * - ❗在 [memberInstances] 结果为空时使用此方法将无法获得对象 * @@ -417,13 +487,8 @@ class MethodFinder @PublishedApi internal constructor( * @param instance 所在实例 * @return [ArrayList]<[Instance]> */ - fun all(instance: Any? = null): ArrayList { - if (isBindToHooker) memberInstances.takeIf { it.isNotEmpty() }?.apply { - hookInstance?.members?.clear() - forEach { hookInstance?.members?.add(it) } - } - return arrayListOf().apply { giveAll().takeIf { it.isNotEmpty() }?.forEach { add(Instance(instance, it)) } } - } + fun all(instance: Any? = null) = + arrayListOf().apply { giveAll().takeIf { it.isNotEmpty() }?.forEach { add(Instance(instance, it)) } } /** * 得到 [Method] 本身 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.kt index d987eb01..0d96ee24 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/core/finder/base/BaseFinder.kt @@ -220,17 +220,25 @@ abstract class BaseFinder internal constructor( } /** - * 得到结果 + * 返回结果实现类 * * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 - * @param isBind 是否将结果设置到目标 [YukiMemberHookCreater.MemberHookCreater] * @return [BaseResult] */ @YukiPrivateApi - abstract fun build(isBind: Boolean = false): BaseResult + abstract fun build(): BaseResult /** - * 创建一个异常结果 + * 返回结果处理类并设置到目标 [YukiMemberHookCreater.MemberHookCreater] + * + * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 + * @return [BaseResult] + */ + @YukiPrivateApi + abstract fun process(): BaseResult + + /** + * 返回只有异常的结果实现类 * * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 * @param throwable 异常 @@ -240,7 +248,17 @@ abstract class BaseFinder internal constructor( abstract fun failure(throwable: Throwable?): BaseResult /** - * 查找结果实现类接口 + * 返回只有异常的结果处理类并作用于目标 [YukiMemberHookCreater.MemberHookCreater] + * + * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 + * @param throwable 异常 + * @return [BaseResult] + */ + @YukiPrivateApi + abstract fun denied(throwable: Throwable?): BaseResult + + /** + * 查找结果实现、处理类接口 * * - ❗此功能交由方法体自动完成 - 你不应该手动继承此接口 */