Merge new documentation

This commit is contained in:
2022-04-09 01:37:12 +08:00
parent c3fbaf553f
commit a455eec5de
52 changed files with 8270 additions and 104 deletions

View File

@@ -0,0 +1,101 @@
## BaseFinder.IndexTypeCondition [class]
```kotlin
inner class IndexTypeCondition(private val type: IndexConfigType)
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 字节码下标筛选实现类。
### index [method]
```kotlin
fun index(num: Int)
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 设置下标。
`index` 小于零则为倒序,此时可以使用 `IndexTypeConditionSort.reverse` 方法实现。
可使用 `IndexTypeConditionSort.first``IndexTypeConditionSort.last` 设置首位和末位筛选条件。
### index [method]
```kotlin
fun index(): IndexTypeConditionSort
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 得到下标。
### IndexTypeConditionSort [class]
```kotlin
inner class IndexTypeConditionSort
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 字节码下标排序实现类。
#### first [method]
```kotlin
fun first()
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 设置满足条件的第一个。
#### last [method]
```kotlin
fun last()
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 设置满足条件的最后一个。
#### reverse [method]
```kotlin
fun reverse(num: Int)
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 设置倒序下标。

View File

@@ -0,0 +1,11 @@
## ComponentTypeFactory [kt]
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 这是一个预置 Hook 类型的常量类,主要为 `Android` 相关组件的 `Class` 内容,跟随版本更新会逐一进行增加。
详情可 [点击这里](https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ComponentTypeFactory.kt) 进行查看。

View File

@@ -0,0 +1,380 @@
## ConstructorFinder [class]
```kotlin
class ConstructorFinder(override val hookInstance: YukiHookCreater.MemberHookCreater?, override val classSet: Class<*>) : BaseFinder()
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.2` `修改`
合并到 `BaseFinder`
<b>功能描述</b>
> `Constructor` 查找类。
### paramCount [field]
```kotlin
var paramCount: Int
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> `Constructor` 参数个数。
你可以不使用 `param` 指定参数类型而是仅使用此变量指定参数个数。
若参数个数小于零则忽略并使用 `param`
### modifiers [method]
```kotlin
fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> `Constructor` 筛选条件。
可不设置筛选条件,默认模糊查找并取第一个匹配的 `Constructor`
!> 存在多个 `IndexTypeCondition` 时除了 `order` 只会生效最后一个。
### param [method]
```kotlin
fun param(vararg paramType: Any): IndexTypeCondition
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> `Constructor` 参数。
如果同时使用了 `paramCount``paramTypes` 的数量必须与 `paramCount` 完全匹配。
!> 无参 `Constructor` 不要使用此方法。
!> 有参 `Constructor` 必须使用此方法设定参数或使用 `paramCount` 指定个数。
!> 存在多个 `IndexTypeCondition` 时除了 `order` 只会生效最后一个。
### RemedyPlan [class]
```kotlin
inner class RemedyPlan
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> `Constructor` 重查找实现类,可累计失败次数直到查找成功。
#### constructor [method]
```kotlin
fun constructor(initiate: ConstructorFinder.() -> Unit)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 创建需要重新查找的 `Constructor`。
你可以添加多个备选构造方法,直到成功为止,若最后依然失败,将停止查找并输出错误日志。
#### Result [class]
```kotlin
inner class Result
```
<b>变更记录</b>
`v1.0.1` `新增`
<b>功能描述</b>
> `RemedyPlan` 结果实现类。
##### onFind [method]
```kotlin
fun onFind(initiate: Constructor<*>.() -> Unit)
```
<b>变更记录</b>
`v1.0.1` `新增`
<b>功能描述</b>
> 当在 `RemedyPlan` 中找到结果时。
<b>功能示例</b>
你可以方便地对重查找的 `Constructor` 实现 `onFind` 方法。
> 示例如下
```kotlin
constructor {
// Your code here.
}.onFind {
// Your code here.
}
```
### Result [class]
```kotlin
inner class Result(internal val isNoSuch: Boolean, private val e: Throwable?)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> `Constructor` 查找结果实现类。
#### result [method]
```kotlin
fun result(initiate: Result.() -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 创建监听结果事件方法体。
<b>功能示例</b>
你可以使用 `lambda` 形式创建 `Result` 类。
> 示例如下
```kotlin
constructor {
// Your code here.
}.result {
get().call()
remedys {}
onNoSuchConstructor {}
}
```
#### get [method]
```kotlin
fun get(): Instance
```
<b>变更记录</b>
`v1.0.2` `新增`
<b>功能描述</b>
> 获得 `Constructor` 实例处理类。
!> 若你设置了 `remedys` 请使用 `wait` 回调结果方法。
<b>功能示例</b>
你可以通过获得方法所在实例来执行构造方法创建新的实例对象。
> 示例如下
```kotlin
constructor {
// Your code here.
}.get().call()
```
你可以 `cast` 构造方法为指定类型的实例对象。
> 示例如下
```kotlin
constructor {
// Your code here.
}.get().newInstance<TestClass>()
```
!> 若构造方法含有参数则后方参数必填。
> 示例如下
```kotlin
constructor {
// Your code here.
}.get().newInstance<TestClass>("param1", "param2")
```
#### give [method]
```kotlin
fun give(): Constructor<*>?
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 得到构造方法本身。
#### wait [method]
```kotlin
fun wait(initiate: Instance.() -> Unit)
```
<b>变更记录</b>
`v1.0.2` `新增`
<b>功能描述</b>
> 获得 `Constructor` 实例处理类,配合 `RemedyPlan` 使用。
!> 若你设置了 `remedys` 必须使用此方法才能获得结果。
!> 若你没有设置 `remedys` 此方法将不会被回调。
#### remedys [method]
```kotlin
fun remedys(initiate: RemedyPlan.() -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 创建构造方法重查找功能。
<b>功能示例</b>
当你遇到一种构造方法可能存在不同形式的存在时,可以使用 `RemedyPlan` 重新查找它,而没有必要使用 `onNoSuchConstructor` 捕获异常二次查找构造方法。
若第一次查找失败了,你还可以在这里继续添加此方法体直到成功为止。
> 示例如下
```kotlin
constructor {
// Your code here.
}.remedys {
constructor {
// Your code here.
}
constructor {
// Your code here.
}
}
```
#### onNoSuchConstructor [method]
```kotlin
fun onNoSuchConstructor(initiate: (Throwable) -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 监听找不到构造方法时。
只会返回第一次的错误信息,不会返回 `RemedyPlan` 的错误信息。
#### ignoredError [method]
```kotlin
fun ignoredError(): Result
```
<b>变更记录</b>
`v1.0.3` `新增`
<b>功能描述</b>
> 忽略任何错误发出的警告。
`isNotIgnoredHookingFailure``false` 则自动忽略。
#### Instance [class]
```kotlin
inner class Instance
```
<b>变更记录</b>
`v1.0.2` `新增`
<b>功能描述</b>
> `Constructor` 实例处理类。
##### call [method]
```kotlin
fun call(vararg param: Any?): Any?
```
<b>变更记录</b>
`v1.0.2` `新增`
<b>功能描述</b>
> 执行构造方法创建目标实例,不指定目标实例类型。
##### newInstance [method]
```kotlin
fun <T> newInstance(vararg param: Any?): T?
```
<b>变更记录</b>
`v1.0.2` `新增`
<b>功能描述</b>
> 执行构造方法创建目标实例 ,指定 `T` 目标实例类型。

View File

@@ -0,0 +1,41 @@
## CurrentClass [class]
```kotlin
class CurrentClass(private val instance: Class<*>, private val self: Any)
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 当前实例的类操作对象。
### field [method]
```kotlin
fun field(initiate: FieldFinder.() -> Unit): FieldFinder.Result.Instance
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 调用当前实例中的变量。
### method [method]
```kotlin
fun method(initiate: MethodFinder.() -> Unit): MethodFinder.Result.Instance
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 调用当前实例中的方法。

View File

@@ -0,0 +1,560 @@
## FieldFinder [class]
```kotlin
class FieldFinder(override val hookInstance: YukiHookCreater.MemberHookCreater?, override val classSet: Class<*>?) : BaseFinder()
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.2` `修改`
合并到 `BaseFinder`
<b>功能描述</b>
> `Field` 查找类。
### ~~classSet [field]~~ <!-- {docsify-ignore} -->
<b>变更记录</b>
`v1.0` `添加`
`v1.0.2` `移除`
### name [field]
```kotlin
var name: String
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.70` `修改`
允许不填写名称
<b>功能描述</b>
> `Field` 名称。
!> 若不填写名称则必须存在一个其它条件。
### type [field]
```kotlin
var type: Any?
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> `Field` 类型。
可不填写类型,默认模糊查找并取第一个匹配的 `Field`
### modifiers [method]
```kotlin
fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> `Field` 筛选条件。
可不设置筛选条件,默认模糊查找并取第一个匹配的 `Field`
!> 存在多个 `IndexTypeCondition` 时除了 `order` 只会生效最后一个。
### order [method]
```kotlin
fun order(): IndexTypeCondition
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 顺序筛选字节码的下标。
### name [method]
```kotlin
fun name(value: String): IndexTypeCondition
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> `Field` 名称。
!> 若不填写名称则必须存在一个其它条件,默认模糊查找并取第一个匹配的 `Field`
!> 存在多个 `IndexTypeCondition` 时除了 `order` 只会生效最后一个。
### type [method]
```kotlin
fun type(value: Any): IndexTypeCondition
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> `Field` 类型。
!> 可不填写类型,默认模糊查找并取第一个匹配的 `Field`
!> 存在多个 `IndexTypeCondition` 时除了 `order` 只会生效最后一个。
### Result [class]
```kotlin
inner class Result(internal val isNoSuch: Boolean, private val e: Throwable?)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> `Field` 查找结果实现类。
#### result [method]
```kotlin
fun result(initiate: Result.() -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 创建监听结果事件方法体。
<b>功能示例</b>
你可以使用 `lambda` 形式创建 `Result` 类。
> 示例如下
```kotlin
field {
// Your code here.
}.result {
get(instance).set("something")
get(instance).string()
get(instance).cast<CustomClass>()
get().boolean()
give()
onNoSuchField {}
}
```
#### get [method]
```kotlin
fun get(instance: Any?): Instance
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 得到变量实例处理类。
<b>功能示例</b>
你可以轻松地得到 `Field` 的实例以及使用它进行设置实例。
> 示例如下
```kotlin
field {
// Your code here.
}.get(instance).set("something")
```
如果你取到的是静态 `Field`,可以不需要设置实例。
> 示例如下
```kotlin
field {
// Your code here.
}.get().set("something")
```
#### give [method]
```kotlin
fun give(): Field?
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 得到变量本身。
#### onNoSuchField [method]
```kotlin
fun onNoSuchField(initiate: (Throwable) -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 监听找不到变量时。
#### ignoredError [method]
```kotlin
fun ignoredError(): Result
```
<b>变更记录</b>
`v1.0.3` `新增`
<b>功能描述</b>
> 忽略任何错误发出的警告。
`isNotIgnoredHookingFailure``false` 则自动忽略。
#### Instance [class]
```kotlin
inner class Instance(private val instance: Any?, val self: Any?)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> `Field` 实例变量处理类。
##### cast [method]
```kotlin
fun <T> cast(): T?
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.68` `修改`
修改 ~~`of`~~`cast`
移动方法到 `Instance`
<b>功能描述</b>
> 得到变量实例。
##### byte [method]
```kotlin
fun byte(): Byte?
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 得到变量 Byte 实例。
##### int [method]
```kotlin
fun int(): Int
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`ofInt`~~`int`
移动方法到 `Instance`
<b>功能描述</b>
> 得到变量 Int 实例。
##### long [method]
```kotlin
fun long(): Long
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`ofLong`~~`long`
移动方法到 `Instance`
<b>功能描述</b>
> 得到变量 Long 实例。
##### short [method]
```kotlin
fun short(): Short
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`ofShort`~~`short`
移动方法到 `Instance`
<b>功能描述</b>
> 得到变量 Short 实例。
##### double [method]
```kotlin
fun double(): Double
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`ofDouble`~~`double`
移动方法到 `Instance`
<b>功能描述</b>
> 得到变量 Double 实例。
##### float [method]
```kotlin
fun float(): Float
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`ofFloat`~~`float`
移动方法到 `Instance`
<b>功能描述</b>
> 得到变量 Float 实例。
##### string [method]
```kotlin
fun string(): String
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`ofString`~~`string`
移动方法到 `Instance`
<b>功能描述</b>
> 得到变量 String 实例。
##### char [method]
```kotlin
fun char(): Char
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 得到变量 Char 实例。
##### boolean [method]
```kotlin
fun boolean(): Boolean
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`ofBoolean`~~`boolean`
移动方法到 `Instance`
<b>功能描述</b>
> 得到变量 Boolean 实例。
##### any [method]
```kotlin
fun any(): Any?
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`ofAny`~~`any`
移动方法到 `Instance`
<b>功能描述</b>
> 得到变量 Any 实例。
##### array [method]
```kotlin
inline fun <reified T> array(): Array<T>
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 得到变量 Array 实例。
##### list [method]
```kotlin
inline fun <reified T> list(): List<T>
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 得到变量 List 实例。
##### set [method]
```kotlin
fun set(any: Any?)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 设置变量实例。
##### setTrue [method]
```kotlin
fun setTrue()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 设置变量实例为 `true`。
!> 请确保实例对象类型为 `Boolean`
##### setFalse [method]
```kotlin
fun setFalse()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 设置变量实例为 `false`。
!> 请确保实例对象类型为 `Boolean`
##### setNull [method]
```kotlin
fun setNull()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 设置变量实例为 `null`

View File

@@ -0,0 +1,11 @@
## GraphicsTypeFactory [kt]
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 这是一个预置 Hook 类型的常量类,主要为 `Android` 相关 `Graphics` 的 `Class` 内容,跟随版本更新会逐一进行增加。
详情可 [点击这里](https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/GraphicsTypeFactory.kt) 进行查看。

View File

@@ -0,0 +1,15 @@
## HookClass [class]
```kotlin
class HookClass(var instance: Class<*>?, var name: String, var throwable: Throwable?)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 创建一个当前 Hook 的 `Class` 接管类。
`instance` 为实例,`name` 为实例完整包名,`throwable` 为找不到实例的时候抛出的异常。

View File

@@ -0,0 +1,580 @@
## HookParam [class]
```kotlin
class HookParam(private val createrInstance: YukiHookCreater, private val wrapper: HookParamWrapper)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> Hook 方法、构造类的目标对象实现类。
### args [field]
```kotlin
val args: Array<Any?>
```
<b>变更记录</b>
`v1.0` 添加
<b>功能描述</b>
> 获取当前 Hook 对象 `member` 或 `constructor` 的参数对象数组。
### firstArgs [field]
```kotlin
val firstArgs: Any?
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook 对象 `member` 或 `constructor` 的参数对象数组第一位。
### lastArgs [field]
```kotlin
val lastArgs: Any?
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook 对象 `member` 或 `constructor` 的参数对象数组最后一位。
### instance [field]
```kotlin
val instance: Any
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook 实例的对象。
!> 如果你当前 Hook 的对象是一个静态,那么它将不存在实例的对象。
### instanceClass [field]
```kotlin
val instanceClass: Class<*>
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook 实例的类对象。
### method [field]
```kotlin
val method: Method
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook 对象的方法。
### constructor [field]
```kotlin
val constructor: Constructor
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook 对象的构造方法。
### result [field]
```kotlin
var result: Any?
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取、设置当前 Hook 对象的 `method` 或 `constructor` 的返回值。
### firstArgs [method]
```kotlin
inline fun <reified T> firstArgs(): T?
```
<b>变更记录</b>
`v1.0.66` `新增`
<b>功能描述</b>
> 获取当前 Hook 对象 [method] or [constructor] 的参数对象数组第一位 `T`。
### lastArgs [method]
```kotlin
inline fun <reified T> lastArgs(): T?
```
<b>变更记录</b>
`v1.0.66` `新增`
<b>功能描述</b>
> 获取当前 Hook 对象 [method] or [constructor] 的参数对象数组最后一位 `T`。
### instance [method]
```kotlin
inline fun <reified T> instance(): T
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook 实例的对象 `T`。
<b>功能示例</b>
你可以通过 `instance` 方法轻松使用泛型 `cast` 为目标对象的类型。
> 示例如下
```kotlin
instance<Activity>().finish()
```
### args [method]
```kotlin
fun args(index: Int): ArgsModifyer
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook 对象的 `method` 或 `constructor` 的参数实例化对象类。
<b>功能示例</b>
你可以通过 `args` 方法修改当前 Hook 实例的方法、构造方法的参数内容。
`index` 的默认值为 `0`,如果只有一位 `param` 参数,你可以不写。
你可以直接使用 `set` 方法设置 `param` 为你的目标实例,接受 `Any` 类型。
!> 请确保 `param` 类型为你的目标实例类型。
> 示例如下
```kotlin
args().set("modify the value")
```
你还可以使用 `setNull` 方法设置 `param` 为空。
> 示例如下
```kotlin
args(index = 1).setNull()
```
你还可以使用 `setTrue` 方法设置 `param``true`
!> 请确保 `param` 类型为 `Boolean`
> 示例如下
```kotlin
args(index = 2).setTrue()
```
你还可以使用 `setFalse` 方法设置 `param``false`
!> 请确保 `param` 类型为 `Boolean`
> 示例如下
```kotlin
args(index = 3).setFalse()
```
### invokeOriginal [method]
```kotlin
fun <T> Member.invokeOriginal(vararg args: Any?): Any?
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 执行原始 `Member`。
<b>功能实例</b>
此方法可以 `invoke` 原始未经 Hook 的 `Member` 对象,取决于原始 `Member` 的参数和类型。
> 示例如下
```kotlin
member.invokeOriginal("test value")
```
### resultTrue [method]
```kotlin
fun resultTrue()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 设置当前 Hook 对象方法的 `result` 返回值为 `true`。
!> 请确保 `result` 类型为 `Boolean`
### resultFalse [method]
```kotlin
fun resultFalse()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 设置当前 Hook 对象方法的 `result` 返回值为 `false`。
!> 请确保 `result` 类型为 `Boolean`
### resultNull [method]
```kotlin
fun resultNull()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
!> 此方法将强制设置 Hook 对象方法的 `result``null`
### ArgsModifyer [class]
```kotlin
inner class ArgsModifyer(private val index: Int)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 对方法参数的修改进行实例化类。
#### cast [method]
```kotlin
fun <T> cast(): T?
```
<b>变更记录</b>
`v1.0.66` `新增`
`v1.0.68` `修改`
修改 ~~`of`~~`cast`
<b>功能描述</b>
> 得到方法参数的实例对象 `T`。
#### byte [method]
```kotlin
fun byte(): Byte?
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 得到方法参数的实例对象 Byte。
#### int [method]
```kotlin
fun int(): Int
```
<b>变更记录</b>
`v1.0.66` `新增`
`v1.0.68` `修改`
修改 ~~`ofInt`~~`int`
<b>功能描述</b>
> 得到方法参数的实例对象 Int。
#### long [method]
```kotlin
fun long(): Long
```
<b>变更记录</b>
`v1.0.66` `新增`
`v1.0.68` `修改`
修改 ~~`ofLong`~~`long`
<b>功能描述</b>
> 得到方法参数的实例对象 Long。
#### short [method]
```kotlin
fun short(): Short
```
<b>变更记录</b>
`v1.0.66` `新增`
`v1.0.68` `修改`
修改 ~~`ofShort`~~`short`
<b>功能描述</b>
> 得到方法参数的实例对象 Short。
#### double [method]
```kotlin
fun double(): Double
```
<b>变更记录</b>
`v1.0.66` `新增`
`v1.0.68` `修改`
修改 ~~`ofDouble`~~`double`
<b>功能描述</b>
> 得到方法参数的实例对象 Double。
#### float [method]
```kotlin
fun float(): Float
```
<b>变更记录</b>
`v1.0.66` `新增`
`v1.0.68` `修改`
修改 ~~`ofFloat`~~`float`
<b>功能描述</b>
> 得到方法参数的实例对象 Float。
#### string [method]
```kotlin
fun string(): String
```
<b>变更记录</b>
`v1.0.66` `新增`
`v1.0.68` `修改`
修改 ~~`ofString`~~`string`
<b>功能描述</b>
> 得到方法参数的实例对象 String。
#### char [method]
```kotlin
fun char(): Char
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 得到方法参数的实例对象 Char。
#### boolean [method]
```kotlin
fun boolean(): Boolean
```
<b>变更记录</b>
`v1.0.66` `新增`
`v1.0.68` `修改`
修改 ~~`ofBoolean`~~`boolean`
<b>功能描述</b>
> 得到方法参数的实例对象 Boolean。
#### array [method]
```kotlin
inline fun <reified T> array(): Array<T>
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 得到方法参数的实例对象 Array。
#### list [method]
```kotlin
inline fun <reified T> list(): List<T>
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 得到方法参数的实例对象 List。
#### set [method]
```kotlin
fun <T> set(any: T?)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 设置方法参数的实例对象。
#### setNull [method]
```kotlin
fun setNull()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 设置方法参数的实例对象为 `null`。
#### setTrue [method]
```kotlin
fun setTrue()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 设置方法参数的实例对象为 `true`。
!> 请确保目标对象的类型是 `Boolean`
#### setFalse [method]
```kotlin
fun setFalse()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 设置方法参数的实例对象为 `false`。
!> 请确保目标对象的类型是 `Boolean`

View File

@@ -0,0 +1,17 @@
## InjectYukiHookWithXposed [annotation]
```kotlin
annotation class InjectYukiHookWithXposed(val sourcePath: String, val modulePackageName: String)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 标识 `YukiHookAPI` 注入 Xposed 入口的类注释。
<b>功能示例</b>
详情请参考 [InjectYukiHookWithXposed 注释](config/xposed-using?id=injectyukihookwithxposed-注释)。

View File

@@ -0,0 +1,73 @@
## LoggerFactory [kt]
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 这是 `YukiHookAPI` 的日志封装类,可实现同时向 `Logcat` 和 `XposedBridge.log` 打印日志的功能。
### loggerD [method]
```kotlin
fun loggerD(tag: String, msg: String)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 向 `Logcat` 和 `XposedBridge` 打印日志,级别 `D`。
`tag` 的默认参数为 `YukiHookAPI.Configs.debugTag`,你可以进行自定义。
### loggerI [method]
```kotlin
fun loggerI(tag: String, msg: String)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 向 `Logcat` 和 `XposedBridge` 打印日志,级别 `I`。
`tag` 的默认参数为 `YukiHookAPI.Configs.debugTag`,你可以进行自定义。
### loggerW [method]
```kotlin
fun loggerW(tag: String, msg: String)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 向 `Logcat` 和 `XposedBridge` 打印日志,级别 `W`。
`tag` 的默认参数为 `YukiHookAPI.Configs.debugTag`,你可以进行自定义。
### loggerE [method]
```kotlin
fun loggerE(tag: String, msg: String, e: Throwable?)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 向 `Logcat` 和 `XposedBridge` 打印日志,级别 `E`,可携带 `e` 异常信息,将打印异常堆栈。
`tag` 的默认参数为 `YukiHookAPI.Configs.debugTag`,你可以进行自定义。

View File

@@ -0,0 +1,656 @@
## MethodFinder [class]
```kotlin
class MethodFinder(override val hookInstance: YukiHookCreater.MemberHookCreater?, override val classSet: Class<*>) : BaseFinder()
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.2` `修改`
合并到 `BaseFinder`
<b>功能描述</b>
> `Method` 查找类。
### name [field]
```kotlin
var name: String
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.70` `修改`
允许不填写名称
<b>功能描述</b>
> `Method` 名称。
!> 若不填写名称则必须存在一个其它条件。
### paramCount [field]
```kotlin
var paramCount: Int
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> `Method` 参数个数。
你可以不使用 `param` 指定参数类型而是仅使用此变量指定参数个数。
若参数个数小于零则忽略并使用 `param`
### returnType [field]
```kotlin
var returnType: Any?
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> `Method` 返回值,可不填写返回值,默认模糊查找并取第一个匹配的 `Method`。
### modifiers [method]
```kotlin
fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> `Method` 筛选条件。
可不设置筛选条件,默认模糊查找并取第一个匹配的 `Method`
!> 存在多个 `IndexTypeCondition` 时除了 `order` 只会生效最后一个。
### param [method]
```kotlin
fun param(vararg paramType: Any): IndexTypeCondition
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> `Method` 参数。
如果同时使用了 `paramCount``paramTypes` 的数量必须与 `paramCount` 完全匹配。
!> 无参 `Method` 不要使用此方法。
!> 有参 `Method` 必须使用此方法设定参数或使用 `paramCount` 指定个数。
!> 存在多个 `IndexTypeCondition` 时除了 `order` 只会生效最后一个。
### order [method]
```kotlin
fun order(): IndexTypeCondition
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 顺序筛选字节码的下标。
### name [method]
```kotlin
fun name(value: String): IndexTypeCondition
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> `Method` 名称。
!> 若不填写名称则必须存在一个其它条件,默认模糊查找并取第一个匹配的 `Method`
!> 存在多个 `IndexTypeCondition` 时除了 `order` 只会生效最后一个。
### paramCount [method]
```kotlin
fun paramCount(num: Int): IndexTypeCondition
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> `Method` 参数个数。
你可以不使用 `param` 指定参数类型而是仅使用此方法指定参数个数。
若参数个数小于零则忽略并使用 `param`
!> 存在多个 `IndexTypeCondition` 时除了 `order` 只会生效最后一个。
### returnType [method]
```kotlin
fun returnType(value: Any): IndexTypeCondition
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> `Method` 返回值。
可不填写返回值,默认模糊查找并取第一个匹配的 `Method`
!> 存在多个 `IndexTypeCondition` 时除了 `order` 只会生效最后一个。
### RemedyPlan [class]
```kotlin
inner class RemedyPlan
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> `Method` 重查找实现类,可累计失败次数直到查找成功。
#### method [method]
```kotlin
fun method(initiate: MethodFinder.() -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 创建需要重新查找的 `Method`。
你可以添加多个备选方法,直到成功为止,若最后依然失败,将停止查找并输出错误日志。
#### Result [class]
```kotlin
inner class Result
```
<b>变更记录</b>
`v1.0.1` `新增`
<b>功能描述</b>
> `RemedyPlan` 结果实现类。
##### onFind [method]
```kotlin
fun onFind(initiate: Method.() -> Unit)
```
<b>变更记录</b>
`v1.0.1` `新增`
<b>功能描述</b>
> 当在 `RemedyPlan` 中找到结果时。
<b>功能示例</b>
你可以方便地对重查找的 `Method` 实现 `onFind` 方法。
> 示例如下
```kotlin
method {
// Your code here.
}.onFind {
// Your code here.
}
```
### Result [class]
```kotlin
inner class Result(internal val isNoSuch: Boolean, private val e: Throwable?)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> `Method` 查找结果实现类。
#### result [method]
```kotlin
fun result(initiate: Result.() -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 创建监听结果事件方法体。
<b>功能示例</b>
你可以使用 `lambda` 形式创建 `Result` 类。
> 示例如下
```kotlin
method {
// Your code here.
}.result {
get(instance).call()
remedys {}
onNoSuchMethod {}
}
```
#### get [method]
```kotlin
fun get(instance: Any?): Instance
```
<b>变更记录</b>
`v1.0.2` `新增`
<b>功能描述</b>
> 获得 `Method` 实例处理类。
!> 若你设置了 `remedys` 请使用 `wait` 回调结果方法。
<b>功能示例</b>
你可以通过获得方法所在实例来执行方法。
> 示例如下
```kotlin
method {
// Your code here.
}.get(instance).call()
```
若当前为静态方法,你可以不设置实例。
> 示例如下
```kotlin
method {
// Your code here.
}.get().call()
```
#### give [method]
```kotlin
fun give(): Method?
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 得到方法本身。
#### wait [method]
```kotlin
fun wait(instance: Any?, initiate: Instance.() -> Unit)
```
<b>变更记录</b>
`v1.0.2` `新增`
<b>功能描述</b>
> 获得 `Method` 实例处理类,配合 `RemedyPlan` 使用。
!> 若你设置了 `remedys` 必须使用此方法才能获得结果。
!> 若你没有设置 `remedys` 此方法将不会被回调。
#### remedys [method]
```kotlin
fun remedys(initiate: RemedyPlan.() -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 创建方法重查找功能。
<b>功能示例</b>
当你遇到一种方法可能存在不同形式的存在时,可以使用 `RemedyPlan` 重新查找它,而没有必要使用 `onNoSuchMethod` 捕获异常二次查找方法。
若第一次查找失败了,你还可以在这里继续添加此方法体直到成功为止。
> 示例如下
```kotlin
method {
// Your code here.
}.remedys {
method {
// Your code here.
}
method {
// Your code here.
}
}
```
#### onNoSuchMethod [method]
```kotlin
fun onNoSuchMethod(initiate: (Throwable) -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 监听找不到方法时。
只会返回第一次的错误信息,不会返回 `RemedyPlan` 的错误信息。
#### ignoredError [method]
```kotlin
fun ignoredError(): Result
```
<b>变更记录</b>
`v1.0.3` `新增`
<b>功能描述</b>
> 忽略任何错误发出的警告。
`isNotIgnoredHookingFailure``false` 则自动忽略。
#### Instance [class]
```kotlin
inner class Instance(private val instance: Any?)
```
<b>变更记录</b>
`v1.0.2` `新增`
<b>功能描述</b>
> `Method` 实例处理类。
##### call [method]
```kotlin
fun call(vararg param: Any?): Any?
```
<b>变更记录</b>
`v1.0.2` `新增`
<b>功能描述</b>
> 执行方法,不指定返回值类型。
##### invoke [method]
```kotlin
fun <T> invoke(vararg param: Any?): T?
```
<b>变更记录</b>
`v1.0.2` `新增`
<b>功能描述</b>
> 执行方法,指定 `T` 返回值类型。
##### byte [method]
```kotlin
fun byte(vararg param: Any?): Byte?
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 执行方法,指定 Byte 返回值类型。
##### int [method]
```kotlin
fun int(vararg param: Any?): Int
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`callInt`~~`int`
<b>功能描述</b>
> 执行方法,指定 Int 返回值类型。
##### long [method]
```kotlin
fun long(vararg param: Any?): Long
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`callLong`~~`long`
<b>功能描述</b>
> 执行方法,指定 Long 返回值类型。
##### short [method]
```kotlin
fun short(vararg param: Any?): Short
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`callShort`~~`short`
<b>功能描述</b>
> 执行方法,指定 Short 返回值类型。
##### double [method]
```kotlin
fun double(vararg param: Any?): Double
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`callDouble`~~`double`
<b>功能描述</b>
> 执行方法,指定 Double 返回值类型。
##### float [method]
```kotlin
fun float(vararg param: Any?): Float
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`callFloat`~~`float`
<b>功能描述</b>
> 执行方法,指定 Float 返回值类型。
##### string [method]
```kotlin
fun string(vararg param: Any?): String
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`callString`~~`string`
<b>功能描述</b>
> 执行方法,指定 String 返回值类型。
##### char [method]
```kotlin
fun char(vararg param: Any?): Char
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 执行方法,指定 Char 返回值类型。
##### boolean [method]
```kotlin
fun boolean(vararg param: Any?): Boolean
```
<b>变更记录</b>
`v1.0.65` `新增`
`v1.0.68` `修改`
修改 ~~`callBoolean`~~`boolean`
<b>功能描述</b>
> 执行方法,指定 Boolean 返回值类型。
#### array [method]
```kotlin
inline fun <reified T> array(vararg param: Any?): Array<T>
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 执行方法,指定 Array 返回值类型。
#### list [method]
```kotlin
inline fun <reified T> list(vararg param: Any?): List<T>
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 执行方法,指定 List 返回值类型。

View File

@@ -0,0 +1,193 @@
## ModifierRules [class]
```kotlin
class ModifierRules
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 这是一个 `Member` 描述符定义类。
可对 R8 混淆后的 `Member` 进行更加详细的定位。
### asPublic
```kotlin
fun asPublic()
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 添加描述 `Member` 类型包含 `public`。
### asPrivate
```kotlin
fun asPrivate()
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 添加描述 `Member` 类型包含 `private`。
### asProtected
```kotlin
fun asProtected()
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 添加描述 `Member` 类型包含 `protected`。
### asStatic
```kotlin
fun asStatic()
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 添加描述 `Member` 类型包含 `static`。
对于任意的静态 `Member` 可添加此描述进行确定。
!> 特别注意 Kotlin -> Jvm 后的 `object` 类中的方法并不是静态的。
### asFinal
```kotlin
fun asFinal()
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 添加描述 `Member` 类型包含 `final`。
!> 特别注意在 Kotlin -> Jvm 后没有 `open` 标识的 `Member` 和没有任何关联的 `Member` 都将为 `final`
### asSynchronized
```kotlin
fun asSynchronized()
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 添加描述 `Member` 类型包含 `synchronized`。
### asVolatile
```kotlin
fun asVolatile()
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 添加描述 `Member` 类型包含 `volatile`。
### asTransient
```kotlin
fun asTransient()
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 添加描述 `Member` 类型包含 `transient`。
### asNative
```kotlin
fun asNative()
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 添加描述 `Member` 类型包含 `native`。
对于任意 JNI 对接的 `Member` 可添加此描述进行确定。
### asInterface
```kotlin
fun asInterface()
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 添加描述 `Member` 类型包含 `interface`。
### asAbstract
```kotlin
fun asAbstract()
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 添加描述 `Member` 类型包含 `abstract`。
对于任意的抽象 `Member` 可添加此描述进行确定。
### asStrict
```kotlin
fun asStrict()
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 添加描述 `Member` 类型包含 `strict`

View File

@@ -0,0 +1,433 @@
## PackageParam [class]
```kotlin
open class PackageParam(private var wrapper: PackageParamWrapper?)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 装载 Hook 的目标 APP 入口对象实现类。
### appClassLoader [field]
```kotlin
val appClassLoaderClassLoader
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook APP 的 `ClassLoader`。
### appInfo [field]
```kotlin
val appInfo: ApplicationInfo
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook APP 的 `ApplicationInfo`。
### appContext [field]
```kotlin
val appContext: Application
```
<b>变更记录</b>
`v1.0.72` `新增`
<b>功能描述</b>
> 获取当前 Hook APP 的 `Application`。
### processName [field]
```kotlin
val processName: String
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook APP 的进程名称。
### packageName [field]
```kotlin
val packageName: String
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook APP 的包名。
### isFirstApplication [field]
```kotlin
val isFirstApplication: Boolean
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前 Hook APP 是否为第一个 `Application`。
### mainProcessName [field]
```kotlin
val mainProcessName: String
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 获取当前 Hook APP 的主进程名称。
其对应的就是 `packageName`
### prefs [field]
```kotlin
val prefs: YukiHookModulePrefs
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获得当前使用的存取数据对象缓存实例。
### prefs [method]
```kotlin
fun prefs(name: String): YukiHookModulePrefs
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获得当前使用的存取数据对象缓存实例。
你可以通过 `name` 来自定义 Sp 存储的名称。
### loadApp [method]
```kotlin
fun loadApp(name: String, initiate: PackageParam.() -> Unit)
```
```kotlin
fun loadApp(name: String, hooker: YukiBaseHooker)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 装载并 Hook 指定包名的 APP。
`name` 为 APP 的包名,后方的两个参数一个可作为 `lambda` 方法体使用,一个可以直接装载子 Hooker。
### withProcess [method]
```kotlin
fun withProcess(name: String, initiate: PackageParam.() -> Unit)
```
```kotlin
fun withProcess(name: String, hooker: YukiBaseHooker)
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 装载并 Hook APP 的指定进程。
`name` 为 APP 的进程名称,后方的两个参数一个可作为 `lambda` 方法体使用,一个可以直接装载子 Hooker。
### loadHooker [method]
```kotlin
fun loadHooker(hooker: YukiBaseHooker)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 装载 Hook 子类。
你可以填入 `hooker` 在 Hooker 中继续装载 Hooker。
### clazz [field]
```kotlin
val String.clazz: Class<*>
```
```kotlin
val VariousClass.clazz: Class<*>
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 字符串、`VariousClass` 转换为实体类。
<b>功能示例</b>
你可以轻松地将 `String` 类型的 `Class` 包名转为 `Class` 实例。
> 示例如下
```kotlin
"com.example.demo.DemoClass".clazz
```
为了美观,你可以把字符串用 `(` `)` 括起来。
> 示例如下
```kotlin
("com.example.demo.DemoClass").clazz
```
你还可以创建一个 `VariousClass`,并转换为实体类。
`VariousClass` 会枚举所有设置的 `Class` 并最终获得完全匹配的那一个。
> 示例如下
```kotlin
VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").clazz
```
### hasClass [field]
```kotlin
val String.hasClass: Boolean
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 通过字符串使用当前 `appClassLoader` 查找类是否存在。
<b>功能示例</b>
你可以轻松的使用此方法判断字符串中的类是否存在。
> 示例如下
```kotlin
if("com.example.demo.DemoClass".hasClass) {
// Your code here.
}
```
### findClass [method]
```kotlin
fun findClass(name: String): HookClass
```
```kotlin
fun findClass(vararg name: String): VariousClass
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.1` `修改`
移除了 ~~`findClass(various: VariousClass)`~~ 方法
<b>功能描述</b>
> 通过完整包名+名称查找需要被 Hook 的 `Class`。
<b>功能示例</b>
你可以使用三种方式查找你需要 Hook 的目标 `Class`
你可以直接将被查找的 `Class` 完整包名+名称填入 `name` 中。
> 示例如下
```kotlin
findClass(name = "com.example.demo.DemoClass")
```
若你不确定多个版本的 `Class` 以及不同名称,你可以将多个完整包名+名称填入 `name` 中。
> 示例如下
```kotlin
findClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2", "com.example.demo.DemoClass3")
```
你还可以创建一个 `VariousClass`,将 `Class` 的完整包名+名称填入 `VariousClass``name` 中并填入 `various` 参数中。
> 示例如下
```kotlin
val variousClass = VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2", "com.example.demo.DemoClass3")
```
### hook [method]
```kotlin
fun String.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() -> Unit): YukiHookCreater.Result
```
```kotlin
fun Class<*>.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() -> Unit): YukiHookCreater.Result
```
```kotlin
fun VariousClass.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() -> Unit): YukiHookCreater.Result
```
```kotlin
fun HookClass.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() -> Unit): YukiHookCreater.Result
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.1` `修改`
新增 `VariousClass` 的直接调用 `hook` 方法
`v1.0.2` `修改`
新增 `String` 的直接调用 `hook` 方法
`v1.0.3` `修改`
新增 `YukiHookCreater.Result` 返回值
`v1.0.70` `修改`
新增 `isUseAppClassLoader` 参数
<b>功能描述</b>
> 这是一切 Hook 的入口创建方法Hook 方法、构造类。
<b>功能示例</b>
如你所见Hook 方法体的创建可使用 4 种方式。
通过字符串类名得到 `HookClass` 实例进行创建。
> 示例如下
```kotlin
("com.example.demo.DemoClass").hook {
// Your code here.
}
```
通过 `findClass` 得到 `HookClass` 实例进行创建。
> 示例如下
```kotlin
findClass(name = "com.example.demo.DemoClass").hook {
// Your code here.
}
```
使用 `stub` 或直接拿到 `Class` 实例进行创建。
> 示例如下
```kotlin
Activity::class.java.hook {
// Your code here.
}
```
使用 `VariousClass` 实例进行创建。
> 示例如下
```kotlin
VariousClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").hook {
// Your code here.
}
```
或者直接使用可变字符串数组进行创建。
> 示例如下
```kotlin
findClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").hook {
// Your code here.
}
```
!> 以下是关于 Hook 目标 Class 的一个特殊情况说明。
若你 Hook 的 `Class` 实例的 `ClassLoader` 并不是当前的 `appClassLoader`,那么你需要做一下小的调整。
`hook` 方法中加入 `isUseAppClassLoader = false`,这样,你的 `Class` 就不会被重新绑定到 `appClassLoader` 了。
此方案适用于目标 `Class` 无法在当前 `appClassLoader` 中被得到但可以得到 `Class` 实例的情况。
> 示例如下
```kotlin
YourClass.hook(isUseAppClassLoader = false) {
// Your code here.
}
```

View File

@@ -0,0 +1,59 @@
## PrefsData [class]
```kotlin
data class PrefsData<T>(var key: String, var value: T)
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 键值对存储构造类。
这个类是对 `YukiHookModulePrefs` 的一个扩展用法。
<b>功能示例</b>
建立一个模板类定义模块与宿主需要使用的键值数据。
> 示例如下
```kotlin
object DataConst {
val TEST_KV_DATA_1 = PrefsData("test_data_1", "defalut value")
val TEST_KV_DATA_2 = PrefsData("test_data_2", false)
val TEST_KV_DATA_3 = PrefsData("test_data_3", 0)
}
```
键值数据定义后,你就可以方便地在模块和宿主中调用所需要的数据。
> 模块示例如下
```kotlin
// 读取
val data = modulePrefs.get(DataConst.TEST_KV_DATA_1)
// 写入
modulePrefs.put(DataConst.TEST_KV_DATA_1, "written value")
```
> 宿主示例如下
```kotlin
// 读取 String
val dataString = prefs.get(DataConst.TEST_KV_DATA_1)
// 读取 Boolean
val dataBoolean = prefs.get(DataConst.TEST_KV_DATA_2)
```
你依然可以不使用模板定义的默认值,随时修改你的默认值。
> 示例如下
```kotlin
// 读取 - 此时 data 取到的默认值将会是 2 - 并不是模板提供的 0
val data = prefs.get(DataConst.TEST_KV_DATA_3, 2)
```

View File

@@ -0,0 +1,383 @@
## ReflectionFactory [kt]
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 这是自定义 `Member` 和 `Class` 相关功能的查找匹配以及 `invoke` 的封装类。
### hasClass [field]
```kotlin
val String.hasClass: Boolean
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 通过字符串查找类是否存在。
<b>功能示例</b>
你可以轻松的使用此方法判断字符串中的类是否存在。
!> 此查找仅限使用当前的 `ClassLoader`,若要指定 `ClassLoader` 请使用下方的 `hasClass` 同名方法。
> 示例如下
```kotlin
if("com.example.demo.DemoClass".hasClass) {
// Your code here.
}
```
### hookClass [field]
```kotlin
val Class<*>.hookClass: HookClass
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 将 `Class` 转换为 `HookClass`。
### normalClass [field]
```kotlin
val HookClass.normalClass: Class<*>?
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 将 `HookClass` 转换为 `Class`。
### classOf [method]
```kotlin
fun classOf(name: String, loader: ClassLoader?): Class<*>
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 通过字符串使用指定的 `ClassLoader` 转换为实体类。
<b>功能示例</b>
你可以直接填写你要查找的目标 `Class`,必须在当前 `ClassLoader` 下存在。
> 示例如下
```kotlin
classOf(name = "com.example.demo.DemoClass")
```
你还可以自定义 `Class` 所在的 `ClassLoader`
> 示例如下
```kotlin
classOf(name = "com.example.demo.DemoClass", classLoader)
```
### hasClass [method]
```kotlin
fun String.hasClass(loader: ClassLoader?): Boolean
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 通过字符串使用指定的 `ClassLoader` 查找类是否存在。
### hasField [method]
```kotlin
fun Class<*>.hasField(initiate: FieldFinder.() -> Unit): Boolean
```
<b>变更记录</b>
`v1.0.4` `新增`
`v1.0.67` `修改`
合并到 `FieldFinder`
<b>功能描述</b>
> 查找变量是否存在。
### hasMethod [method]
```kotlin
fun Class<*>.hasMethod(initiate: MethodFinder.() -> Unit): Boolean
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.1` `修改`
新增 `returnType` 参数
`v1.0.67` `修改`
合并到 `MethodFinder`
<b>功能描述</b>
> 查找方法是否存在。
### hasConstructor [method]
```kotlin
fun Class<*>.hasConstructor(initiate: ConstructorFinder.() -> Unit): Boolean
```
<b>变更记录</b>
`v1.0.2` `新增`
`v1.0.67` `修改`
合并到 `ConstructorFinder`
<b>功能描述</b>
> 查找构造方法是否存在。
### hasModifiers [method]
```kotlin
fun Member.hasModifiers(initiate: ModifierRules.() -> Unit): Boolean
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 查询 `Member` 中匹配的描述符。
### ~~obtainStaticFieldAny [method]~~ <!-- {docsify-ignore} -->
<b>变更记录</b>
`v1.0` `添加`
`v1.0.1` `移除`
### ~~obtainFieldAny [method]~~ <!-- {docsify-ignore} -->
<b>变更记录</b>
`v1.0` `添加`
`v1.0.1` `移除`
### ~~modifyStaticField [method]~~ <!-- {docsify-ignore} -->
<b>变更记录</b>
`v1.0` `添加`
`v1.0.1` `移除`
### ~~modifyField [method]~~ <!-- {docsify-ignore} -->
<b>变更记录</b>
`v1.0` `添加`
`v1.0.1` `移除`
### field [method]
```kotlin
fun Class<*>.field(initiate: FieldFinder.() -> Unit): FieldFinder.Result
```
<b>变更记录</b>
`v1.0.2` `新增`
<b>功能描述</b>
> 查找并得到变量。
### method [method]
```kotlin
fun Class<*>.method(initiate: MethodFinder.() -> Unit): MethodFinder.Result
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.1` `修改`
~~`obtainMethod`~~ 更名为 `method`
新增 `returnType` 参数
`v1.0.2` `修改`
合并到 `MethodFinder` 方法体。
<b>功能描述</b>
> 查找并得到方法。
### constructor [method]
```kotlin
fun Class<*>.constructor(initiate: ConstructorFinder.() -> Unit): ConstructorFinder.Result
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.1` `修改`
~~`obtainConstructor`~~ 更名为 `constructor`
`v1.0.2` `修改`
合并到 `ConstructorFinder` 方法体。
<b>功能描述</b>
> 查找并得到构造类。
### ~~callStatic [method]~~ <!-- {docsify-ignore} -->
<b>变更记录</b>
`v1.0` `添加`
`v1.0.1` `修改`
~~`invokeStatic`~~ 更名为 `callStatic`
`v1.0.2` `移除`
### ~~call [method]~~ <!-- {docsify-ignore} -->
<b>变更记录</b>
`v1.0` `添加`
`v1.0.1` `修改`
~~`invokeAny`~~ 更名为 `call`
`v1.0.2` `移除`
### current [method]
```kotlin
inline fun <reified T : Any> T.current(initiate: CurrentClass.() -> Unit): T
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 获得当前实例的类操作对象。
### buildOf [method]
```kotlin
fun <T> Class<*>.buildOf(vararg param: Any?, initiate: ConstructorFinder.() -> Unit): T?
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 通过构造方法创建新实例,指定类型 `T`。
### buildOfAny [method]
```kotlin
fun Class<*>.buildOfAny(vararg param: Any?, initiate: ConstructorFinder.() -> Unit): Any?
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 通过构造方法创建新实例,任意类型 `Any`。
### allMethods [method]
```kotlin
fun Class<*>.allMethods(callback: (index: Int, method: Method) -> Unit)
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 遍历当前类中的所有方法。
### allConstructors [method]
```kotlin
fun Class<*>.allConstructors(callback: (index: Int, constructor: Constructor<*>) -> Unit)
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 遍历当前类中的所有构造方法。
### allFields [method]
```kotlin
fun Class<*>.allFields(callback: (index: Int, field: Field) -> Unit)
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 遍历当前类中的所有变量。

View File

@@ -0,0 +1,11 @@
## VariableTypeFactory [kt]
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 这是一个预置 Hook 类型的常量类,主要为 `Java` 相关基本变量类型的 `Class` 内容,跟随版本更新会逐一进行增加。
详情可 [点击这里](https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/java/VariableTypeFactory.kt) 进行查看。

View File

@@ -0,0 +1,29 @@
## VariousClass [class]
```kotlin
class VariousClass(vararg var name: String)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 这是一个不确定性 `Class` 类名装载器,通过 `name` 装载 `Class` 名称数组。
### get [method]
```kotlin
fun get(loader: ClassLoader? = null): Class<*>
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 获取匹配的实体类。
使用当前 `loader` 装载目标 `Class`

View File

@@ -0,0 +1,11 @@
## ViewTypeFactory [kt]
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 这是一个预置 Hook 类型的常量类,主要为 `Android` 相关 `Widget` 的 `Class` 内容,跟随版本更新会逐一进行增加。
详情可 [点击这里](https://github.com/fankes/YukiHookAPI/blob/master/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/type/android/ViewTypeFactory.kt) 进行查看。

View File

@@ -0,0 +1,27 @@
## YukiBaseHooker [class]
```kotlin
abstract class YukiBaseHooker : PackageParam()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> `YukiHookAPI` 的子类 Hooker 实现。
### onHook [method]
```kotlin
fun onHook()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 子类 Hook 开始。

View File

@@ -0,0 +1,296 @@
## YukiHookAPI [object]
```kotlin
object YukiHookAPI
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 这是 `YukiHookAPI` 的 API 调用总类Hook 相关功能的开始、Hook 相关功能的配置都在这里。
### API_VERSION_NAME [field]
```kotlin
const val API_VERSION_NAME: String
```
<b>变更记录</b>
`v1.0.4` `新增`
<b>功能描述</b>
> 获取当前 `YukiHookAPI` 的版本。
### API_VERSION_CODE [field]
```kotlin
const val API_VERSION_CODE: Int
```
<b>变更记录</b>
`v1.0.4` `新增`
<b>功能描述</b>
> 获取当前 `YukiHookAPI` 的版本号。
### executorName [field]
```kotlin
val executorName: String
```
<b>变更记录</b>
`v1.0.5` `新增`
<b>功能描述</b>
> 获取当前 Hook 框架的名称。
无法获取会返回 `unknown``XposedBridge` 不存在会返回 `invalid`
### executorVersion [field]
```kotlin
val executorVersion: Int
```
<b>变更记录</b>
`v1.0.5` `新增`
<b>功能描述</b>
> 获取当前 Hook 框架的版本。
无法获取会返回 `-1`
### Configs [object]
```kotlin
object Configs
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 对 API 相关功能的配置类。
#### debugTag [field]
```kotlin
var debugTag: String
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 模块在调用 `logger` 时打印的日志 `TAG` 名称。
你可以方便地进行自定义,并可以在 `Logcat``XposedBridge.log` 中找到它们。
#### isDebug [field]
```kotlin
var isDebug: Boolean
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 是否启用 DEBUG 模式。
默认为开启状态,开启后模块将会向 `Logcat``XposedBridge.log` 打印详细的 Hook 日志,关闭后仅会打印 `E` 级别的日志。
#### isAllowPrintingLogs [field]
```kotlin
var isAllowPrintingLogs: Boolean
```
<b>变更记录</b>
`v1.0.4` `新增`
<b>功能描述</b>
> 是否启用调试日志的输出功能。
!> 关闭后将会停用 `YukiHookAPI` 对全部日志的输出,但是不影响当你手动调用日志方法输出日志。
#### isEnableModulePrefsCache [field]
```kotlin
var isEnableModulePrefsCache: Boolean
```
<b>变更记录</b>
`v1.0.5` `新增`
<b>功能描述</b>
> 是否启用 `YukiHookModulePrefs` 的键值缓存功能。
为防止内存复用过高问题,此功能默认启用。
你可以手动在 `YukiHookModulePrefs` 中自由开启和关闭缓存功能以及清除缓存。
#### isEnableMemberCache [field]
```kotlin
var isEnableMemberCache: Boolean
```
<b>变更记录</b>
`v1.0.68` `新增`
<b>功能描述</b>
> 是否启用 `Member` 缓存功能。
为防止 `Member` 复用过高造成的系统 GC 问题,此功能默认启用。
启用后会缓存已经找到的 `Class``Method``Constructor``Field`
缓存的 `Member` 都将处于 `MemberCacheStore` 的全局静态实例中。
推荐使用 `MethodFinder``ConstructorFinder``FieldFinder` 来获取 `Member`
除非缓存的 `Member` 发生了混淆的问题,例如使用 R8 混淆后的 APP 的目标 `Member`,否则建议启用。
### configs [method]
```kotlin
fun configs(initiate: Configs.() -> Unit)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 对 `Configs` 类实现了一个 `lambda` 方法体。
你可以轻松的调用它进行配置。
<b>功能示例</b>
你可以在 `HookEntryClass``onInit` 方法中调用 `configs` 方法完成对 API 的功能配置,实时生效。
> 示例如下
```kotlin
class HookEntryClass : YukiHookXposedInitProxy {
override fun onInit() {
YukiHookAPI.configs {
debugTag = "YukiHookAPI"
isDebug = true
isAllowPrintingLogs = true
isEnableModulePrefsCache = true
isEnableMemberCache = true
}
}
override fun onHook() {
// Your code here.
}
}
```
若觉得上面的写法不美观,你还可以写得更加简洁。
> 示例如下
```kotlin
class HookEntryClass : YukiHookXposedInitProxy {
override fun onInit() = configs {
debugTag = "YukiHookAPI"
isDebug = true
isAllowPrintingLogs = true
isEnableModulePrefsCache = true
isEnableMemberCache = true
}
override fun onHook() {
// Your code here.
}
}
```
你也可以不通过 `configs` 方法,直接进行配置。
> 示例如下
```kotlin
class HookEntryClass : YukiHookXposedInitProxy {
override fun onInit() {
YukiHookAPI.Configs.debugTag = "YukiHookAPI"
YukiHookAPI.Configs.isDebug = true
YukiHookAPI.Configs.isAllowPrintingLogs = true
YukiHookAPI.Configs.isEnableModulePrefsCache = true
YukiHookAPI.Configs.isEnableMemberCache = true
}
override fun onHook() {
// Your code here.
}
}
```
### encase [method]
```kotlin
fun encase(initiate: PackageParam.() -> Unit)
```
```kotlin
fun encase(vararg hooker: YukiBaseHooker)
```
```kotlin
fun encase(baseContext: Context?, initiate: PackageParam.() -> Unit)
```
```kotlin
fun encase(baseContext: Context?, vararg hooker: YukiBaseHooker)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 装载 Hook 入口的核心方法。
<b>功能示例</b>
详情请参考
- [通过 Lambda 创建](config/api-example?id=通过-lambda-创建)
- [通过自定义 Hooker 创建](config/api-example?id=通过自定义-hooker-创建)
- [作为 Hook API 使用需要注意的地方](config/api-example?id=作为-hook-api-使用需要注意的地方)

View File

@@ -0,0 +1,694 @@
## YukiHookCreater [class]
```kotlin
class YukiHookCreater(private val packageParam: PackageParam, private val hookClass: HookClass)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> `YukiHookAPI` 核心 Hook 实现类。
### instanceClass [field]
```kotlin
val instanceClass: Class<*>
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.2` `修改`
~~`thisClass`~~ 更名为 `instanceClass`
<b>功能描述</b>
> 得到当前被 Hook 的 `Class`。
!> 不推荐直接使用,万一得不到 `Class` 对象则会无法处理异常导致崩溃。
### injectMember [method]
```kotlin
fun injectMember(tag: String, initiate: MemberHookCreater.() -> Unit): MemberHookCreater.Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 注入要 Hook 的方法、构造类。
<b>功能示例</b>
你可以注入任意方法与构造类,使用 `injectMember` 即可创建一个 `Hook` 对象。
> 示例如下
```kotlin
injectMember {
// Your code here.
}
```
你还可以自定义 `tag`,方便你在调试的时候能够区分你的 `Hook` 对象。
> 示例如下
```kotlin
injectMember(tag = "KuriharaYuki") {
// Your code here.
}
```
### MemberHookCreater [class]
```kotlin
inner class MemberHookCreater(var tag: String)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> Hook 核心功能实现类,查找和处理需要 Hook 的方法、构造类。
#### member [field]
```kotlin
var member: Member?
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 手动指定要 Hook 的方法、构造类。
!> 不建议使用此方法设置目标需要 Hook 的 `Member` 对象,你可以使用 `method``constructor` 方法。
<b>功能示例</b>
你可以调用 `instanceClass` 来手动查询要 Hook 的方法。
> 示例如下
```kotlin
injectMember {
member = instanceClass.getMethod("test", StringType)
beforeHook {}
afterHook {}
}
```
#### allMethods [method]
```kotlin
fun allMethods(name: String)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 查找并 Hook 当前 `Class` 中指定 `name` 的全部方法。
<b>功能示例</b>
使用此方法可将当前类的全部同名方法进行批量 Hook。
!> 无法准确处理每个方法的 `param`,建议使用 `method` 对每个方法单独 Hook。
> 示例如下
```kotlin
injectMember {
allMethods(name = "test")
beforeHook {}
afterHook {}
}
```
#### allConstructors [method]
```kotlin
fun allConstructors()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 查找并 Hook 当前 `Class` 中的全部构造方法。
<b>功能示例</b>
使用此方法可将当前类的全部构造方法进行批量 Hook。
!> 无法准确处理每个构造方法的 `param`,建议使用 `constructor` 对每个构造方法单独 Hook。
> 示例如下
```kotlin
injectMember {
allConstructors()
beforeHook {}
afterHook {}
}
```
#### method [method]
```kotlin
fun method(initiate: MethodFinder.() -> Unit): MethodFinder.Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 查找当前 `Class` 需要 Hook 的方法。
<b>功能示例</b>
你可参考 [MethodFinder](#methodfinder-class) 查看详细用法。
> 示例如下
```kotlin
injectMember {
method {
name = "test"
param(StringType)
returnType = UnitType
}
beforeHook {}
afterHook {}
}
```
#### constructor [method]
```kotlin
fun constructor(initiate: ConstructorFinder.() -> Unit): ConstructorFinder.Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 查找当前 `Class` 需要 Hook 的构造方法。
<b>功能示例</b>
你可参考 [ConstructorFinder](#constructorfinder-class) 查看详细用法。
> 示例如下
```kotlin
injectMember {
constructor { param(StringType) }
beforeHook {}
afterHook {}
}
```
#### field [method]
```kotlin
fun HookParam.field(initiate: FieldFinder.() -> Unit): FieldFinder.Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 使用当前 `hookClass` 查找并得到 `Field`。
<b>功能示例</b>
你可参考 [FieldFinder](#fieldfinder-class) 查看详细用法。
> 示例如下
```kotlin
injectMember {
method {
name = "test"
param(StringType)
returnType = UnitType
}
afterHook {
field {
name = "isSweet"
type = BooleanType
}.get(instance).setTrue()
}
}
```
#### method [method]
```kotlin
fun HookParam.method(initiate: MethodFinder.() -> Unit): MethodFinder.Result
```
<b>变更记录</b>
`v1.0.2` `添加`
<b>功能描述</b>
> 使用当前 `hookClass` 查找并得到方法。
#### constructor [method]
```kotlin
fun HookParam.constructor(initiate: ConstructorFinder.() -> Unit): ConstructorFinder.Result
```
<b>变更记录</b>
`v1.0.2` `添加`
<b>功能描述</b>
> 使用当前 `hookClass` 查找并得到构造方法。
#### beforeHook [method]
```kotlin
fun beforeHook(initiate: HookParam.() -> Unit)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 在方法执行完成前 Hook。
#### afterHook [method]
```kotlin
fun afterHook(initiate: HookParam.() -> Unit)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 在方法执行完成后 Hook。
#### replaceAny [method]
```kotlin
fun replaceAny(initiate: HookParam.() -> Any?)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 拦截并替换此方法内容,给出返回值。
#### replaceUnit [method]
```kotlin
fun replaceUnit(initiate: HookParam.() -> Unit)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 拦截并替换此方法内容,没有返回值,可以称为 `Void`。
#### replaceTo [method]
```kotlin
fun replaceTo(any: Any?)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 拦截并替换方法返回值。
#### replaceToTrue [method]
```kotlin
fun replaceToTrue()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 拦截并替换方法返回值为 `true`。
!> 确保替换方法的返回对象为 `Boolean`
#### replaceToFalse [method]
```kotlin
fun replaceToFalse()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 拦截并替换方法返回值为 `false`。
!> 确保替换方法的返回对象为 `Boolean`
#### intercept [method]
```kotlin
fun intercept()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 拦截此方法。
!> 这将会禁止此方法执行并返回 `null`
#### Result [class]
```kotlin
inner class Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 监听 Hook 结果实现类。
##### result [method]
```kotlin
fun result(initiate: Result.() -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
`v1.0.5` `修改`
~~`failures`~~ 修改为 `result`
<b>功能描述</b>
> 创建监听失败事件方法体。
<b>功能示例</b>
你可以使用此方法为 `Result` 类创建 `lambda` 方法体。
> 示例如下
```kotlin
injectMember {
// Your code here.
}.result {
onHooked {}
ignoredConductFailure()
onHookingFailure {}
// ...
}
```
##### by [method]
```kotlin
fun by(initiate: () -> Boolean): Result
```
<b>变更记录</b>
`v1.0.5` `新增`
<b>功能描述</b>
> 添加执行 Hook 需要满足的条件,不满足条件将直接停止 Hook。
##### onHooked [method]
```kotlin
fun onHooked(initiate: (Member) -> Unit): Result
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 监听 `member` Hook 成功的回调方法。
在首次 Hook 成功后回调。
##### onNoSuchMemberFailure [method]
```kotlin
fun onNoSuchMemberFailure(initiate: (Throwable) -> Unit): Result
```
<b>变更记录</b>
`v1.0.5` `新增`
<b>功能描述</b>
> 监听 `member` 不存在发生错误的回调方法。
##### onConductFailure [method]
```kotlin
fun onConductFailure(initiate: (HookParam, Throwable) -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 监听 Hook 进行过程中发生错误的回调方法。
##### onHookingFailure [method]
```kotlin
fun onHookingFailure(initiate: (Throwable) -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 监听 Hook 开始时发生的错误的回调方法。
##### onAllFailure [method]
```kotlin
fun onAllFailure(initiate: (Throwable) -> Unit): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 监听全部 Hook 过程发生错误的回调方法。
##### ignoredNoSuchMemberFailure [method]
```kotlin
fun ignoredNoSuchMemberFailure(): Result
```
<b>变更记录</b>
`v1.0.5` `新增`
<b>功能描述</b>
> 忽略 `member` 不存在发生的错误。
##### ignoredConductFailure [method]
```kotlin
fun ignoredConductFailure(): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 忽略 Hook 进行过程中发生的错误。
##### ignoredHookingFailure [method]
```kotlin
fun ignoredHookingFailure(): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 忽略 Hook 开始时发生的错误。
##### ignoredAllFailure [method]
```kotlin
fun ignoredAllFailure(): Result
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 忽略全部 Hook 过程发生的错误。
### Result [class]
```kotlin
inner class Result
```
<b>变更记录</b>
`v1.0.3` `新增`
<b>功能描述</b>
> 监听全部 Hook 结果实现类。
#### result [method]
```kotlin
fun result(initiate: Result.() -> Unit): Result
```
<b>变更记录</b>
`v1.0.3` `新增`
`v1.0.5` `修改`
~~`failures`~~ 修改为 `result`
<b>功能描述</b>
> 创建监听事件方法体。
#### by [method]
```kotlin
fun by(initiate: () -> Boolean): Result
```
<b>变更记录</b>
`v1.0.5` `新增`
<b>功能描述</b>
> 添加执行 Hook 需要满足的条件,不满足条件将直接停止 Hook。
#### onPrepareHook [method]
```kotlin
fun onPrepareHook(initiate: () -> Unit): Result
```
<b>变更记录</b>
`v1.0.70` `新增`
<b>功能描述</b>
> 监听 `hookClass` 存在时准备开始 Hook 的操作。
#### onHookClassNotFoundFailure [method]
```kotlin
fun onHookClassNotFoundFailure(initiate: (Throwable) -> Unit): Result
```
<b>变更记录</b>
`v1.0.3` `新增`
<b>功能描述</b>
> 监听 `hookClass` 找不到时发生错误的回调方法。
#### ignoredHookClassNotFoundFailure [method]
```kotlin
fun ignoredHookClassNotFoundFailure(): Result
```
<b>变更记录</b>
`v1.0.3` `新增`
<b>功能描述</b>
> 忽略 `hookClass` 找不到时出现的错误。

View File

@@ -0,0 +1,125 @@
## YukiHookFactory [kt]
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 这是 `YukiHookAPI` 相关 `lambda` 方法的封装类以及部分 API 用法。
### configs [method]
```kotlin
fun YukiHookXposedInitProxy.configs(initiate: YukiHookAPI.Configs.() -> Unit)
```
<b>变更记录</b>
`v1.0.1` `新增`
<b>功能描述</b>
> 在 `YukiHookXposedInitProxy` 中配置 `Configs`。
### encase [method]
```kotlin
fun YukiHookXposedInitProxy.encase(initiate: PackageParam.() -> Unit)
```
```kotlin
fun YukiHookXposedInitProxy.encase(vararg hooker: YukiBaseHooker)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 在 `YukiHookXposedInitProxy` 中装载 `YukiHookAPI`。
### modulePrefs [field]
```kotlin
val Context.modulePrefs: YukiHookModulePrefs
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取模块的存取对象。
### modulePrefs [method]
```kotlin
fun Context.modulePrefs(name: String): YukiHookModulePrefs
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取模块的存取对象,可设置 `name` 为自定义 Sp 存储名称。
### processName [field]
```kotlin
val Context.processName: String
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取当前进程名称。
### isModuleActive [field]
```kotlin
val Context.isModuleActive: Boolean
```
<b>变更记录</b>
`v1.0.6` `新增`
<b>功能描述</b>
> 判断模块是否在 Xposed 或太极、无极中激活。
### isXposedModuleActive [field]
```kotlin
val Any?.isXposedModuleActive: Boolean
```
<b>变更记录</b>
`v1.0.6` `新增`
<b>功能描述</b>
> 仅判断模块是否在 Xposed 中激活。
### isTaiChiModuleActive [field]
```kotlin
val Context.isTaiChiModuleActive: Boolean
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 仅判断模块是否在太极、无极中激活。

View File

@@ -0,0 +1,309 @@
## YukiHookModulePrefs [class]
```kotlin
class YukiHookModulePrefs(private val context: Context?)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 实现 Xposed 模块的数据存取,对接 `SharedPreferences` 和 `XSharedPreferences`。
在不同环境智能选择存取使用的对象。
!> 请注意此功能为实验性功能,仅在 LSPosed 环境测试通过EdXposed 理论也可以使用但不再推荐。
使用 LSPosed 环境请在 `AndroidManifests.xml` 中将 `xposedminversion` 最低设置为 `93`
详见 [New XSharedPreferences](https://github.com/LSPosed/LSPosed/wiki/New-XSharedPreferences#for-the-module)。
未使用 LSPosed 环境请将你的模块 `API` 降至 `26` 以下,`YukiHookAPI` 将会尝试使用 `makeWorldReadable` 但仍有可能不成功。
太极请参阅 [文件权限/配置/XSharedPreference](https://taichi.cool/zh/doc/for-xposed-dev.html#文件权限-配置-xsharedpreference)。
!> 当你在 Xposed 模块中存取数据的时候 `context` 必须不能是空的。
### name [method]
```kotlin
fun name(name: String): YukiHookModulePrefs
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 自定义 Sp 存储名称。
<b>功能示例</b>
`Activity` 中的使用方法。
> 示例如下
```kotlin
modulePrefs("custom_name").getString("custom_key")
```
在 Xposed 模块环境 `PackageParam` 中的使用方法。
> 示例如下
```kotlin
prefs("custom_name").getString("custom_key")
```
### direct [method]
```kotlin
fun direct(): YukiHookModulePrefs
```
<b>变更记录</b>
`v1.0.5` `新增`
<b>功能描述</b>
> 忽略缓存直接读取键值。
无论是否开启 `YukiHookAPI.Configs.isEnableModulePrefsCache`
仅在 `XSharedPreferences` 下生效。
### getString [method]
```kotlin
fun getString(key: String, value: String): String
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取 `String` 键值。
### getBoolean [method]
```kotlin
fun getBoolean(key: String, value: Boolean): Boolean
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取 `Boolean` 键值。
### getInt [method]
```kotlin
fun getInt(key: String, value: Int): Int
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取 `Int` 键值。
### getLong [method]
```kotlin
fun getLong(key: String, value: Long): Long
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取 `Long` 键值。
### getFloat [method]
```kotlin
fun getFloat(key: String, value: Float): Float
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 获取 `Float` 键值。
### remove [method]
```kotlin
fun remove(key: String)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 移除全部包含 `key` 的存储数据。
!> 在 `XSharedPreferences` 环境下只读,无法使用。
### remove [method]
```kotlin
inline fun <reified T> remove(prefs: PrefsData<T>)
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 移除 `PrefsData.key` 的存储数据。
!> 在 `XSharedPreferences` 环境下只读,无法使用。
### putString [method]
```kotlin
fun putString(key: String, value: String)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 存储 `String` 键值。
!> 在 `XSharedPreferences` 环境下只读,无法使用。
### putBoolean [method]
```kotlin
fun putBoolean(key: String, value: Boolean)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 存储 `Boolean` 键值。
!> 在 `XSharedPreferences` 环境下只读,无法使用。
### putInt [method]
```kotlin
fun putInt(key: String, value: Int)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 存储 `Int` 键值。
!> 在 `XSharedPreferences` 环境下只读,无法使用。
### putLong [method]
```kotlin
fun putLong(key: String, value: Long)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 存储 `Long` 键值。
!> 在 `XSharedPreferences` 环境下只读,无法使用。
### putFloat [method]
```kotlin
fun putFloat(key: String, value: Float)
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 存储 `Float` 键值。
!> 在 `XSharedPreferences` 环境下只读,无法使用。
### get [method]
```kotlin
inline fun <reified T> get(prefs: PrefsData<T>, value: T): T
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 智能获取指定类型的键值。
### put [method]
```kotlin
inline fun <reified T> put(prefs: PrefsData<T>, value: T)
```
<b>变更记录</b>
`v1.0.67` `新增`
<b>功能描述</b>
> 智能存储指定类型的键值。
!> 在 `XSharedPreferences` 环境下只读,无法使用。
### clearCache [method]
```kotlin
fun clearCache()
```
<b>变更记录</b>
`v1.0.5` `新增`
<b>功能描述</b>
> 清除 `XSharedPreferences` 中缓存的键值数据。
无论是否开启 `YukiHookAPI.Configs.isEnableModulePrefsCache`
调用此方法将清除当前存储的全部键值缓存。
下次将从 `XSharedPreferences` 重新读取。

View File

@@ -0,0 +1,55 @@
## YukiHookModuleStatus [class]
```kotlin
object YukiHookModuleStatus
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> 这是一个 Xposed 模块 Hook 状态类。
### executorName [field]
```kotlin
val executorName: String
```
<b>变更记录</b>
`v1.0.5` `新增`
<b>功能描述</b>
> 获取当前 Hook 框架的名称。
模块未激活会返回 `unknown`,获取过程发生错误会返回 `invalid`
### executorVersion [field]
```kotlin
val executorVersion: Int
```
<b>变更记录</b>
`v1.0.5` `新增`
<b>功能描述</b>
> 获取当前 Hook 框架的版本。
模块未激活会返回 `-1`
### ~~isActive [method]~~ <!-- {docsify-ignore} -->
<b>变更记录</b>
`v1.0` `添加`
`v1.0.6` `作废`
请使用 `isModuleActive``isXposedModuleActive``isTaiChiModuleActive`

View File

@@ -0,0 +1,45 @@
## YukiHookXposedInitProxy [interface]
```kotlin
interface YukiHookXposedInitProxy
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> YukiHookAPI 的 Xposed 装载 API 调用接口。
### onInit [method]
```kotlin
fun onInit()
```
<b>变更记录</b>
`v1.0.5` `新增`
<b>功能描述</b>
> 配置 `YukiHookAPI.Configs` 的初始化方法。
!> 在这里只能进行初始化配置,不能进行 Hook 操作。
此方法可选,你也可以选择不对 `YukiHookAPI.Configs` 进行配置。
### onHook [method]
```kotlin
fun onHook()
```
<b>变更记录</b>
`v1.0` `添加`
<b>功能描述</b>
> Xposed API 的模块装载调用入口方法。