mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-06 02:35:40 +08:00
Update documentation files
This commit is contained in:
64
docs/api/public/ChannelData.md
Normal file
64
docs/api/public/ChannelData.md
Normal file
@@ -0,0 +1,64 @@
|
||||
## ChannelData [class]
|
||||
|
||||
```kotlin
|
||||
data class ChannelData<T>(var key: String, var value: T?)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 数据通讯桥键值构造类。
|
||||
|
||||
这个类是对 `YukiHookDataChannel` 的一个扩展用法。
|
||||
|
||||
**功能示例**
|
||||
|
||||
建立一个模板类定义模块与宿主需要发送的键值数据。
|
||||
|
||||
> 示例如下
|
||||
|
||||
```kotlin
|
||||
object DataConst {
|
||||
|
||||
val TEST_KV_DATA_1 = ChannelData("test_data_1", "defalut value")
|
||||
val TEST_KV_DATA_2 = ChannelData("test_data_2", 0)
|
||||
}
|
||||
```
|
||||
|
||||
键值数据定义后,你就可以方便地在模块和宿主中调用所需要发送的数据。
|
||||
|
||||
> 模块示例如下
|
||||
|
||||
```kotlin
|
||||
// 从指定包名的宿主获取
|
||||
dataChannel(packageName = "com.example.demo").wait(DataConst.TEST_KV_DATA_1) { value ->
|
||||
// Your code here.
|
||||
}
|
||||
// 发送给指定包名的宿主 - 未填写 value 时将使用模板提供的默认值
|
||||
dataChannel(packageName = "com.example.demo").put(DataConst.TEST_KV_DATA_1, value = "sending value")
|
||||
```
|
||||
|
||||
> 宿主示例如下
|
||||
|
||||
```kotlin
|
||||
// 从模块获取
|
||||
dataChannel.wait(DataConst.TEST_KV_DATA_1) { value ->
|
||||
// Your code here.
|
||||
}
|
||||
// 发送给模块 - 未填写 value 时将使用模板提供的默认值
|
||||
dataChannel.put(DataConst.TEST_KV_DATA_1, value = "sending value")
|
||||
```
|
||||
|
||||
你依然可以不使用模板定义的默认值,随时修改你的默认值。
|
||||
|
||||
> 示例如下
|
||||
|
||||
```kotlin
|
||||
// 获取 - 此时 value 取到的默认值将会是 2 - 并不是模板提供的 0
|
||||
dataChannel.wait(DataConst.TEST_KV_DATA_2, value = 2) { value ->
|
||||
// Your code here.
|
||||
}
|
||||
```
|
@@ -22,6 +22,8 @@ open class ModuleApplication: Application()
|
||||
|
||||
- 在模块与宿主中装载 `YukiHookAPI.Config` 以确保 `YukiHookAPI.Configs.debugTag` 不需要重复定义
|
||||
|
||||
- 在模块与宿主中使用 `YukiHookDataChannel` 进行通讯
|
||||
|
||||
- 在模块中使用系统隐藏 API,核心技术引用了开源项目 [FreeReflection](https://github.com/tiann/FreeReflection)
|
||||
|
||||
**功能示例**
|
||||
|
@@ -54,7 +54,7 @@ val appContext: Application
|
||||
|
||||
> 获取当前 Hook APP 的 `Application`。
|
||||
|
||||
!> 首次装载可能是空的,请延迟一段时间再获取。
|
||||
!> 首次装载可能是空的,请延迟一段时间再获取或通过设置 `onAppLifecycle` 监听来完成。
|
||||
|
||||
### appResources [field]
|
||||
|
||||
@@ -200,6 +200,22 @@ fun prefs(name: String): YukiHookModulePrefs
|
||||
|
||||
!> 作为 Hook API 装载时无法使用,会抛出异常。
|
||||
|
||||
### dataChannel [field]
|
||||
|
||||
```kotlin
|
||||
val dataChannel: YukiHookDataChannel.NameSpace
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 获得当前使用的数据通讯桥命名空间对象。
|
||||
|
||||
!> 作为 Hook API 装载时无法使用,会抛出异常。
|
||||
|
||||
### resources [method]
|
||||
|
||||
```kotlin
|
||||
@@ -230,6 +246,22 @@ fun refreshModuleAppResources()
|
||||
|
||||
> 刷新当前 Xposed 模块自身 `Resources`。
|
||||
|
||||
### onAppLifecycle [method]
|
||||
|
||||
```kotlin
|
||||
inline fun onAppLifecycle(initiate: AppLifecycle.() -> Unit)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 监听当前 Hook APP 生命周期装载事件。
|
||||
|
||||
!> 在 `loadZygote` 中不会被装载,仅会在 `loadSystem`、`loadApp` 中装载。
|
||||
|
||||
### loadApp [method]
|
||||
|
||||
```kotlin
|
||||
@@ -603,4 +635,102 @@ resources().hook {
|
||||
|
||||
!> 这是固定用法,为了防止发生问题,你不可手动实现任何 `HookResources` 实例执行 `hook` 调用。
|
||||
|
||||
将 Resources 的 Hook 设置为这样是为了与 `findClass(...).hook` 做到统一,使得调用起来逻辑不会混乱。
|
||||
将 Resources 的 Hook 设置为这样是为了与 `findClass(...).hook` 做到统一,使得调用起来逻辑不会混乱。
|
||||
|
||||
### onAppLifecycle [class]
|
||||
|
||||
```kotlin
|
||||
inner class AppLifecycle internal constructor()
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 当前 Hook APP 的生命周期实例处理类。
|
||||
|
||||
#### attachBaseContext [method]
|
||||
|
||||
```kotlin
|
||||
fun attachBaseContext(initiate: (baseContext: Context, hasCalledSuper: Boolean) -> Unit)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 监听当前 Hook APP 装载 `Application.attachBaseContext`。
|
||||
|
||||
#### onCreate [method]
|
||||
|
||||
```kotlin
|
||||
fun onCreate(initiate: Application.() -> Unit)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 监听当前 Hook APP 装载 `Application.onCreate`。
|
||||
|
||||
#### onTerminate [method]
|
||||
|
||||
```kotlin
|
||||
fun onTerminate(initiate: Application.() -> Unit)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 监听当前 Hook APP 装载 `Application.onTerminate`。
|
||||
|
||||
#### onLowMemory [method]
|
||||
|
||||
```kotlin
|
||||
fun onLowMemory(initiate: Application.() -> Unit)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 监听当前 Hook APP 装载 `Application.onLowMemory`。
|
||||
|
||||
#### onTrimMemory [method]
|
||||
|
||||
```kotlin
|
||||
fun onTrimMemory(initiate: (self: Application, level: Int) -> Unit)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 监听当前 Hook APP 装载 `Application.onTrimMemory`。
|
||||
|
||||
#### onConfigurationChanged [method]
|
||||
|
||||
```kotlin
|
||||
fun onConfigurationChanged(initiate: (self: Application, config: Configuration) -> Unit)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 监听当前 Hook APP 装载 `Application.onConfigurationChanged`。
|
@@ -172,12 +172,48 @@ var isEnableModuleAppResourcesCache: Boolean
|
||||
|
||||
!> 关闭后每次使用 `PackageParam.moduleAppResources` 都会重新创建,可能会造成运行缓慢。
|
||||
|
||||
#### isEnableHookModuleStatus [field]
|
||||
|
||||
```kotlin
|
||||
var isEnableHookModuleStatus: Boolean
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 是否启用 Hook Xposed 模块激活等状态功能.
|
||||
|
||||
为原生支持 Xposed 模块激活状态检测,此功能默认启用。
|
||||
|
||||
!> 关闭后你将不能再使用 `YukiHookModuleStatus` 中的功能。
|
||||
|
||||
#### isEnableDataChannel [field]
|
||||
|
||||
```kotlin
|
||||
var isEnableDataChannel: Boolean
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 是否启用当前 Xposed 模块与宿主交互的 `YukiHookDataChannel` 功能。
|
||||
|
||||
请确保 Xposed 模块的 `Application` 继承于 `ModuleApplication` 才能有效。
|
||||
|
||||
此功能默认启用,关闭后将不会在功能初始化的时候装载 `YukiHookDataChannel`。
|
||||
|
||||
#### isEnableMemberCache [field]
|
||||
|
||||
```kotlin
|
||||
var isEnableMemberCache: Boolean
|
||||
```
|
||||
ø
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.68` `新增`
|
||||
@@ -228,10 +264,12 @@ class HookEntryClass : IYukiHookXposedInit {
|
||||
override fun onInit() {
|
||||
YukiHookAPI.configs {
|
||||
debugTag = "YukiHookAPI"
|
||||
isDebug = true
|
||||
isDebug = BuildConfig.DEBUG
|
||||
isAllowPrintingLogs = true
|
||||
isEnableModulePrefsCache = true
|
||||
isEnableModuleAppResourcesCache = true
|
||||
isEnableHookModuleStatus = true
|
||||
isEnableDataChannel = true
|
||||
isEnableMemberCache = true
|
||||
}
|
||||
}
|
||||
@@ -251,10 +289,12 @@ class HookEntryClass : IYukiHookXposedInit {
|
||||
|
||||
override fun onInit() = configs {
|
||||
debugTag = "YukiHookAPI"
|
||||
isDebug = true
|
||||
isDebug = BuildConfig.DEBUG
|
||||
isAllowPrintingLogs = true
|
||||
isEnableModulePrefsCache = true
|
||||
isEnableModuleAppResourcesCache = true
|
||||
isEnableHookModuleStatus = true
|
||||
isEnableDataChannel = true
|
||||
isEnableMemberCache = true
|
||||
}
|
||||
|
||||
@@ -273,10 +313,12 @@ class HookEntryClass : IYukiHookXposedInit {
|
||||
|
||||
override fun onInit() {
|
||||
YukiHookAPI.Configs.debugTag = "YukiHookAPI"
|
||||
YukiHookAPI.Configs.isDebug = true
|
||||
YukiHookAPI.Configs.isDebug = BuildConfig.DEBUG
|
||||
YukiHookAPI.Configs.isAllowPrintingLogs = true
|
||||
YukiHookAPI.Configs.isEnableModulePrefsCache = true
|
||||
YukiHookAPI.Configs.isEnableModuleAppResourcesCache = true
|
||||
YukiHookAPI.Configs.isEnableHookModuleStatus = true
|
||||
YukiHookAPI.Configs.isEnableDataChannel = true
|
||||
YukiHookAPI.Configs.isEnableMemberCache = true
|
||||
}
|
||||
|
||||
|
223
docs/api/public/YukiHookDataChannel.md
Normal file
223
docs/api/public/YukiHookDataChannel.md
Normal file
@@ -0,0 +1,223 @@
|
||||
## YukiHookDataChannel [class]
|
||||
|
||||
```kotlin
|
||||
class YukiHookDataChannel private constructor()
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 实现 Xposed 模块的数据通讯桥。
|
||||
|
||||
通过模块与宿主相互注册 `BroadcastReceiver` 来实现数据的交互。
|
||||
|
||||
模块需要将 `Application` 继承于 `ModuleApplication` 来实现此功能。
|
||||
|
||||
!> 模块与宿主需要保持存活状态,否则无法建立通讯。
|
||||
|
||||
### NameSpace [class]
|
||||
|
||||
```kotlin
|
||||
inner class NameSpace internal constructor(private val context: Context?, private val packageName: String)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> `YukiHookDataChannel` 命名空间。
|
||||
|
||||
#### with [method]
|
||||
|
||||
```kotlin
|
||||
inline fun with(initiate: NameSpace.() -> Unit): NameSpace
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 创建一个调用空间。
|
||||
|
||||
#### put [method]
|
||||
|
||||
```kotlin
|
||||
fun <T> put(key: String, value: T)
|
||||
```
|
||||
|
||||
```kotlin
|
||||
fun <T> put(data: ChannelData<T>, value: T?)
|
||||
```
|
||||
|
||||
```kotlin
|
||||
fun put(vararg data: ChannelData<*>)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 发送键值数据。
|
||||
|
||||
**功能示例**
|
||||
|
||||
通过使用 `dataChannel` 来实现模块与宿主之间的通讯桥,原理为发送接收系统无序广播。
|
||||
|
||||
> 模块示例如下
|
||||
|
||||
```kotlin
|
||||
// 从指定包名的宿主获取
|
||||
dataChannel(packageName = "com.example.demo").wait<String>(key = "key_from_host") { value ->
|
||||
// Your code here.
|
||||
}
|
||||
// 发送给指定包名的宿主
|
||||
dataChannel(packageName = "com.example.demo").put(key = "key_from_module", value = "I am module")
|
||||
```
|
||||
|
||||
> 宿主示例如下
|
||||
|
||||
```kotlin
|
||||
// 从模块获取
|
||||
dataChannel.wait<String>(key = "key_from_module") { value ->
|
||||
// Your code here.
|
||||
}
|
||||
// 发送给模块
|
||||
dataChannel.put(key = "key_from_host", value = "I am host")
|
||||
```
|
||||
|
||||
!> 接收方需要保持存活状态才能收到通讯数据。
|
||||
|
||||
#### put [method]
|
||||
|
||||
```kotlin
|
||||
fun put(key: String)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 仅发送键值监听,使用默认值 `VALUE_WAIT_FOR_LISTENER` 发送键值数据。
|
||||
|
||||
**功能示例**
|
||||
|
||||
你可以不设置 `dataChannel` 的 `value` 来达到仅通知模块或宿主回调 `wait` 方法。
|
||||
|
||||
> 模块示例如下
|
||||
|
||||
```kotlin
|
||||
// 从指定包名的宿主获取
|
||||
dataChannel(packageName = "com.example.demo").wait(key = "listener_from_host") {
|
||||
// Your code here.
|
||||
}
|
||||
// 发送给指定包名的宿主
|
||||
dataChannel(packageName = "com.example.demo").put(key = "listener_from_module")
|
||||
```
|
||||
|
||||
> 宿主示例如下
|
||||
|
||||
```kotlin
|
||||
// 从模块获取
|
||||
dataChannel.wait(key = "listener_from_module") {
|
||||
// Your code here.
|
||||
}
|
||||
// 发送给模块
|
||||
dataChannel.put(key = "listener_from_host")
|
||||
```
|
||||
|
||||
!> 接收方需要保持存活状态才能收到通讯数据。
|
||||
|
||||
#### wait [method]
|
||||
|
||||
```kotlin
|
||||
fun <T> wait(key: String, value: T?, result: (value: T) -> Unit)
|
||||
```
|
||||
|
||||
```kotlin
|
||||
fun <T> wait(data: ChannelData<T>, value: T?, result: (value: T) -> Unit)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 获取键值数据。
|
||||
|
||||
**功能示例**
|
||||
|
||||
参考第一个 `put` 方法的功能示例。
|
||||
|
||||
#### wait [method]
|
||||
|
||||
```kotlin
|
||||
fun wait(key: String, result: () -> Unit)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 仅获取监听结果,不获取键值数据。
|
||||
|
||||
!> 仅限使用 `VALUE_WAIT_FOR_LISTENER` 发送的监听才能被接收。
|
||||
|
||||
**功能示例**
|
||||
|
||||
参考第二个 `put` 方法的功能示例。
|
||||
|
||||
#### checkingVersionEquals [method]
|
||||
|
||||
```kotlin
|
||||
fun checkingVersionEquals(result: (Boolean) -> Unit)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 获取模块与宿主的版本是否匹配。
|
||||
|
||||
通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。
|
||||
|
||||
**功能示例**
|
||||
|
||||
你可以在模块中判断指定包名的宿主是否与当前模块的版本匹配。
|
||||
|
||||
> 示例如下
|
||||
|
||||
```kotlin
|
||||
// 从指定包名的宿主获取
|
||||
dataChannel(packageName = "com.example.demo").checkingVersionEquals { isEquals ->
|
||||
// Your code here.
|
||||
}
|
||||
```
|
||||
|
||||
你还可以在宿主中判断是否自身与当前模块的版本匹配。
|
||||
|
||||
> 示例如下
|
||||
|
||||
```kotlin
|
||||
// 从模块获取
|
||||
dataChannel.checkingVersionEquals { isEquals ->
|
||||
// Your code here.
|
||||
}
|
||||
```
|
||||
|
||||
!> 方法回调的条件为宿主、模块保持存活状态,并在激活模块后重启了作用域中的 Hook 目标宿主对象。
|
@@ -52,20 +52,6 @@ fun IYukiHookXposedInit.encase(vararg hooker: YukiBaseHooker)
|
||||
|
||||
> 在 `IYukiHookXposedInit` 中调用 `YukiHookAPI`。
|
||||
|
||||
### resources [method]
|
||||
|
||||
```kotlin
|
||||
fun IYukiHookXposedInit.resources(initiate: ResourcesParam.() -> Unit)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.80` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 在 `IYukiHookXposedInit` 中调用 `YukiHookAPI.resources`。
|
||||
|
||||
### modulePrefs [field]
|
||||
|
||||
```kotlin
|
||||
@@ -94,6 +80,20 @@ fun Context.modulePrefs(name: String): YukiHookModulePrefs
|
||||
|
||||
> 获取模块的存取对象,可设置 `name` 为自定义 Sp 存储名称。
|
||||
|
||||
### dataChannel [method]
|
||||
|
||||
```kotlin
|
||||
fun Context.dataChannel(packageName: String): YukiHookDataChannel.NameSpace
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.88` `新增`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> 获取模块的数据通讯桥命名空间对象。
|
||||
|
||||
### processName [field]
|
||||
|
||||
```kotlin
|
||||
|
Reference in New Issue
Block a user