Modify move Result to Process for Hooker in MethodFinder, ConstructorFinder and YukiMemberHookCreater

This commit is contained in:
2022-08-28 22:39:45 +08:00
parent 0f0bd40916
commit c93e6a563e
8 changed files with 506 additions and 149 deletions

View File

@@ -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<Instance>
> 获得 `Constructor` 实例处理类数组。
返回全部查询条件匹配的多个 `Constructor` 实例结果并在 `isBindToHooker` 时设置到 `hookInstance`
返回全部查询条件匹配的多个 `Constructor` 实例结果。
**功能示例**

View File

@@ -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<Instance>
> 获得 `Method` 实例处理类数组。
返回全部查询条件匹配的多个 `Method` 实例结果并在 `isBindToHooker` 时设置到 `hookInstance`
返回全部查询条件匹配的多个 `Method` 实例结果。
**功能示例**

View File

@@ -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*~~ <!-- {docsify-ignore} -->
@@ -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` 事件。

View File

@@ -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<String, MemberHookCreater>()
@@ -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<YukiMemberHook.Unhook>()
/** 当前需要 Hook 的方法、构造方法 */
/** 当前需要 Hook 的 [Method]、[Constructor] */
internal val members = HashSet<Member>()
/**
* 手动指定要 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<YukiMemberHook.Unhook?, Boolean> {
@@ -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 回调是否成功

View File

@@ -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<Member>.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<Instance> {
if (isBindToHooker) memberInstances.takeIf { it.isNotEmpty() }?.apply {
hookInstance?.members?.clear()
forEach { hookInstance?.members?.add(it) }
}
return arrayListOf<Instance>().apply { giveAll().takeIf { it.isNotEmpty() }?.forEach { add(Instance(it)) } }
}
fun all() = arrayListOf<Instance>().apply { giveAll().takeIf { it.isNotEmpty() }?.forEach { add(Instance(it)) } }
/**
* 得到 [Constructor] 本身

View File

@@ -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] 重查找实现类
*

View File

@@ -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<Member>.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<Instance> {
if (isBindToHooker) memberInstances.takeIf { it.isNotEmpty() }?.apply {
hookInstance?.members?.clear()
forEach { hookInstance?.members?.add(it) }
}
return arrayListOf<Instance>().apply { giveAll().takeIf { it.isNotEmpty() }?.forEach { add(Instance(instance, it)) } }
}
fun all(instance: Any? = null) =
arrayListOf<Instance>().apply { giveAll().takeIf { it.isNotEmpty() }?.forEach { add(Instance(instance, it)) } }
/**
* 得到 [Method] 本身

View File

@@ -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
/**
* 查找结果实现、处理类接口
*
* - ❗此功能交由方法体自动完成 - 你不应该手动继承此接口
*/