mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
Fix when registered activity changed injected resources lost bug
This commit is contained in:
@@ -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。
|
||||
|
@@ -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)
|
||||
|
@@ -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")
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user