From 2fb96f3bf72069c28d79aec3d185ba9694534b2d Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Tue, 4 Oct 2022 05:50:09 +0800 Subject: [PATCH] Added obtainLoggerInMemoryData function in YukiHookDataChannel --- .../xposed/channel/YukiHookDataChannel.md | 26 +++++++++++++- .../xposed/channel/YukiHookDataChannel.md | 26 +++++++++++++- .../xposed/channel/YukiHookDataChannel.kt | 36 +++++++++++++++++-- 3 files changed, 83 insertions(+), 5 deletions(-) diff --git a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md index 292fa505..f84c3ba6 100644 --- a/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md +++ b/docs-source/src/en/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md @@ -158,4 +158,28 @@ fun checkingVersionEquals(result: (Boolean) -> Unit) > 获取模块与宿主的版本是否匹配。 -通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。 \ No newline at end of file +通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。 + +### obtainLoggerInMemoryData - method + +```kotlin:no-line-numbers +fun obtainLoggerInMemoryData(result: (ArrayList) -> Unit) +``` + +**Change Records** + +`v1.1.4` `added` + +**Function Illustrate** + +> 获取模块与宿主之间的 `ArrayList` 数据。 + +由于模块与宿主处于不同的进程,我们可以使用数据通讯桥访问各自的调试日志数据。 + +::: danger + +模块与宿主必须启用 [YukiHookLogger.Configs.isRecord](../../log/LoggerFactory#isrecord-field) 才能获取到调试日志数据。 + +由于 Android 限制了数据传输大小的最大值,如果调试日志过多可能会造成 **TransactionTooLargeException** 异常。 + +::: \ No newline at end of file diff --git a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md index 0bba05fd..fc90977f 100644 --- a/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md +++ b/docs-source/src/zh-cn/api/public/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.md @@ -150,4 +150,28 @@ fun checkingVersionEquals(result: (Boolean) -> Unit) > 获取模块与宿主的版本是否匹配。 -通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。 \ No newline at end of file +通过此方法可原生判断 Xposed 模块更新后宿主并未重新装载造成两者不匹配的情况。 + +### obtainLoggerInMemoryData - method + +```kotlin:no-line-numbers +fun obtainLoggerInMemoryData(result: (ArrayList) -> Unit) +``` + +**变更记录** + +`v1.1.4` `新增` + +**功能描述** + +> 获取模块与宿主之间的 `ArrayList` 数据。 + +由于模块与宿主处于不同的进程,我们可以使用数据通讯桥访问各自的调试日志数据。 + +::: danger + +模块与宿主必须启用 [YukiHookLogger.Configs.isRecord](../../log/LoggerFactory#isrecord-field) 才能获取到调试日志数据。 + +由于 Android 限制了数据传输大小的最大值,如果调试日志过多可能会造成 **TransactionTooLargeException** 异常。 + +::: \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.kt index 4f3b67e0..81899f5d 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/channel/YukiHookDataChannel.kt @@ -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>("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(GET_MODULE_GENERATED_VERSION) { fromPackageName -> - nameSpace(context, fromPackageName, isSecure = false).put(RESULT_MODULE_GENERATED_VERSION, YukiHookBridge.moduleGeneratedVersion) + nameSpace(context, packageName, isSecure = false).with { + /** 注册监听模块与宿主的版本是否匹配 */ + wait(GET_MODULE_GENERATED_VERSION) { fromPackageName -> + nameSpace(context, fromPackageName, isSecure = false).put(RESULT_MODULE_GENERATED_VERSION, YukiHookBridge.moduleGeneratedVersion) + } + /** 注册监听模块与宿主之间的调试日志数据 */ + wait(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) -> Unit) { + wait(RESULT_YUKI_LOGGER_INMEMORY_DATA) { result(it) } + put(GET_YUKI_LOGGER_INMEMORY_DATA, packageName) + } + /** * 发送广播 * @param data 键值数据