Added obtainLoggerInMemoryData function in YukiHookDataChannel

This commit is contained in:
2022-10-04 05:50:09 +08:00
parent 4bee3ca0a6
commit 2fb96f3bf7
3 changed files with 83 additions and 5 deletions

View File

@@ -159,3 +159,27 @@ fun checkingVersionEquals(result: (Boolean) -> Unit)
> 获取模块与宿主的版本是否匹配。
通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。
### obtainLoggerInMemoryData <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun obtainLoggerInMemoryData(result: (ArrayList<YukiLoggerData>) -> Unit)
```
**Change Records**
`v1.1.4` `added`
**Function Illustrate**
> 获取模块与宿主之间的 `ArrayList<YukiLoggerData>` 数据。
由于模块与宿主处于不同的进程,我们可以使用数据通讯桥访问各自的调试日志数据。
::: danger
模块与宿主必须启用 [YukiHookLogger.Configs.isRecord](../../log/LoggerFactory#isrecord-field) 才能获取到调试日志数据。
由于 Android 限制了数据传输大小的最大值,如果调试日志过多可能会造成 **TransactionTooLargeException** 异常。
:::

View File

@@ -151,3 +151,27 @@ fun checkingVersionEquals(result: (Boolean) -> Unit)
> 获取模块与宿主的版本是否匹配。
通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。
### obtainLoggerInMemoryData <span class="symbol">- method</span>
```kotlin:no-line-numbers
fun obtainLoggerInMemoryData(result: (ArrayList<YukiLoggerData>) -> Unit)
```
**变更记录**
`v1.1.4` `新增`
**功能描述**
> 获取模块与宿主之间的 `ArrayList<YukiLoggerData>` 数据。
由于模块与宿主处于不同的进程,我们可以使用数据通讯桥访问各自的调试日志数据。
::: danger
模块与宿主必须启用 [YukiHookLogger.Configs.isRecord](../../log/LoggerFactory#isrecord-field) 才能获取到调试日志数据。
由于 Android 限制了数据传输大小的最大值,如果调试日志过多可能会造成 **TransactionTooLargeException** 异常。
:::

View File

@@ -39,7 +39,10 @@ import android.content.Intent
import android.content.IntentFilter
import android.os.Bundle
import android.os.Parcelable
import android.os.TransactionTooLargeException
import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.hook.log.YukiHookLogger
import com.highcapable.yukihookapi.hook.log.YukiLoggerData
import com.highcapable.yukihookapi.hook.log.yLoggerE
import com.highcapable.yukihookapi.hook.log.yLoggerW
import com.highcapable.yukihookapi.hook.xposed.application.ModuleApplication
@@ -75,6 +78,12 @@ class YukiHookDataChannel private constructor() {
/** 模块构建版本号结果标签 */
private const val RESULT_MODULE_GENERATED_VERSION = "module_generated_version_result"
/** 调试日志数据获取标签 */
private const val GET_YUKI_LOGGER_INMEMORY_DATA = "yuki_logger_inmemory_data_get"
/** 调试日志数据结果标签 */
private val RESULT_YUKI_LOGGER_INMEMORY_DATA = ChannelData<ArrayList<YukiLoggerData>>("yuki_logger_inmemory_data_result")
/** 仅监听结果键值 */
private const val VALUE_WAIT_FOR_LISTENER = "wait_for_listener_value"
@@ -170,9 +179,15 @@ class YukiHookDataChannel private constructor() {
addAction(if (isXposedEnvironment) hostActionName(packageName) else moduleActionName(context))
}
)
/** 注册监听模块与宿主的版本是否匹配 */
nameSpace(context, packageName, isSecure = false).wait<String>(GET_MODULE_GENERATED_VERSION) { fromPackageName ->
nameSpace(context, fromPackageName, isSecure = false).put(RESULT_MODULE_GENERATED_VERSION, YukiHookBridge.moduleGeneratedVersion)
nameSpace(context, packageName, isSecure = false).with {
/** 注册监听模块与宿主的版本是否匹配 */
wait<String>(GET_MODULE_GENERATED_VERSION) { fromPackageName ->
nameSpace(context, fromPackageName, isSecure = false).put(RESULT_MODULE_GENERATED_VERSION, YukiHookBridge.moduleGeneratedVersion)
}
/** 注册监听模块与宿主之间的调试日志数据 */
wait<String>(GET_YUKI_LOGGER_INMEMORY_DATA) { fromPackageName ->
nameSpace(context, fromPackageName, isSecure = false).put(RESULT_YUKI_LOGGER_INMEMORY_DATA, YukiHookLogger.inMemoryData)
}
}
}
@@ -287,6 +302,21 @@ class YukiHookDataChannel private constructor() {
put(GET_MODULE_GENERATED_VERSION, packageName)
}
/**
* 获取模块与宿主之间的 [ArrayList]<[YukiLoggerData]> 数据
*
* 由于模块与宿主处于不同的进程 - 我们可以使用数据通讯桥访问各自的调试日志数据
*
* - ❗模块与宿主必须启用 [YukiHookLogger.Configs.isRecord] 才能获取到调试日志数据
*
* - ❗由于 Android 限制了数据传输大小的最大值 - 如果调试日志过多可能会造成 [TransactionTooLargeException] 异常
* @param result 回调 [ArrayList]<[YukiLoggerData]>
*/
fun obtainLoggerInMemoryData(result: (ArrayList<YukiLoggerData>) -> Unit) {
wait(RESULT_YUKI_LOGGER_INMEMORY_DATA) { result(it) }
put(GET_YUKI_LOGGER_INMEMORY_DATA, packageName)
}
/**
* 发送广播
* @param data 键值数据