From a3892079dab86af9e3b7af9440d4ea1abfc638a0 Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Sun, 21 Aug 2022 23:46:15 +0800 Subject: [PATCH] Fix when registered activity changed injected resources lost bug --- docs/api/public/YukiHookFactory.md | 2 ++ .../yukihookapi/hook/factory/YukiHookFactory.kt | 2 ++ .../yukihookapi/hook/xposed/parasitic/AppParasitics.kt | 5 ----- .../xposed/parasitic/activity/base/ModuleAppActivity.kt | 9 +++++++++ .../parasitic/activity/base/ModuleAppCompatActivity.kt | 8 ++++++++ 5 files changed, 21 insertions(+), 5 deletions(-) diff --git a/docs/api/public/YukiHookFactory.md b/docs/api/public/YukiHookFactory.md index b8d09ce6..f2ee7006 100644 --- a/docs/api/public/YukiHookFactory.md +++ b/docs/api/public/YukiHookFactory.md @@ -209,6 +209,8 @@ fun Context.registerModuleAppActivities(proxy: Any?) 注册成功后,你就可以直接使用 `Context.startActivity` 来启动未在宿主中注册的 `Activity`。 +使用此方法会在未注册的 `Activity` 在 Hook APP (宿主) 中启动时自动调用 `injectModuleAppResources` 注入当前 Xposed 模块的资源。 + 你要将需要在宿主启动的 `Activity` 继承于 `ModuleAppActivity` 或 `ModuleAppCompatActivity`。 为防止资源 ID 互相冲突,你需要在当前 Xposed 模块项目的 `build.gradle` 中修改资源 ID。 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.kt index 49789e05..b73a0eee 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/factory/YukiHookFactory.kt @@ -140,6 +140,8 @@ fun Resources.injectModuleAppResources() = AppParasitics.injectModuleAppResource * * 注册成功后 - 你就可以直接使用 [Context.startActivity] 来启动未在宿主中注册的 [Activity] * + * 使用此方法会在未注册的 [Activity] 在 Hook APP (宿主) 中启动时自动调用 [injectModuleAppResources] 注入当前 Xposed 模块的资源 + * * - 你要将需要在宿主启动的 [Activity] 继承于 [ModuleAppActivity] 或 [ModuleAppCompatActivity] * * 详情请参考 [API 文档 - Context.registerModuleAppActivities](https://fankes.github.io/YukiHookAPI/#/api/document?id=contextregistermoduleappactivities-ext-method) 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 8c2568af..0ffe8fe3 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 @@ -72,9 +72,6 @@ internal object AppParasitics { /** [Activity] 代理是否已经注册 */ private var isActivityProxyRegister = false - /** 已被注入到宿主 [Resources] 中的当前 Xposed 模块资源 HashCode 数组 */ - private val injectedHostResourcesHashCodes = HashSet() - /** * 当前 Hook APP (宿主) 的全局生命周期 [Application] * @@ -256,10 +253,8 @@ internal object AppParasitics { * @param hostResources 需要注入的宿主 [Resources] */ internal fun injectModuleAppResources(hostResources: Resources) { - if (injectedHostResourcesHashCodes.contains(hostResources.hashCode())) return if (YukiHookBridge.hasXposedBridge) runCatching { hostResources.assets.current(ignored = true).method { name = "addAssetPath"; param(StringType) }.call(moduleAppFilePath) - injectedHostResourcesHashCodes.add(hostResources.hashCode()) }.onFailure { yLoggerE(msg = "Failed to inject module resources into [$hostResources]", e = it) } else yLoggerW(msg = "You can only inject module resources in Xposed Environment") diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.kt index dcec11d6..2b502095 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppActivity.kt @@ -30,10 +30,13 @@ package com.highcapable.yukihookapi.hook.xposed.parasitic.activity.base import android.app.Activity import android.content.Context +import android.content.res.Configuration import android.os.Bundle import androidx.annotation.CallSuper import com.highcapable.yukihookapi.hook.factory.classOf +import com.highcapable.yukihookapi.hook.factory.injectModuleAppResources import com.highcapable.yukihookapi.hook.factory.registerModuleAppActivities +import com.highcapable.yukihookapi.hook.xposed.bridge.YukiHookBridge import com.highcapable.yukihookapi.hook.xposed.parasitic.reference.ModuleClassLoader /** @@ -47,6 +50,12 @@ open class ModuleAppActivity : Activity() { override fun getClassLoader(): ClassLoader? = ModuleClassLoader.instance() + @CallSuper + override fun onConfigurationChanged(newConfig: Configuration) { + if (YukiHookBridge.hasXposedBridge) injectModuleAppResources() + super.onConfigurationChanged(newConfig) + } + @CallSuper override fun onRestoreInstanceState(savedInstanceState: Bundle) { savedInstanceState.getBundle("android:viewHierarchyState")?.classLoader = classOf().classLoader diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.kt index 7af8b8c2..5a8b19b1 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/base/ModuleAppCompatActivity.kt @@ -30,10 +30,12 @@ package com.highcapable.yukihookapi.hook.xposed.parasitic.activity.base import android.app.Activity import android.content.Context +import android.content.res.Configuration import android.os.Bundle import androidx.annotation.CallSuper import androidx.appcompat.app.AppCompatActivity import com.highcapable.yukihookapi.hook.factory.classOf +import com.highcapable.yukihookapi.hook.factory.injectModuleAppResources import com.highcapable.yukihookapi.hook.factory.registerModuleAppActivities import com.highcapable.yukihookapi.hook.xposed.bridge.YukiHookBridge import com.highcapable.yukihookapi.hook.xposed.parasitic.reference.ModuleClassLoader @@ -57,6 +59,12 @@ open class ModuleAppCompatActivity : AppCompatActivity() { override fun getClassLoader(): ClassLoader? = ModuleClassLoader.instance() + @CallSuper + override fun onConfigurationChanged(newConfig: Configuration) { + if (YukiHookBridge.hasXposedBridge) injectModuleAppResources() + super.onConfigurationChanged(newConfig) + } + @CallSuper override fun onRestoreInstanceState(savedInstanceState: Bundle) { savedInstanceState.getBundle("android:viewHierarchyState")?.classLoader = classOf().classLoader