Fix when registered activity changed injected resources lost bug

This commit is contained in:
2022-08-21 23:46:15 +08:00
parent 6e552d6ff2
commit a3892079da
5 changed files with 21 additions and 5 deletions

View File

@@ -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。

View File

@@ -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)

View File

@@ -72,9 +72,6 @@ internal object AppParasitics {
/** [Activity] 代理是否已经注册 */
private var isActivityProxyRegister = false
/** 已被注入到宿主 [Resources] 中的当前 Xposed 模块资源 HashCode 数组 */
private val injectedHostResourcesHashCodes = HashSet<Int>()
/**
* 当前 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")

View File

@@ -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<ModuleAppActivity>().classLoader

View File

@@ -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<ModuleAppActivity>().classLoader