Merge code to inline method, improve execution efficiency

This commit is contained in:
2022-04-25 02:37:22 +08:00
parent 44c3401831
commit 4131772c12
24 changed files with 418 additions and 181 deletions

View File

@@ -20,7 +20,6 @@
# hide the original source file name. # hide the original source file name.
#-renamesourcefileattribute SourceFile #-renamesourcefileattribute SourceFile
-dontwarn
-ignorewarnings -ignorewarnings
-optimizationpasses 10 -optimizationpasses 10

View File

@@ -41,6 +41,11 @@ android {
} }
kotlinOptions { kotlinOptions {
jvmTarget = '11' jvmTarget = '11'
freeCompilerArgs = [
'-Xno-param-assertions',
'-Xno-call-assertions',
'-Xno-receiver-assertions'
]
} }
buildFeatures { buildFeatures {
viewBinding true viewBinding true

View File

@@ -20,7 +20,6 @@
# hide the original source file name. # hide the original source file name.
#-renamesourcefileattribute SourceFile #-renamesourcefileattribute SourceFile
-dontwarn
-ignorewarnings -ignorewarnings
-optimizationpasses 10 -optimizationpasses 10

View File

@@ -37,13 +37,17 @@ var paramCount: Int
### modifiers [method] ### modifiers [method]
```kotlin ```kotlin
fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition inline fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition
``` ```
**变更记录** **变更记录**
`v1.0.67` `新增` `v1.0.67` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 设置 `Constructor` 标识符筛选条件。 > 设置 `Constructor` 标识符筛选条件。
@@ -125,13 +129,17 @@ inner class RemedyPlan
#### constructor [method] #### constructor [method]
```kotlin ```kotlin
fun constructor(initiate: ConstructorFinder.() -> Unit) inline fun constructor(initiate: ConstructorFinder.() -> Unit)
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 创建需要重新查找的 `Constructor`。 > 创建需要重新查找的 `Constructor`。
@@ -183,7 +191,7 @@ constructor {
### Result [class] ### Result [class]
```kotlin ```kotlin
inner class Result(internal val isNoSuch: Boolean, private val e: Throwable?) inner class Result(internal val isNoSuch: Boolean, internal val e: Throwable?)
``` ```
**变更记录** **变更记录**
@@ -197,13 +205,17 @@ inner class Result(internal val isNoSuch: Boolean, private val e: Throwable?)
#### result [method] #### result [method]
```kotlin ```kotlin
fun result(initiate: Result.() -> Unit): Result inline fun result(initiate: Result.() -> Unit): Result
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 创建监听结果事件方法体。 > 创建监听结果事件方法体。
@@ -307,13 +319,17 @@ fun wait(initiate: Instance.() -> Unit)
#### remedys [method] #### remedys [method]
```kotlin ```kotlin
fun remedys(initiate: RemedyPlan.() -> Unit): Result inline fun remedys(initiate: RemedyPlan.() -> Unit): Result
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 创建构造方法重查找功能。 > 创建构造方法重查找功能。
@@ -342,13 +358,17 @@ constructor {
#### onNoSuchConstructor [method] #### onNoSuchConstructor [method]
```kotlin ```kotlin
fun onNoSuchConstructor(initiate: (Throwable) -> Unit): Result inline fun onNoSuchConstructor(initiate: (Throwable) -> Unit): Result
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 监听找不到构造方法时。 > 监听找不到构造方法时。

View File

@@ -63,13 +63,17 @@ var type: Any?
### modifiers [method] ### modifiers [method]
```kotlin ```kotlin
fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition inline fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition
``` ```
**变更记录** **变更记录**
`v1.0.67` `新增` `v1.0.67` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 设置 `Field` 标识符筛选条件。 > 设置 `Field` 标识符筛选条件。
@@ -145,13 +149,17 @@ inner class Result(internal val isNoSuch: Boolean, private val e: Throwable?)
#### result [method] #### result [method]
```kotlin ```kotlin
fun result(initiate: Result.() -> Unit): Result inline fun result(initiate: Result.() -> Unit): Result
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 创建监听结果事件方法体。 > 创建监听结果事件方法体。

View File

@@ -71,13 +71,17 @@ var returnType: Any?
### modifiers [method] ### modifiers [method]
```kotlin ```kotlin
fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition inline fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition
``` ```
**变更记录** **变更记录**
`v1.0.67` `新增` `v1.0.67` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 设置 `Method` 标识符筛选条件。 > 设置 `Method` 标识符筛选条件。
@@ -209,13 +213,17 @@ inner class RemedyPlan
#### method [method] #### method [method]
```kotlin ```kotlin
fun method(initiate: MethodFinder.() -> Unit): Result inline fun method(initiate: MethodFinder.() -> Unit): Result
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 创建需要重新查找的 `Method`。 > 创建需要重新查找的 `Method`。
@@ -281,13 +289,17 @@ inner class Result(internal val isNoSuch: Boolean, private val e: Throwable?)
#### result [method] #### result [method]
```kotlin ```kotlin
fun result(initiate: Result.() -> Unit): Result inline fun result(initiate: Result.() -> Unit): Result
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 创建监听结果事件方法体。 > 创建监听结果事件方法体。
@@ -381,13 +393,17 @@ fun wait(instance: Any?, initiate: Instance.() -> Unit)
#### remedys [method] #### remedys [method]
```kotlin ```kotlin
fun remedys(initiate: RemedyPlan.() -> Unit): Result inline fun remedys(initiate: RemedyPlan.() -> Unit): Result
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 创建方法重查找功能。 > 创建方法重查找功能。
@@ -416,13 +432,17 @@ method {
#### onNoSuchMethod [method] #### onNoSuchMethod [method]
```kotlin ```kotlin
fun onNoSuchMethod(initiate: (Throwable) -> Unit): Result inline fun onNoSuchMethod(initiate: (Throwable) -> Unit): Result
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 监听找不到方法时。 > 监听找不到方法时。

View File

@@ -136,6 +136,10 @@ fun prefs(name: String): YukiHookModulePrefs
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 获得当前使用的存取数据对象缓存实例。 > 获得当前使用的存取数据对象缓存实例。
@@ -145,7 +149,7 @@ fun prefs(name: String): YukiHookModulePrefs
### loadApp [method] ### loadApp [method]
```kotlin ```kotlin
fun loadApp(name: String, initiate: PackageParam.() -> Unit) inline fun loadApp(name: String, initiate: PackageParam.() -> Unit)
``` ```
```kotlin ```kotlin
@@ -156,6 +160,10 @@ fun loadApp(name: String, hooker: YukiBaseHooker)
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 装载并 Hook 指定包名的 APP。 > 装载并 Hook 指定包名的 APP。
@@ -165,7 +173,7 @@ fun loadApp(name: String, hooker: YukiBaseHooker)
### withProcess [method] ### withProcess [method]
```kotlin ```kotlin
fun withProcess(name: String, initiate: PackageParam.() -> Unit) inline fun withProcess(name: String, initiate: PackageParam.() -> Unit)
``` ```
```kotlin ```kotlin
@@ -323,19 +331,19 @@ val variousClass = VariousClass("com.example.demo.DemoClass1", "com.example.demo
### hook [method] ### hook [method]
```kotlin ```kotlin
fun String.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() -> Unit): YukiHookCreater.Result inline fun String.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() -> Unit): YukiHookCreater.Result
``` ```
```kotlin ```kotlin
fun Class<*>.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() -> Unit): YukiHookCreater.Result inline fun Class<*>.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() -> Unit): YukiHookCreater.Result
``` ```
```kotlin ```kotlin
fun VariousClass.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() -> Unit): YukiHookCreater.Result inline fun VariousClass.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() -> Unit): YukiHookCreater.Result
``` ```
```kotlin ```kotlin
fun HookClass.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() -> Unit): YukiHookCreater.Result inline fun HookClass.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() -> Unit): YukiHookCreater.Result
``` ```
**变更记录** **变更记录**
@@ -358,6 +366,10 @@ fun HookClass.hook(isUseAppClassLoader: Boolean, initiate: YukiHookCreater.() ->
新增 `isUseAppClassLoader` 参数 新增 `isUseAppClassLoader` 参数
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 这是一切 Hook 的入口创建方法Hook 方法、构造类。 > 这是一切 Hook 的入口创建方法Hook 方法、构造类。
@@ -427,6 +439,7 @@ findClass("com.example.demo.DemoClass1", "com.example.demo.DemoClass2").hook {
> 示例如下 > 示例如下
```kotlin ```kotlin
// 这里的做法标识了 hook 不会再将 YourClass 重新与当前 appClassLoader 绑定
YourClass.hook(isUseAppClassLoader = false) { YourClass.hook(isUseAppClassLoader = false) {
// Your code here. // Your code here.
} }

View File

@@ -113,7 +113,7 @@ fun String.hasClass(loader: ClassLoader?): Boolean
### hasField [method] ### hasField [method]
```kotlin ```kotlin
fun Class<*>.hasField(initiate: FieldFinder.() -> Unit): Boolean inline fun Class<*>.hasField(initiate: FieldFinder.() -> Unit): Boolean
``` ```
**变更记录** **变更记录**
@@ -124,6 +124,10 @@ fun Class<*>.hasField(initiate: FieldFinder.() -> Unit): Boolean
合并到 `FieldFinder` 合并到 `FieldFinder`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 查找变量是否存在。 > 查找变量是否存在。
@@ -131,7 +135,7 @@ fun Class<*>.hasField(initiate: FieldFinder.() -> Unit): Boolean
### hasMethod [method] ### hasMethod [method]
```kotlin ```kotlin
fun Class<*>.hasMethod(initiate: MethodFinder.() -> Unit): Boolean inline fun Class<*>.hasMethod(initiate: MethodFinder.() -> Unit): Boolean
``` ```
**变更记录** **变更记录**
@@ -146,6 +150,10 @@ fun Class<*>.hasMethod(initiate: MethodFinder.() -> Unit): Boolean
合并到 `MethodFinder` 合并到 `MethodFinder`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 查找方法是否存在。 > 查找方法是否存在。
@@ -153,7 +161,7 @@ fun Class<*>.hasMethod(initiate: MethodFinder.() -> Unit): Boolean
### hasConstructor [method] ### hasConstructor [method]
```kotlin ```kotlin
fun Class<*>.hasConstructor(initiate: ConstructorFinder.() -> Unit): Boolean inline fun Class<*>.hasConstructor(initiate: ConstructorFinder.() -> Unit): Boolean
``` ```
**变更记录** **变更记录**
@@ -164,6 +172,10 @@ fun Class<*>.hasConstructor(initiate: ConstructorFinder.() -> Unit): Boolean
合并到 `ConstructorFinder` 合并到 `ConstructorFinder`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 查找构造方法是否存在。 > 查找构造方法是否存在。
@@ -171,13 +183,17 @@ fun Class<*>.hasConstructor(initiate: ConstructorFinder.() -> Unit): Boolean
### hasModifiers [method] ### hasModifiers [method]
```kotlin ```kotlin
fun Member.hasModifiers(initiate: ModifierRules.() -> Unit): Boolean inline fun Member.hasModifiers(initiate: ModifierRules.() -> Unit): Boolean
``` ```
**变更记录** **变更记录**
`v1.0.67` `新增` `v1.0.67` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 查询 `Member` 中匹配的描述符。 > 查询 `Member` 中匹配的描述符。
@@ -217,13 +233,17 @@ fun Member.hasModifiers(initiate: ModifierRules.() -> Unit): Boolean
### field [method] ### field [method]
```kotlin ```kotlin
fun Class<*>.field(initiate: FieldFinder.() -> Unit): FieldFinder.Result inline fun Class<*>.field(initiate: FieldFinder.() -> Unit): FieldFinder.Result
``` ```
**变更记录** **变更记录**
`v1.0.2` `新增` `v1.0.2` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 查找并得到变量。 > 查找并得到变量。
@@ -231,7 +251,7 @@ fun Class<*>.field(initiate: FieldFinder.() -> Unit): FieldFinder.Result
### method [method] ### method [method]
```kotlin ```kotlin
fun Class<*>.method(initiate: MethodFinder.() -> Unit): MethodFinder.Result inline fun Class<*>.method(initiate: MethodFinder.() -> Unit): MethodFinder.Result
``` ```
**变更记录** **变更记录**
@@ -246,7 +266,11 @@ fun Class<*>.method(initiate: MethodFinder.() -> Unit): MethodFinder.Result
`v1.0.2` `修改` `v1.0.2` `修改`
合并到 `MethodFinder` 方法体 合并到 `MethodFinder` 方法体
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
@@ -255,7 +279,7 @@ fun Class<*>.method(initiate: MethodFinder.() -> Unit): MethodFinder.Result
### constructor [method] ### constructor [method]
```kotlin ```kotlin
fun Class<*>.constructor(initiate: ConstructorFinder.() -> Unit): ConstructorFinder.Result inline fun Class<*>.constructor(initiate: ConstructorFinder.() -> Unit): ConstructorFinder.Result
``` ```
**变更记录** **变更记录**
@@ -268,7 +292,11 @@ fun Class<*>.constructor(initiate: ConstructorFinder.() -> Unit): ConstructorFin
`v1.0.2` `修改` `v1.0.2` `修改`
合并到 `ConstructorFinder` 方法体 合并到 `ConstructorFinder` 方法体
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
@@ -312,44 +340,56 @@ inline fun <reified T : Any> T.current(initiate: CurrentClass.() -> Unit): T
> 获得当前实例的类操作对象。 > 获得当前实例的类操作对象。
### buildOf [method]
```kotlin
fun <T> Class<*>.buildOf(vararg param: Any?, initiate: ConstructorFinder.() -> Unit): T?
```
**变更记录**
`v1.0.70` `新增`
**功能描述**
> 通过构造方法创建新实例,指定类型 `T`。
### buildOfAny [method] ### buildOfAny [method]
```kotlin ```kotlin
fun Class<*>.buildOfAny(vararg param: Any?, initiate: ConstructorFinder.() -> Unit): Any? inline fun Class<*>.buildOfAny(vararg param: Any?, initiate: ConstructorFinder.() -> Unit): Any?
``` ```
**变更记录** **变更记录**
`v1.0.70` `新增` `v1.0.70` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 通过构造方法创建新实例,任意类型 `Any`。 > 通过构造方法创建新实例,任意类型 `Any`。
### allMethods [method] ### buildOf [method]
```kotlin ```kotlin
fun Class<*>.allMethods(callback: (index: Int, method: Method) -> Unit) inline fun <T> Class<*>.buildOf(vararg param: Any?, initiate: ConstructorFinder.() -> Unit): T?
``` ```
**变更记录** **变更记录**
`v1.0.70` `新增` `v1.0.70` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述**
> 通过构造方法创建新实例,指定类型 `T`。
### allMethods [method]
```kotlin
inline fun Class<*>.allMethods(callback: (index: Int, method: Method) -> Unit)
```
**变更记录**
`v1.0.70` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 遍历当前类中的所有方法。 > 遍历当前类中的所有方法。
@@ -357,13 +397,17 @@ fun Class<*>.allMethods(callback: (index: Int, method: Method) -> Unit)
### allConstructors [method] ### allConstructors [method]
```kotlin ```kotlin
fun Class<*>.allConstructors(callback: (index: Int, constructor: Constructor<*>) -> Unit) inline fun Class<*>.allConstructors(callback: (index: Int, constructor: Constructor<*>) -> Unit)
``` ```
**变更记录** **变更记录**
`v1.0.70` `新增` `v1.0.70` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 遍历当前类中的所有构造方法。 > 遍历当前类中的所有构造方法。
@@ -371,13 +415,17 @@ fun Class<*>.allConstructors(callback: (index: Int, constructor: Constructor<*>)
### allFields [method] ### allFields [method]
```kotlin ```kotlin
fun Class<*>.allFields(callback: (index: Int, field: Field) -> Unit) inline fun Class<*>.allFields(callback: (index: Int, field: Field) -> Unit)
``` ```
**变更记录** **变更记录**
`v1.0.70` `新增` `v1.0.70` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 遍历当前类中的所有变量。 > 遍历当前类中的所有变量。

View File

@@ -162,6 +162,10 @@ var isEnableMemberCache: Boolean
`v1.0.68` `新增` `v1.0.68` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 是否启用 `Member` 缓存功能。 > 是否启用 `Member` 缓存功能。
@@ -179,7 +183,7 @@ var isEnableMemberCache: Boolean
### configs [method] ### configs [method]
```kotlin ```kotlin
fun configs(initiate: Configs.() -> Unit) inline fun configs(initiate: Configs.() -> Unit)
``` ```
**变更记录** **变更记录**

View File

@@ -1,13 +1,17 @@
## YukiHookCreater [class] ## YukiHookCreater [class]
```kotlin ```kotlin
class YukiHookCreater(private val packageParam: PackageParam, private val hookClass: HookClass) class YukiHookCreater(private val packageParam: PackageParam, internal val hookClass: HookClass)
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
`hookClass` 进行 inline 处理
**功能描述** **功能描述**
> `YukiHookAPI` 核心 Hook 实现类。 > `YukiHookAPI` 核心 Hook 实现类。
@@ -35,13 +39,17 @@ val instanceClass: Class<*>
### injectMember [method] ### injectMember [method]
```kotlin ```kotlin
fun injectMember(tag: String, initiate: MemberHookCreater.() -> Unit): MemberHookCreater.Result inline fun injectMember(tag: String, initiate: MemberHookCreater.() -> Unit): MemberHookCreater.Result
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 注入要 Hook 的方法、构造类。 > 注入要 Hook 的方法、构造类。
@@ -175,13 +183,17 @@ injectMember {
#### method [method] #### method [method]
```kotlin ```kotlin
fun method(initiate: MethodFinder.() -> Unit): MethodFinder.Result inline fun method(initiate: MethodFinder.() -> Unit): MethodFinder.Result
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 查找当前 `Class` 需要 Hook 的方法。 > 查找当前 `Class` 需要 Hook 的方法。
@@ -207,13 +219,17 @@ injectMember {
#### constructor [method] #### constructor [method]
```kotlin ```kotlin
fun constructor(initiate: ConstructorFinder.() -> Unit): ConstructorFinder.Result inline fun constructor(initiate: ConstructorFinder.() -> Unit): ConstructorFinder.Result
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 查找当前 `Class` 需要 Hook 的构造方法。 > 查找当前 `Class` 需要 Hook 的构造方法。
@@ -235,13 +251,17 @@ injectMember {
#### field [method] #### field [method]
```kotlin ```kotlin
fun HookParam.field(initiate: FieldFinder.() -> Unit): FieldFinder.Result inline fun HookParam.field(initiate: FieldFinder.() -> Unit): FieldFinder.Result
``` ```
**变更记录** **变更记录**
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 使用当前 `hookClass` 查找并得到 `Field`。 > 使用当前 `hookClass` 查找并得到 `Field`。
@@ -271,13 +291,17 @@ injectMember {
#### method [method] #### method [method]
```kotlin ```kotlin
fun HookParam.method(initiate: MethodFinder.() -> Unit): MethodFinder.Result inline fun HookParam.method(initiate: MethodFinder.() -> Unit): MethodFinder.Result
``` ```
**变更记录** **变更记录**
`v1.0.2` `添加` `v1.0.2` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 使用当前 `hookClass` 查找并得到方法。 > 使用当前 `hookClass` 查找并得到方法。
@@ -285,13 +309,17 @@ fun HookParam.method(initiate: MethodFinder.() -> Unit): MethodFinder.Result
#### constructor [method] #### constructor [method]
```kotlin ```kotlin
fun HookParam.constructor(initiate: ConstructorFinder.() -> Unit): ConstructorFinder.Result inline fun HookParam.constructor(initiate: ConstructorFinder.() -> Unit): ConstructorFinder.Result
``` ```
**变更记录** **变更记录**
`v1.0.2` `添加` `v1.0.2` `添加`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 使用当前 `hookClass` 查找并得到构造方法。 > 使用当前 `hookClass` 查找并得到构造方法。
@@ -431,7 +459,7 @@ inner class Result
##### result [method] ##### result [method]
```kotlin ```kotlin
fun result(initiate: Result.() -> Unit): Result inline fun result(initiate: Result.() -> Unit): Result
``` ```
**变更记录** **变更记录**
@@ -442,6 +470,10 @@ fun result(initiate: Result.() -> Unit): Result
~~`failures`~~ 修改为 `result` ~~`failures`~~ 修改为 `result`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 创建监听失败事件方法体。 > 创建监听失败事件方法体。
@@ -466,13 +498,17 @@ injectMember {
##### by [method] ##### by [method]
```kotlin ```kotlin
fun by(initiate: () -> Boolean): Result inline fun by(initiate: () -> Boolean): Result
``` ```
**变更记录** **变更记录**
`v1.0.5` `新增` `v1.0.5` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 添加执行 Hook 需要满足的条件,不满足条件将直接停止 Hook。 > 添加执行 Hook 需要满足的条件,不满足条件将直接停止 Hook。
@@ -622,7 +658,7 @@ inner class Result
#### result [method] #### result [method]
```kotlin ```kotlin
fun result(initiate: Result.() -> Unit): Result inline fun result(initiate: Result.() -> Unit): Result
``` ```
**变更记录** **变更记录**
@@ -633,6 +669,10 @@ fun result(initiate: Result.() -> Unit): Result
~~`failures`~~ 修改为 `result` ~~`failures`~~ 修改为 `result`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 创建监听事件方法体。 > 创建监听事件方法体。
@@ -640,13 +680,17 @@ fun result(initiate: Result.() -> Unit): Result
#### by [method] #### by [method]
```kotlin ```kotlin
fun by(initiate: () -> Boolean): Result inline fun by(initiate: () -> Boolean): Result
``` ```
**变更记录** **变更记录**
`v1.0.5` `新增` `v1.0.5` `新增`
`v1.0.80` `修改`
将方法体进行 inline
**功能描述** **功能描述**
> 添加执行 Hook 需要满足的条件,不满足条件将直接停止 Hook。 > 添加执行 Hook 需要满足的条件,不满足条件将直接停止 Hook。

View File

@@ -4,6 +4,10 @@
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
合并到 `IYukiHookXposedInit`,将方法体进行 inline
**功能描述** **功能描述**
> 这是 `YukiHookAPI` 相关 `lambda` 方法的封装类以及部分 API 用法。 > 这是 `YukiHookAPI` 相关 `lambda` 方法的封装类以及部分 API 用法。
@@ -11,13 +15,17 @@
### configs [method] ### configs [method]
```kotlin ```kotlin
fun IYukiHookXposedInit.configs(initiate: YukiHookAPI.Configs.() -> Unit) inline fun IYukiHookXposedInit.configs(initiate: YukiHookAPI.Configs.() -> Unit)
``` ```
**变更记录** **变更记录**
`v1.0.1` `新增` `v1.0.1` `新增`
`v1.0.80` `修改`
合并到 `IYukiHookXposedInit`
**功能描述** **功能描述**
> 在 `IYukiHookXposedInit` 中配置 `Configs`。 > 在 `IYukiHookXposedInit` 中配置 `Configs`。
@@ -36,6 +44,10 @@ fun IYukiHookXposedInit.encase(vararg hooker: YukiBaseHooker)
`v1.0` `添加` `v1.0` `添加`
`v1.0.80` `修改`
合并到 `IYukiHookXposedInit`
**功能描述** **功能描述**
> 在 `IYukiHookXposedInit` 中装载 `YukiHookAPI`。 > 在 `IYukiHookXposedInit` 中装载 `YukiHookAPI`。

View File

@@ -33,8 +33,13 @@ kotlin {
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {
kotlinOptions { kotlinOptions {
jvmTarget = 11 jvmTarget = 11
freeCompilerArgs += "-opt-in=com.highcapable.yukihookapi.annotation.YukiPrivateApi" freeCompilerArgs = [
freeCompilerArgs += "-opt-in=com.highcapable.yukihookapi.annotation.YukiGenerateApi" '-opt-in=com.highcapable.yukihookapi.annotation.YukiPrivateApi',
'-opt-in=com.highcapable.yukihookapi.annotation.YukiGenerateApi',
'-Xno-param-assertions',
'-Xno-call-assertions',
'-Xno-receiver-assertions'
]
} }
} }

View File

@@ -160,7 +160,8 @@ object YukiHookAPI {
var isEnableMemberCache = true var isEnableMemberCache = true
/** 结束方法体 */ /** 结束方法体 */
internal fun build() {} @PublishedApi
internal fun build() = Unit
} }
/** /**
@@ -176,7 +177,7 @@ object YukiHookAPI {
* 详情请参考 [configs 方法](https://fankes.github.io/YukiHookAPI/#/config/api-example?id=configs-%e6%96%b9%e6%b3%95) * 详情请参考 [configs 方法](https://fankes.github.io/YukiHookAPI/#/config/api-example?id=configs-%e6%96%b9%e6%b3%95)
* @param initiate 方法体 * @param initiate 方法体
*/ */
fun configs(initiate: Configs.() -> Unit) = Configs.apply(initiate).build() inline fun configs(initiate: Configs.() -> Unit) = Configs.apply(initiate).build()
/** /**
* 作为模块装载调用入口方法 - Xposed API * 作为模块装载调用入口方法 - Xposed API

View File

@@ -54,22 +54,24 @@ import java.lang.reflect.Member
* @param packageParam 需要传入 [PackageParam] 实现方法调用 * @param packageParam 需要传入 [PackageParam] 实现方法调用
* @param hookClass 要 Hook 的 [HookClass] 实例 * @param hookClass 要 Hook 的 [HookClass] 实例
*/ */
class YukiHookCreater(private val packageParam: PackageParam, private val hookClass: HookClass) { class YukiHookCreater(private val packageParam: PackageParam, @PublishedApi internal val hookClass: HookClass) {
/** /**
* Hook 模式定义 * Hook 模式定义
*/ */
enum class HookMemberMode { HOOK_ALL_METHODS, HOOK_ALL_CONSTRUCTORS, HOOK_CONVENTIONAL } enum class HookMemberMode { HOOK_ALL_METHODS, HOOK_ALL_CONSTRUCTORS, HOOK_CONVENTIONAL }
/** 是否对当前 [YukiHookCreater] 禁止执行 Hook 操作 */
private var isDisableCreaterRunHook = false
/** 设置要 Hook 的方法、构造类 */
private var hookMembers = HashSet<MemberHookCreater>()
/** [hookClass] 找不到时出现的错误回调 */ /** [hookClass] 找不到时出现的错误回调 */
private var onHookClassNotFoundFailureCallback: ((Throwable) -> Unit)? = null private var onHookClassNotFoundFailureCallback: ((Throwable) -> Unit)? = null
/** 是否对当前 [YukiHookCreater] 禁止执行 Hook 操作 */
@PublishedApi
internal var isDisableCreaterRunHook = false
/** 设置要 Hook 的方法、构造类 */
@PublishedApi
internal var hookMembers = HashSet<MemberHookCreater>()
/** /**
* 得到当前被 Hook 的 [Class] * 得到当前被 Hook 的 [Class]
* *
@@ -86,7 +88,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
* @param initiate 方法体 * @param initiate 方法体
* @return [MemberHookCreater.Result] * @return [MemberHookCreater.Result]
*/ */
fun injectMember(tag: String = "Default", initiate: MemberHookCreater.() -> Unit) = inline fun injectMember(tag: String = "Default", initiate: MemberHookCreater.() -> Unit) =
MemberHookCreater(tag).apply(initiate).apply { hookMembers.add(this) }.build() MemberHookCreater(tag).apply(initiate).apply { hookMembers.add(this) }.build()
/** /**
@@ -132,9 +134,12 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
/** [afterHook] 回调 */ /** [afterHook] 回调 */
private var afterHookCallback: (HookParam.() -> Unit)? = null private var afterHookCallback: (HookParam.() -> Unit)? = null
/** [replaceAny]、[replaceUnit]、[replaceTo] 等回调 */ /** [replaceAny]、[replaceUnit] 回调 */
private var replaceHookCallback: (HookParam.() -> Any?)? = null private var replaceHookCallback: (HookParam.() -> Any?)? = null
/** [replaceTo]、[replaceToTrue]、[replaceToFalse]、[intercept] 的值 */
private var replaceHookResult: Any? = null
/** Hook 成功时回调 */ /** Hook 成功时回调 */
private var onHookedCallback: ((Member) -> Unit)? = null private var onHookedCallback: ((Member) -> Unit)? = null
@@ -150,20 +155,27 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
/** 全部错误回调 */ /** 全部错误回调 */
private var onAllFailureCallback: ((Throwable) -> Unit)? = null private var onAllFailureCallback: ((Throwable) -> Unit)? = null
/** 查找过程中发生的异常 */
private var findingThrowable: Throwable? = null
/** 是否为替换 Hook 模式 */ /** 是否为替换 Hook 模式 */
private var isReplaceHookMode = false private var isReplaceHookMode = false
/** 标识是否已经设置了要 Hook 的 [member] */ /** 是否为仅替换 Hook 结果模式 */
private var isHookMemberSetup = false private var isReplaceHookOnlyResultMode = false
/** 是否对当前 [MemberHookCreater] 禁止执行 Hook 操作 */ /** 是否对当前 [MemberHookCreater] 禁止执行 Hook 操作 */
private var isDisableMemberRunHook = false @PublishedApi
internal var isDisableMemberRunHook = false
/** 查找过程中发生的异常 */
@PublishedApi
internal var findingThrowable: Throwable? = null
/** 标识是否已经设置了要 Hook 的 [member] */
@PublishedApi
internal var isHookMemberSetup = false
/** Hook 当前模式类型 */ /** Hook 当前模式类型 */
private var hookMemberMode = HookMemberMode.HOOK_CONVENTIONAL @PublishedApi
internal var hookMemberMode = HookMemberMode.HOOK_CONVENTIONAL
/** 全部方法的名称 */ /** 全部方法的名称 */
private var allMethodsName = "" private var allMethodsName = ""
@@ -219,7 +231,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
* @param initiate 方法体 * @param initiate 方法体
* @return [MethodFinder.Result] * @return [MethodFinder.Result]
*/ */
fun method(initiate: MethodFinder.() -> Unit) = try { inline fun method(initiate: MethodFinder.() -> Unit) = try {
hookMemberMode = HookMemberMode.HOOK_CONVENTIONAL hookMemberMode = HookMemberMode.HOOK_CONVENTIONAL
isHookMemberSetup = true isHookMemberSetup = true
MethodFinder(hookInstance = this, hookClass.instance).apply(initiate).build(isBind = true) MethodFinder(hookInstance = this, hookClass.instance).apply(initiate).build(isBind = true)
@@ -237,7 +249,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
* @param initiate 方法体 * @param initiate 方法体
* @return [ConstructorFinder.Result] * @return [ConstructorFinder.Result]
*/ */
fun constructor(initiate: ConstructorFinder.() -> Unit = {}) = try { inline fun constructor(initiate: ConstructorFinder.() -> Unit = {}) = try {
hookMemberMode = HookMemberMode.HOOK_CONVENTIONAL hookMemberMode = HookMemberMode.HOOK_CONVENTIONAL
isHookMemberSetup = true isHookMemberSetup = true
ConstructorFinder(hookInstance = this, hookClass.instance).apply(initiate).build(isBind = true) ConstructorFinder(hookInstance = this, hookClass.instance).apply(initiate).build(isBind = true)
@@ -251,7 +263,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
* @param initiate 方法体 * @param initiate 方法体
* @return [FieldFinder.Result] * @return [FieldFinder.Result]
*/ */
fun HookParam.field(initiate: FieldFinder.() -> Unit) = inline fun HookParam.field(initiate: FieldFinder.() -> Unit) =
if (hookClass.instance == null) FieldFinder(hookInstance = this@MemberHookCreater).failure(hookClass.throwable) if (hookClass.instance == null) FieldFinder(hookInstance = this@MemberHookCreater).failure(hookClass.throwable)
else FieldFinder(hookInstance = this@MemberHookCreater, hookClass.instance).apply(initiate).build() else FieldFinder(hookInstance = this@MemberHookCreater, hookClass.instance).apply(initiate).build()
@@ -260,7 +272,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
* @param initiate 方法体 * @param initiate 方法体
* @return [MethodFinder.Result] * @return [MethodFinder.Result]
*/ */
fun HookParam.method(initiate: MethodFinder.() -> Unit) = inline fun HookParam.method(initiate: MethodFinder.() -> Unit) =
if (hookClass.instance == null) MethodFinder(hookInstance = this@MemberHookCreater).failure(hookClass.throwable) if (hookClass.instance == null) MethodFinder(hookInstance = this@MemberHookCreater).failure(hookClass.throwable)
else MethodFinder(hookInstance = this@MemberHookCreater, hookClass.instance).apply(initiate).build() else MethodFinder(hookInstance = this@MemberHookCreater, hookClass.instance).apply(initiate).build()
@@ -269,7 +281,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
* @param initiate 方法体 * @param initiate 方法体
* @return [ConstructorFinder.Result] * @return [ConstructorFinder.Result]
*/ */
fun HookParam.constructor(initiate: ConstructorFinder.() -> Unit) = inline fun HookParam.constructor(initiate: ConstructorFinder.() -> Unit) =
if (hookClass.instance == null) ConstructorFinder(hookInstance = this@MemberHookCreater).failure(hookClass.throwable) if (hookClass.instance == null) ConstructorFinder(hookInstance = this@MemberHookCreater).failure(hookClass.throwable)
else ConstructorFinder(hookInstance = this@MemberHookCreater, hookClass.instance).apply(initiate).build() else ConstructorFinder(hookInstance = this@MemberHookCreater, hookClass.instance).apply(initiate).build()
@@ -303,6 +315,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
*/ */
fun replaceAny(initiate: HookParam.() -> Any?) { fun replaceAny(initiate: HookParam.() -> Any?) {
isReplaceHookMode = true isReplaceHookMode = true
isReplaceHookOnlyResultMode = false
replaceHookCallback = initiate replaceHookCallback = initiate
} }
@@ -314,6 +327,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
*/ */
fun replaceUnit(initiate: HookParam.() -> Unit) { fun replaceUnit(initiate: HookParam.() -> Unit) {
isReplaceHookMode = true isReplaceHookMode = true
isReplaceHookOnlyResultMode = false
replaceHookCallback = initiate replaceHookCallback = initiate
} }
@@ -325,7 +339,8 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
*/ */
fun replaceTo(any: Any?) { fun replaceTo(any: Any?) {
isReplaceHookMode = true isReplaceHookMode = true
replaceHookCallback = { any } isReplaceHookOnlyResultMode = true
replaceHookResult = any
} }
/** /**
@@ -337,7 +352,8 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
*/ */
fun replaceToTrue() { fun replaceToTrue() {
isReplaceHookMode = true isReplaceHookMode = true
replaceHookCallback = { true } isReplaceHookOnlyResultMode = true
replaceHookResult = true
} }
/** /**
@@ -349,7 +365,8 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
*/ */
fun replaceToFalse() { fun replaceToFalse() {
isReplaceHookMode = true isReplaceHookMode = true
replaceHookCallback = { false } isReplaceHookOnlyResultMode = true
replaceHookResult = false
} }
/** /**
@@ -361,7 +378,8 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
*/ */
fun intercept() { fun intercept() {
isReplaceHookMode = true isReplaceHookMode = true
replaceHookCallback = { null } isReplaceHookOnlyResultMode = true
replaceHookResult = null
} }
/** /**
@@ -395,9 +413,9 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
if (baseParam == null) return null if (baseParam == null) return null
return HookParam(createrInstance = this@YukiHookCreater, HookParamWrapper(baseParam)).let { param -> return HookParam(createrInstance = this@YukiHookCreater, HookParamWrapper(baseParam)).let { param ->
try { try {
if (replaceHookCallback != null) if (replaceHookCallback != null || isReplaceHookOnlyResultMode)
onHookLogMsg(msg = "Replace Hook Member [${member ?: "All Member $allMethodsName"}] done [$tag]") onHookLogMsg(msg = "Replace Hook Member [${member ?: "All Member $allMethodsName"}] done [$tag]")
replaceHookCallback?.invoke(param) if (isReplaceHookOnlyResultMode) replaceHookResult else replaceHookCallback?.invoke(param)
} catch (e: Throwable) { } catch (e: Throwable) {
onConductFailureCallback?.invoke(param, e) onConductFailureCallback?.invoke(param, e)
onAllFailureCallback?.invoke(e) onAllFailureCallback?.invoke(e)
@@ -542,7 +560,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
* @param initiate 方法体 * @param initiate 方法体
* @return [Result] 可继续向下监听 * @return [Result] 可继续向下监听
*/ */
fun result(initiate: Result.() -> Unit) = apply(initiate) inline fun result(initiate: Result.() -> Unit) = apply(initiate)
/** /**
* 添加执行 Hook 需要满足的条件 * 添加执行 Hook 需要满足的条件
@@ -551,7 +569,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
* @param initiate 条件方法体 * @param initiate 条件方法体
* @return [Result] 可继续向下监听 * @return [Result] 可继续向下监听
*/ */
fun by(initiate: () -> Boolean): Result { inline fun by(initiate: () -> Boolean): Result {
isDisableMemberRunHook = (runCatching { initiate() }.getOrNull() ?: false).not() isDisableMemberRunHook = (runCatching { initiate() }.getOrNull() ?: false).not()
if (isDisableMemberRunHook) ignoredAllFailure() if (isDisableMemberRunHook) ignoredAllFailure()
return this return this
@@ -650,7 +668,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
* @param initiate 方法体 * @param initiate 方法体
* @return [Result] 可继续向下监听 * @return [Result] 可继续向下监听
*/ */
fun result(initiate: Result.() -> Unit) = apply(initiate) inline fun result(initiate: Result.() -> Unit) = apply(initiate)
/** /**
* 添加执行 Hook 需要满足的条件 * 添加执行 Hook 需要满足的条件
@@ -659,7 +677,7 @@ class YukiHookCreater(private val packageParam: PackageParam, private val hookCl
* @param initiate 条件方法体 * @param initiate 条件方法体
* @return [Result] 可继续向下监听 * @return [Result] 可继续向下监听
*/ */
fun by(initiate: () -> Boolean): Result { inline fun by(initiate: () -> Boolean): Result {
isDisableCreaterRunHook = (runCatching { initiate() }.getOrNull() ?: false).not() isDisableCreaterRunHook = (runCatching { initiate() }.getOrNull() ?: false).not()
return this return this
} }

View File

@@ -48,7 +48,9 @@ import java.lang.reflect.Constructor
* @param classSet 当前需要查找的 [Class] 实例 * @param classSet 当前需要查找的 [Class] 实例
*/ */
class ConstructorFinder( class ConstructorFinder(
@property:YukiPrivateApi
override val hookInstance: YukiHookCreater.MemberHookCreater? = null, override val hookInstance: YukiHookCreater.MemberHookCreater? = null,
@property:YukiPrivateApi
override val classSet: Class<*>? = null override val classSet: Class<*>? = null
) : BaseFinder(tag = "Constructor", hookInstance, classSet) { ) : BaseFinder(tag = "Constructor", hookInstance, classSet) {
@@ -62,7 +64,8 @@ class ConstructorFinder(
private var paramTypes: Array<out Class<*>>? = null private var paramTypes: Array<out Class<*>>? = null
/** [ModifierRules] 实例 */ /** [ModifierRules] 实例 */
private var modifiers: ModifierRules? = null @PublishedApi
internal var modifiers: ModifierRules? = null
/** /**
* 设置 [Constructor] 参数个数 * 设置 [Constructor] 参数个数
@@ -80,7 +83,7 @@ class ConstructorFinder(
* @param initiate 方法体 * @param initiate 方法体
* @return [BaseFinder.IndexTypeCondition] * @return [BaseFinder.IndexTypeCondition]
*/ */
fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition { inline fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition {
modifiers = ModifierRules().apply(initiate) modifiers = ModifierRules().apply(initiate)
return IndexTypeCondition(IndexConfigType.MATCH) return IndexTypeCondition(IndexConfigType.MATCH)
} }
@@ -188,7 +191,8 @@ class ConstructorFinder(
inner class RemedyPlan { inner class RemedyPlan {
/** 失败尝试次数数组 */ /** 失败尝试次数数组 */
private val remedyPlans = HashSet<Pair<ConstructorFinder, Result>>() @PublishedApi
internal val remedyPlans = HashSet<Pair<ConstructorFinder, Result>>()
/** /**
* 创建需要重新查找的 [Constructor] * 创建需要重新查找的 [Constructor]
@@ -198,7 +202,7 @@ class ConstructorFinder(
* 若最后依然失败 - 将停止查找并输出错误日志 * 若最后依然失败 - 将停止查找并输出错误日志
* @param initiate 方法体 * @param initiate 方法体
*/ */
fun constructor(initiate: ConstructorFinder.() -> Unit) = inline fun constructor(initiate: ConstructorFinder.() -> Unit) =
Result().apply { remedyPlans.add(Pair(ConstructorFinder(hookInstance, classSet).apply(initiate), this)) } Result().apply { remedyPlans.add(Pair(ConstructorFinder(hookInstance, classSet).apply(initiate), this)) }
/** /**
@@ -206,6 +210,7 @@ class ConstructorFinder(
* *
* - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法
*/ */
@PublishedApi
@YukiPrivateApi @YukiPrivateApi
internal fun build() { internal fun build() {
if (classSet == null) return if (classSet == null) return
@@ -265,14 +270,14 @@ class ConstructorFinder(
* @param isNoSuch 是否没有找到构造方法 - 默认否 * @param isNoSuch 是否没有找到构造方法 - 默认否
* @param e 错误信息 * @param e 错误信息
*/ */
inner class Result(internal val isNoSuch: Boolean = false, private val e: Throwable? = null) { inner class Result(@PublishedApi internal val isNoSuch: Boolean = false, @PublishedApi internal val e: Throwable? = null) {
/** /**
* 创建监听结果事件方法体 * 创建监听结果事件方法体
* @param initiate 方法体 * @param initiate 方法体
* @return [Result] 可继续向下监听 * @return [Result] 可继续向下监听
*/ */
fun result(initiate: Result.() -> Unit) = apply(initiate) inline fun result(initiate: Result.() -> Unit) = apply(initiate)
/** /**
* 获得 [Constructor] 实例处理类 * 获得 [Constructor] 实例处理类
@@ -312,7 +317,7 @@ class ConstructorFinder(
* @param initiate 方法体 * @param initiate 方法体
* @return [Result] 可继续向下监听 * @return [Result] 可继续向下监听
*/ */
fun remedys(initiate: RemedyPlan.() -> Unit): Result { inline fun remedys(initiate: RemedyPlan.() -> Unit): Result {
isUsingRemedyPlan = true isUsingRemedyPlan = true
if (isNoSuch) RemedyPlan().apply(initiate).build() if (isNoSuch) RemedyPlan().apply(initiate).build()
return this return this
@@ -325,7 +330,7 @@ class ConstructorFinder(
* @param initiate 回调错误 * @param initiate 回调错误
* @return [Result] 可继续向下监听 * @return [Result] 可继续向下监听
*/ */
fun onNoSuchConstructor(initiate: (Throwable) -> Unit): Result { inline fun onNoSuchConstructor(initiate: (Throwable) -> Unit): Result {
if (isNoSuch) initiate(e ?: Throwable()) if (isNoSuch) initiate(e ?: Throwable())
return this return this
} }

View File

@@ -47,12 +47,15 @@ import java.lang.reflect.Field
* @param classSet 当前需要查找的 [Class] 实例 * @param classSet 当前需要查找的 [Class] 实例
*/ */
class FieldFinder( class FieldFinder(
@property:YukiPrivateApi
override val hookInstance: YukiHookCreater.MemberHookCreater? = null, override val hookInstance: YukiHookCreater.MemberHookCreater? = null,
@property:YukiPrivateApi
override val classSet: Class<*>? = null override val classSet: Class<*>? = null
) : BaseFinder(tag = "Field", hookInstance, classSet) { ) : BaseFinder(tag = "Field", hookInstance, classSet) {
/** [ModifierRules] 实例 */ /** [ModifierRules] 实例 */
private var modifiers: ModifierRules? = null @PublishedApi
internal var modifiers: ModifierRules? = null
/** /**
* 设置 [Field] 名称 * 设置 [Field] 名称
@@ -79,7 +82,7 @@ class FieldFinder(
* @param initiate 方法体 * @param initiate 方法体
* @return [BaseFinder.IndexTypeCondition] * @return [BaseFinder.IndexTypeCondition]
*/ */
fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition { inline fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition {
modifiers = ModifierRules().apply(initiate) modifiers = ModifierRules().apply(initiate)
return IndexTypeCondition(IndexConfigType.MATCH) return IndexTypeCondition(IndexConfigType.MATCH)
} }
@@ -159,14 +162,14 @@ class FieldFinder(
* @param isNoSuch 是否没有找到变量 - 默认否 * @param isNoSuch 是否没有找到变量 - 默认否
* @param e 错误信息 * @param e 错误信息
*/ */
inner class Result(internal val isNoSuch: Boolean = false, private val e: Throwable? = null) { inner class Result(@PublishedApi internal val isNoSuch: Boolean = false, private val e: Throwable? = null) {
/** /**
* 创建监听结果事件方法体 * 创建监听结果事件方法体
* @param initiate 方法体 * @param initiate 方法体
* @return [Result] 可继续向下监听 * @return [Result] 可继续向下监听
*/ */
fun result(initiate: Result.() -> Unit) = apply(initiate) inline fun result(initiate: Result.() -> Unit) = apply(initiate)
/** /**
* 得到变量实例处理类 * 得到变量实例处理类

View File

@@ -48,7 +48,9 @@ import java.lang.reflect.Method
* @param classSet 当前需要查找的 [Class] 实例 * @param classSet 当前需要查找的 [Class] 实例
*/ */
class MethodFinder( class MethodFinder(
@property:YukiPrivateApi
override val hookInstance: YukiHookCreater.MemberHookCreater? = null, override val hookInstance: YukiHookCreater.MemberHookCreater? = null,
@property:YukiPrivateApi
override val classSet: Class<*>? = null override val classSet: Class<*>? = null
) : BaseFinder(tag = "Method", hookInstance, classSet) { ) : BaseFinder(tag = "Method", hookInstance, classSet) {
@@ -62,7 +64,8 @@ class MethodFinder(
private var paramTypes: Array<out Class<*>>? = null private var paramTypes: Array<out Class<*>>? = null
/** [ModifierRules] 实例 */ /** [ModifierRules] 实例 */
private var modifiers: ModifierRules? = null @PublishedApi
internal var modifiers: ModifierRules? = null
/** /**
* 设置 [Method] 名称 * 设置 [Method] 名称
@@ -98,7 +101,7 @@ class MethodFinder(
* @param initiate 方法体 * @param initiate 方法体
* @return [BaseFinder.IndexTypeCondition] * @return [BaseFinder.IndexTypeCondition]
*/ */
fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition { inline fun modifiers(initiate: ModifierRules.() -> Unit): IndexTypeCondition {
modifiers = ModifierRules().apply(initiate) modifiers = ModifierRules().apply(initiate)
return IndexTypeCondition(IndexConfigType.MATCH) return IndexTypeCondition(IndexConfigType.MATCH)
} }
@@ -236,7 +239,8 @@ class MethodFinder(
inner class RemedyPlan { inner class RemedyPlan {
/** 失败尝试次数数组 */ /** 失败尝试次数数组 */
private val remedyPlans = HashSet<Pair<MethodFinder, Result>>() @PublishedApi
internal val remedyPlans = HashSet<Pair<MethodFinder, Result>>()
/** /**
* 创建需要重新查找的 [Method] * 创建需要重新查找的 [Method]
@@ -247,7 +251,7 @@ class MethodFinder(
* @param initiate 方法体 * @param initiate 方法体
* @return [Result] 结果 * @return [Result] 结果
*/ */
fun method(initiate: MethodFinder.() -> Unit) = inline fun method(initiate: MethodFinder.() -> Unit) =
Result().apply { remedyPlans.add(Pair(MethodFinder(hookInstance, classSet).apply(initiate), this)) } Result().apply { remedyPlans.add(Pair(MethodFinder(hookInstance, classSet).apply(initiate), this)) }
/** /**
@@ -255,6 +259,7 @@ class MethodFinder(
* *
* - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法 * - ❗此功能交由方法体自动完成 - 你不应该手动调用此方法
*/ */
@PublishedApi
@YukiPrivateApi @YukiPrivateApi
internal fun build() { internal fun build() {
if (classSet == null) return if (classSet == null) return
@@ -314,14 +319,14 @@ class MethodFinder(
* @param isNoSuch 是否没有找到方法 - 默认否 * @param isNoSuch 是否没有找到方法 - 默认否
* @param e 错误信息 * @param e 错误信息
*/ */
inner class Result(internal val isNoSuch: Boolean = false, private val e: Throwable? = null) { inner class Result(@PublishedApi internal val isNoSuch: Boolean = false, @PublishedApi internal val e: Throwable? = null) {
/** /**
* 创建监听结果事件方法体 * 创建监听结果事件方法体
* @param initiate 方法体 * @param initiate 方法体
* @return [Result] 可继续向下监听 * @return [Result] 可继续向下监听
*/ */
fun result(initiate: Result.() -> Unit) = apply(initiate) inline fun result(initiate: Result.() -> Unit) = apply(initiate)
/** /**
* 获得 [Method] 实例处理类 * 获得 [Method] 实例处理类
@@ -365,7 +370,7 @@ class MethodFinder(
* @param initiate 方法体 * @param initiate 方法体
* @return [Result] 可继续向下监听 * @return [Result] 可继续向下监听
*/ */
fun remedys(initiate: RemedyPlan.() -> Unit): Result { inline fun remedys(initiate: RemedyPlan.() -> Unit): Result {
isUsingRemedyPlan = true isUsingRemedyPlan = true
if (isNoSuch) RemedyPlan().apply(initiate).build() if (isNoSuch) RemedyPlan().apply(initiate).build()
return this return this
@@ -378,7 +383,7 @@ class MethodFinder(
* @param initiate 回调错误 * @param initiate 回调错误
* @return [Result] 可继续向下监听 * @return [Result] 可继续向下监听
*/ */
fun onNoSuchMethod(initiate: (Throwable) -> Unit): Result { inline fun onNoSuchMethod(initiate: (Throwable) -> Unit): Result {
if (isNoSuch) initiate(e ?: Throwable("Initialization Error")) if (isNoSuch) initiate(e ?: Throwable("Initialization Error"))
return this return this
} }

View File

@@ -115,12 +115,13 @@ abstract class BaseFinder(
} }
} }
/** 是否使用了重查找功能 */
@PublishedApi
internal var isUsingRemedyPlan = false
/** 是否开启忽略错误警告功能 */ /** 是否开启忽略错误警告功能 */
internal var isShutErrorPrinting = false internal var isShutErrorPrinting = false
/** 是否使用了重查找功能 */
internal var isUsingRemedyPlan = false
/** 当前找到的 [Member] */ /** 当前找到的 [Member] */
internal var memberInstance: Member? = null internal var memberInstance: Member? = null

View File

@@ -158,6 +158,7 @@ class ModifierRules {
* @param member 实例 * @param member 实例
* @return [Boolean] 是否符合条件 * @return [Boolean] 是否符合条件
*/ */
@PublishedApi
internal fun contains(member: Member): Boolean { internal fun contains(member: Member): Boolean {
var conditions = true var conditions = true
if (isPublic) conditions = Modifier.isPublic(member.modifiers) if (isPublic) conditions = Modifier.isPublic(member.modifiers)

View File

@@ -103,49 +103,49 @@ fun String.hasClass(loader: ClassLoader?) = try {
* @param initiate 方法体 * @param initiate 方法体
* @return [Boolean] 是否存在 * @return [Boolean] 是否存在
*/ */
fun Class<*>.hasField(initiate: FieldFinder.() -> Unit) = field(initiate).ignoredError().isNoSuch.not() inline fun Class<*>.hasField(initiate: FieldFinder.() -> Unit) = field(initiate).ignoredError().isNoSuch.not()
/** /**
* 查找方法是否存在 * 查找方法是否存在
* @param initiate 方法体 * @param initiate 方法体
* @return [Boolean] 是否存在 * @return [Boolean] 是否存在
*/ */
fun Class<*>.hasMethod(initiate: MethodFinder.() -> Unit) = method(initiate).ignoredError().isNoSuch.not() inline fun Class<*>.hasMethod(initiate: MethodFinder.() -> Unit) = method(initiate).ignoredError().isNoSuch.not()
/** /**
* 查找构造方法是否存在 * 查找构造方法是否存在
* @param initiate 方法体 * @param initiate 方法体
* @return [Boolean] 是否存在 * @return [Boolean] 是否存在
*/ */
fun Class<*>.hasConstructor(initiate: ConstructorFinder.() -> Unit) = constructor(initiate).ignoredError().isNoSuch.not() inline fun Class<*>.hasConstructor(initiate: ConstructorFinder.() -> Unit) = constructor(initiate).ignoredError().isNoSuch.not()
/** /**
* 查询 [Member] 中匹配的描述符 * 查询 [Member] 中匹配的描述符
* @param initiate 方法体 * @param initiate 方法体
* @return [Boolean] 是否存在 * @return [Boolean] 是否存在
*/ */
fun Member.hasModifiers(initiate: ModifierRules.() -> Unit) = ModifierRules().apply(initiate).contains(this) inline fun Member.hasModifiers(initiate: ModifierRules.() -> Unit) = ModifierRules().apply(initiate).contains(this)
/** /**
* 查找并得到变量 * 查找并得到变量
* @param initiate 查找方法体 * @param initiate 查找方法体
* @return [FieldFinder.Result] * @return [FieldFinder.Result]
*/ */
fun Class<*>.field(initiate: FieldFinder.() -> Unit) = FieldFinder(classSet = this).apply(initiate).build() inline fun Class<*>.field(initiate: FieldFinder.() -> Unit) = FieldFinder(classSet = this).apply(initiate).build()
/** /**
* 查找并得到方法 * 查找并得到方法
* @param initiate 查找方法体 * @param initiate 查找方法体
* @return [MethodFinder.Result] * @return [MethodFinder.Result]
*/ */
fun Class<*>.method(initiate: MethodFinder.() -> Unit) = MethodFinder(classSet = this).apply(initiate).build() inline fun Class<*>.method(initiate: MethodFinder.() -> Unit) = MethodFinder(classSet = this).apply(initiate).build()
/** /**
* 查找并得到构造类 * 查找并得到构造类
* @param initiate 查找方法体 * @param initiate 查找方法体
* @return [ConstructorFinder.Result] * @return [ConstructorFinder.Result]
*/ */
fun Class<*>.constructor(initiate: ConstructorFinder.() -> Unit) = ConstructorFinder(classSet = this).apply(initiate).build() inline fun Class<*>.constructor(initiate: ConstructorFinder.() -> Unit) = ConstructorFinder(classSet = this).apply(initiate).build()
/** /**
* 获得当前实例的类操作对象 * 获得当前实例的类操作对象
@@ -157,39 +157,40 @@ inline fun <reified T : Any> T.current(initiate: CurrentClass.() -> Unit): T {
return this return this
} }
/**
* 通过构造方法创建新实例 - 指定类型 [T]
* @param param 方法参数
* @param initiate 查找方法体
* @return [T] or null
*/
fun <T> Class<*>.buildOf(vararg param: Any?, initiate: ConstructorFinder.() -> Unit = {}) = constructor(initiate).get().newInstance<T>(*param)
/** /**
* 通过构造方法创建新实例 - 任意类型 [Any] * 通过构造方法创建新实例 - 任意类型 [Any]
* @param param 方法参数 * @param param 方法参数
* @param initiate 查找方法体 * @param initiate 查找方法体
* @return [Any] or null * @return [Any] or null
*/ */
fun Class<*>.buildOfAny(vararg param: Any?, initiate: ConstructorFinder.() -> Unit = {}) = buildOf<Any?>(*param, initiate) inline fun Class<*>.buildOfAny(vararg param: Any?, initiate: ConstructorFinder.() -> Unit = {}) = constructor(initiate).get().call(*param)
/**
* 通过构造方法创建新实例 - 指定类型 [T]
* @param param 方法参数
* @param initiate 查找方法体
* @return [T] or null
*/
inline fun <T> Class<*>.buildOf(vararg param: Any?, initiate: ConstructorFinder.() -> Unit = {}) =
constructor(initiate).get().newInstance<T>(*param)
/** /**
* 遍历当前类中的所有方法 * 遍历当前类中的所有方法
* @param callback 回调 - ([Int] 下标,[Method] 实例) * @param callback 回调 - ([Int] 下标,[Method] 实例)
*/ */
fun Class<*>.allMethods(callback: (index: Int, method: Method) -> Unit) = inline fun Class<*>.allMethods(callback: (index: Int, method: Method) -> Unit) =
declaredMethods.forEachIndexed { p, it -> callback(p, it.apply { isAccessible = true }) } declaredMethods.forEachIndexed { p, it -> callback(p, it.apply { isAccessible = true }) }
/** /**
* 遍历当前类中的所有构造方法 * 遍历当前类中的所有构造方法
* @param callback 回调 - ([Int] 下标,[Constructor] 实例) * @param callback 回调 - ([Int] 下标,[Constructor] 实例)
*/ */
fun Class<*>.allConstructors(callback: (index: Int, constructor: Constructor<*>) -> Unit) = inline fun Class<*>.allConstructors(callback: (index: Int, constructor: Constructor<*>) -> Unit) =
declaredConstructors.forEachIndexed { p, it -> callback(p, it.apply { isAccessible = true }) } declaredConstructors.forEachIndexed { p, it -> callback(p, it.apply { isAccessible = true }) }
/** /**
* 遍历当前类中的所有变量 * 遍历当前类中的所有变量
* @param callback 回调 - ([Int] 下标,[Field] 实例) * @param callback 回调 - ([Int] 下标,[Field] 实例)
*/ */
fun Class<*>.allFields(callback: (index: Int, field: Field) -> Unit) = inline fun Class<*>.allFields(callback: (index: Int, field: Field) -> Unit) =
declaredFields.forEachIndexed { p, it -> callback(p, it.apply { isAccessible = true }) } declaredFields.forEachIndexed { p, it -> callback(p, it.apply { isAccessible = true }) }

View File

@@ -49,7 +49,7 @@ import java.io.FileReader
* 在 [IYukiHookXposedInit] 中装载 [YukiHookAPI.Configs] * 在 [IYukiHookXposedInit] 中装载 [YukiHookAPI.Configs]
* @param initiate Hook 方法体 * @param initiate Hook 方法体
*/ */
fun IYukiHookXposedInit.configs(initiate: YukiHookAPI.Configs.() -> Unit) = YukiHookAPI.configs(initiate) inline fun IYukiHookXposedInit.configs(initiate: YukiHookAPI.Configs.() -> Unit) = YukiHookAPI.configs(initiate)
/** /**
* 在 [IYukiHookXposedInit] 中装载 [YukiHookAPI] * 在 [IYukiHookXposedInit] 中装载 [YukiHookAPI]
@@ -65,7 +65,7 @@ fun IYukiHookXposedInit.encase(initiate: PackageParam.() -> Unit) = YukiHookAPI.
fun IYukiHookXposedInit.encase(vararg hooker: YukiBaseHooker) = YukiHookAPI.encase(hooker = hooker) fun IYukiHookXposedInit.encase(vararg hooker: YukiBaseHooker) = YukiHookAPI.encase(hooker = hooker)
@Deprecated("请将接口转移到 IYukiHookXposedInit") @Deprecated("请将接口转移到 IYukiHookXposedInit")
fun YukiHookXposedInitProxy.configs(initiate: YukiHookAPI.Configs.() -> Unit) = YukiHookAPI.configs(initiate) inline fun YukiHookXposedInitProxy.configs(initiate: YukiHookAPI.Configs.() -> Unit) = YukiHookAPI.configs(initiate)
@Deprecated("请将接口转移到 IYukiHookXposedInit") @Deprecated("请将接口转移到 IYukiHookXposedInit")
fun YukiHookXposedInitProxy.encase(initiate: PackageParam.() -> Unit) = YukiHookAPI.encase(initiate) fun YukiHookXposedInitProxy.encase(initiate: PackageParam.() -> Unit) = YukiHookAPI.encase(initiate)

View File

@@ -116,7 +116,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
* @param anotherParam 另一个 [PackageParam] * @param anotherParam 另一个 [PackageParam]
*/ */
internal fun baseAssignInstance(anotherParam: PackageParam) { internal fun baseAssignInstance(anotherParam: PackageParam) {
thisParam.wrapper = anotherParam.wrapper this.wrapper = anotherParam.wrapper
} }
/** /**
@@ -124,7 +124,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
* @param name 包名 * @param name 包名
* @param initiate 方法体 * @param initiate 方法体
*/ */
fun loadApp(name: String, initiate: PackageParam.() -> Unit) { inline fun loadApp(name: String, initiate: PackageParam.() -> Unit) {
if (packageName == name) initiate(this) if (packageName == name) initiate(this)
} }
@@ -142,7 +142,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
* @param name 进程名 - 若要指定主进程可填写 [mainProcessName] - 效果与 [isFirstApplication] 一致 * @param name 进程名 - 若要指定主进程可填写 [mainProcessName] - 效果与 [isFirstApplication] 一致
* @param initiate 方法体 * @param initiate 方法体
*/ */
fun withProcess(name: String, initiate: PackageParam.() -> Unit) { inline fun withProcess(name: String, initiate: PackageParam.() -> Unit) {
if (processName == name) initiate(this) if (processName == name) initiate(this)
} }
@@ -219,7 +219,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
* @param initiate 方法体 * @param initiate 方法体
* @return [YukiHookCreater.Result] * @return [YukiHookCreater.Result]
*/ */
fun String.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) = inline fun String.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) =
findClass(name = this).hook(isUseAppClassLoader, initiate) findClass(name = this).hook(isUseAppClassLoader, initiate)
/** /**
@@ -228,7 +228,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
* @param initiate 方法体 * @param initiate 方法体
* @return [YukiHookCreater.Result] * @return [YukiHookCreater.Result]
*/ */
fun Class<*>.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) = inline fun Class<*>.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) =
hookClass.hook(isUseAppClassLoader, initiate) hookClass.hook(isUseAppClassLoader, initiate)
/** /**
@@ -237,7 +237,7 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
* @param initiate 方法体 * @param initiate 方法体
* @return [YukiHookCreater.Result] * @return [YukiHookCreater.Result]
*/ */
fun VariousClass.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) = inline fun VariousClass.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) =
hookClass(if (isUseAppClassLoader) appClassLoader else null).hook(isUseAppClassLoader, initiate) hookClass(if (isUseAppClassLoader) appClassLoader else null).hook(isUseAppClassLoader, initiate)
/** /**
@@ -246,15 +246,16 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
* @param initiate 方法体 * @param initiate 方法体
* @return [YukiHookCreater.Result] * @return [YukiHookCreater.Result]
*/ */
fun HookClass.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) = inline fun HookClass.hook(isUseAppClassLoader: Boolean = true, initiate: YukiHookCreater.() -> Unit) =
YukiHookCreater(packageParam = thisParam, hookClass = if (isUseAppClassLoader) bind() else this).apply(initiate).hook() YukiHookCreater(packageParam = this@PackageParam, hookClass = if (isUseAppClassLoader) bind() else this).apply(initiate).hook()
/** /**
* [VariousClass] 转换为 [HookClass] 并绑定到 [appClassLoader] * [VariousClass] 转换为 [HookClass] 并绑定到 [appClassLoader]
* @param loader 当前 [ClassLoader] - 若留空使用默认 [ClassLoader] * @param loader 当前 [ClassLoader] - 若留空使用默认 [ClassLoader]
* @return [HookClass] * @return [HookClass]
*/ */
private fun VariousClass.hookClass(loader: ClassLoader? = null) = try { @PublishedApi
internal fun VariousClass.hookClass(loader: ClassLoader? = null) = try {
get(loader).hookClass get(loader).hookClass
} catch (e: Throwable) { } catch (e: Throwable) {
HookClass(name = "VariousClass", throwable = Throwable(e.message)) HookClass(name = "VariousClass", throwable = Throwable(e.message))
@@ -266,17 +267,12 @@ open class PackageParam(private var wrapper: PackageParamWrapper? = null) {
* - ❗请注意未绑定到 [appClassLoader] 的 [Class] 是不安全的 - 调用 [hook] 方法会根据设定自动绑定 * - ❗请注意未绑定到 [appClassLoader] 的 [Class] 是不安全的 - 调用 [hook] 方法会根据设定自动绑定
* @return [HookClass] * @return [HookClass]
*/ */
private fun HookClass.bind() = try { @PublishedApi
internal fun HookClass.bind() = try {
name.clazz.hookClass name.clazz.hookClass
} catch (e: Throwable) { } catch (e: Throwable) {
HookClass(name = name, throwable = throwable ?: e) HookClass(name = name, throwable = throwable ?: e)
} }
/**
* 返回自身实例
* @return [PackageParam]
*/
private val thisParam get() = this
override fun toString() = "PackageParam by $wrapper" override fun toString() = "PackageParam by $wrapper"
} }

View File

@@ -38,19 +38,20 @@ import com.highcapable.yukihookapi.annotation.YukiPrivateApi
inline fun <R> runBlocking(block: () -> R): RunBlockResult { inline fun <R> runBlocking(block: () -> R): RunBlockResult {
val start = System.currentTimeMillis() val start = System.currentTimeMillis()
block() block()
return RunBlockResult(after = System.currentTimeMillis() - start) return RunBlockResult(afterMs = System.currentTimeMillis() - start)
} }
/** /**
* 构造耗时计算结果类 * 构造耗时计算结果类
* @param after 耗时 * @param afterMs 耗时
*/ */
@YukiPrivateApi @YukiPrivateApi
class RunBlockResult(private val after: Long) { class RunBlockResult(@PublishedApi internal val afterMs: Long) {
/** /**
* 获取耗时计算结果 * 获取耗时计算结果
* @param initiate 回调结果 - ([Long] 耗时) * @param initiate 回调结果 - ([Long] 耗时)
*/ */
fun result(initiate: (Long) -> Unit) = initiate(after) @YukiPrivateApi
inline fun result(initiate: (Long) -> Unit) = initiate(afterMs)
} }

View File

@@ -25,7 +25,10 @@
* *
* This file is Created by fankes on 2022/2/8. * This file is Created by fankes on 2022/2/8.
*/ */
@file:Suppress("SetWorldReadable", "CommitPrefEdits", "DEPRECATION", "WorldReadableFiles", "unused", "UNCHECKED_CAST") @file:Suppress(
"SetWorldReadable", "CommitPrefEdits", "DEPRECATION", "WorldReadableFiles",
"unused", "UNCHECKED_CAST", "MemberVisibilityCanBePrivate"
)
package com.highcapable.yukihookapi.hook.xposed.prefs package com.highcapable.yukihookapi.hook.xposed.prefs
@@ -489,15 +492,7 @@ class YukiHookModulePrefs(private val context: Context? = null) {
* @param value 默认值 - 未指定默认为 [prefs] 中的 [PrefsData.value] * @param value 默认值 - 未指定默认为 [prefs] 中的 [PrefsData.value]
* @return [T] 只能是 [String]、[Int]、[Float]、[Long]、[Boolean] * @return [T] 只能是 [String]、[Int]、[Float]、[Long]、[Boolean]
*/ */
inline fun <reified T> get(prefs: PrefsData<T>, value: T = prefs.value): T = when (prefs.value) { inline fun <reified T> get(prefs: PrefsData<T>, value: T = prefs.value): T = getPrefsData(prefs.key, value) as T
is String -> getString(prefs.key, value as String) as T
is Set<*> -> getStringSet(prefs.key, value as? Set<String> ?: error("Key-Value type ${T::class.java.name} is not allowed")) as T
is Int -> getInt(prefs.key, value as Int) as T
is Float -> getFloat(prefs.key, value as Float) as T
is Long -> getLong(prefs.key, value as Long) as T
is Boolean -> getBoolean(prefs.key, value as Boolean) as T
else -> error("Key-Value type ${T::class.java.name} is not allowed")
}
/** /**
* 智能存储指定类型的键值 * 智能存储指定类型的键值
@@ -508,14 +503,47 @@ class YukiHookModulePrefs(private val context: Context? = null) {
* @param prefs 键值实例 * @param prefs 键值实例
* @param value 要存储的值 - 只能是 [String]、[Int]、[Float]、[Long]、[Boolean] * @param value 要存储的值 - 只能是 [String]、[Int]、[Float]、[Long]、[Boolean]
*/ */
inline fun <reified T> put(prefs: PrefsData<T>, value: T) = when (prefs.value) { inline fun <reified T> put(prefs: PrefsData<T>, value: T) = putPrefsData(prefs.key, value)
is String -> putString(prefs.key, value as String)
is Set<*> -> putStringSet(prefs.key, value as? Set<String> ?: error("Key-Value type ${T::class.java.name} is not allowed")) /**
is Int -> putInt(prefs.key, value as Int) * 智能获取指定类型的键值
is Float -> putFloat(prefs.key, value as Float) *
is Long -> putLong(prefs.key, value as Long) * 封装方法以调用内联方法
is Boolean -> putBoolean(prefs.key, value as Boolean) * @param key 键值
else -> error("Key-Value type ${T::class.java.name} is not allowed") * @param value 默认值
* @return [Any]
*/
@PublishedApi
internal fun getPrefsData(key: String, value: Any?): Any = when (value) {
is String -> getString(key, value)
is Set<*> -> getStringSet(key, value as? Set<String> ?: error("Key-Value type ${value.javaClass.name} is not allowed"))
is Int -> getInt(key, value)
is Float -> getFloat(key, value)
is Long -> getLong(key, value)
is Boolean -> getBoolean(key, value)
else -> error("Key-Value type ${value?.javaClass?.name} is not allowed")
}
/**
* 智能存储指定类型的键值
*
* 封装方法以调用内联方法
*
* - 在模块 [Context] 环境中使用
*
* - ❗在 [XSharedPreferences] 环境下只读 - 无法使用
* @param key 键值
* @param value 要存储的值 - 只能是 [String]、[Int]、[Float]、[Long]、[Boolean]
*/
@PublishedApi
internal fun putPrefsData(key: String, value: Any?) = when (value) {
is String -> putString(key, value)
is Set<*> -> putStringSet(key, value as? Set<String> ?: error("Key-Value type ${value.javaClass.name} is not allowed"))
is Int -> putInt(key, value)
is Float -> putFloat(key, value)
is Long -> putLong(key, value)
is Boolean -> putBoolean(key, value)
else -> error("Key-Value type ${value?.javaClass?.name} is not allowed")
} }
/** /**
@@ -541,7 +569,7 @@ class YukiHookModulePrefs(private val context: Context? = null) {
* @param result 回调方法体的结果 * @param result 回调方法体的结果
* @return [T] * @return [T]
*/ */
private fun <T> resetCacheSet(result: () -> T): T { private inline fun <T> resetCacheSet(result: () -> T): T {
isUsingKeyValueCache = YukiHookAPI.Configs.isEnableModulePrefsCache isUsingKeyValueCache = YukiHookAPI.Configs.isEnableModulePrefsCache
return result() return result()
} }
@@ -552,7 +580,7 @@ class YukiHookModulePrefs(private val context: Context? = null) {
* 非模块环境使用会打印警告信息 * 非模块环境使用会打印警告信息
* @param initiate 在模块环境执行 * @param initiate 在模块环境执行
*/ */
private fun moduleEnvironment(initiate: () -> Unit) { private inline fun moduleEnvironment(initiate: () -> Unit) {
if (isXposedEnvironment.not()) initiate() if (isXposedEnvironment.not()) initiate()
else yLoggerW(msg = "You cannot use write prefs function in Xposed Environment") else yLoggerW(msg = "You cannot use write prefs function in Xposed Environment")
} }