From e259ad87f9d0b9dfd93a88dae0095c26c7f98522 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Tue, 4 Oct 2022 03:50:58 +0800 Subject: [PATCH] Fix YukiHookDataChannel when "android" package is registered cannot callback in Android 13 or latest --- .../hook/xposed/channel/YukiHookDataChannel.kt | 4 +++- .../hook/xposed/parasitic/AppParasitics.kt | 14 +++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) 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 6f6bffca..5e946706 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 @@ -299,7 +299,9 @@ class YukiHookDataChannel private constructor() { /** 发送广播 */ (context ?: YukiHookAppHelper.currentApplication())?.sendBroadcast(Intent().apply { action = if (isXposedEnvironment) moduleActionName() else hostActionName(packageName) - setPackage(if (isXposedEnvironment) YukiHookBridge.modulePackageName else packageName) + /** 由于系统框架的包名可能不唯一 - 为防止发生问题不再对系统框架的广播设置接收者包名 */ + if (packageName != YukiHookBridge.SYSTEM_FRAMEWORK_NAME) + setPackage(if (isXposedEnvironment) YukiHookBridge.modulePackageName else packageName) data.takeIf { it.isNotEmpty() }?.forEach { when (it.value) { null -> Unit diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt index 5c280408..78d9f5e6 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt @@ -56,6 +56,7 @@ import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiMemberHook import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiMemberReplacement import com.highcapable.yukihookapi.hook.xposed.bridge.status.YukiHookModuleStatus import com.highcapable.yukihookapi.hook.xposed.channel.YukiHookDataChannel +import com.highcapable.yukihookapi.hook.xposed.helper.YukiHookAppHelper import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.config.ActivityProxyConfig import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.HandlerDelegate import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.IActivityManagerProxy @@ -68,6 +69,9 @@ import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.Instr */ internal object AppParasitics { + /** [YukiHookDataChannel] 是否已经注册 */ + private var isDataChannelRegistered = false + /** [Activity] 代理是否已经注册 */ private var isActivityProxyRegistered = false @@ -230,7 +234,15 @@ internal object AppParasitics { } }, IntentFilter().apply { e.first.forEach { e -> addAction(e) } }) } - runCatching { YukiHookDataChannel.instance().register(it, packageName) } + runCatching { + /** 过滤系统框架与一系列服务组件包名不唯一的情况 */ + if (isDataChannelRegistered || + (YukiHookAppHelper.currentPackageName() == YukiHookBridge.SYSTEM_FRAMEWORK_NAME && + packageName != YukiHookBridge.SYSTEM_FRAMEWORK_NAME) + ) return + YukiHookDataChannel.instance().register(it, packageName) + isDataChannelRegistered = true + } } }.onFailure { param.throwable = it } }