Added refreshModuleAppResources function

This commit is contained in:
2022-05-10 01:34:27 +08:00
parent 4c576e1f72
commit 1a39e46742
7 changed files with 75 additions and 4 deletions

View File

@@ -67,6 +67,11 @@ class HookEntry : IYukiHookXposedInit {
// 若无和模块频繁交互数据在宿主重新启动之前建议开启 // 若无和模块频繁交互数据在宿主重新启动之前建议开启
// 若需要实时交互数据建议关闭或从 [YukiHookModulePrefs] 中进行动态配置 // 若需要实时交互数据建议关闭或从 [YukiHookModulePrefs] 中进行动态配置
isEnableModulePrefsCache = true isEnableModulePrefsCache = true
// 是否启用当前 Xposed 模块自身 [Resources] 缓存功能
// 一般情况下模块的 Resources 是不会改变的 - 但是在语言区域更改、分辨率更改等情况下 - 就需要刷新缓存
// 若无上述需求 - 在宿主重新启动之前建议开启
// 你可以手动调用 [PackageParam.refreshModuleAppResources] 来刷新缓存
isEnableModuleAppResourcesCache = true
// 是否启用 [Member] 缓存功能 // 是否启用 [Member] 缓存功能
// 为防止 [Member] 复用过高造成的系统 GC 问题 - 此功能默认启用 // 为防止 [Member] 复用过高造成的系统 GC 问题 - 此功能默认启用
// 除非缓存的 [Member] 发生了混淆的问题 - 否则建议启用 // 除非缓存的 [Member] 发生了混淆的问题 - 否则建议启用

View File

@@ -216,6 +216,20 @@ fun resources(): HookResources
请调用 `HookResources.hook` 方法开始 Hook。 请调用 `HookResources.hook` 方法开始 Hook。
### refreshModuleAppResources [method]
```kotlin
fun refreshModuleAppResources()
```
**变更记录**
`v1.0.87` `新增`
**功能描述**
> 刷新当前 Xposed 模块自身 `Resources`。
### loadApp [method] ### loadApp [method]
```kotlin ```kotlin

View File

@@ -152,12 +152,32 @@ var isEnableModulePrefsCache: Boolean
你可以手动在 `YukiHookModulePrefs` 中自由开启和关闭缓存功能以及清除缓存。 你可以手动在 `YukiHookModulePrefs` 中自由开启和关闭缓存功能以及清除缓存。
#### isEnableModuleAppResourcesCache [field]
```kotlin
var isEnableModuleAppResourcesCache: Boolean
```
**变更记录**
`v1.0.87` `新增`
**功能描述**
> 是否启用当前 Xposed 模块自身 `Resources` 缓存功能。
为防止内存复用过高问题,此功能默认启用。
你可以手动调用 `PackageParam.refreshModuleAppResources` 来刷新缓存。
!> 关闭后每次使用 `PackageParam.moduleAppResources` 都会重新创建,可能会造成运行缓慢。
#### isEnableMemberCache [field] #### isEnableMemberCache [field]
```kotlin ```kotlin
var isEnableMemberCache: Boolean var isEnableMemberCache: Boolean
``` ```
ø
**变更记录** **变更记录**
`v1.0.68` `新增` `v1.0.68` `新增`
@@ -211,6 +231,7 @@ class HookEntryClass : IYukiHookXposedInit {
isDebug = true isDebug = true
isAllowPrintingLogs = true isAllowPrintingLogs = true
isEnableModulePrefsCache = true isEnableModulePrefsCache = true
isEnableModuleAppResourcesCache = true
isEnableMemberCache = true isEnableMemberCache = true
} }
} }
@@ -233,6 +254,7 @@ class HookEntryClass : IYukiHookXposedInit {
isDebug = true isDebug = true
isAllowPrintingLogs = true isAllowPrintingLogs = true
isEnableModulePrefsCache = true isEnableModulePrefsCache = true
isEnableModuleAppResourcesCache = true
isEnableMemberCache = true isEnableMemberCache = true
} }
@@ -254,6 +276,7 @@ class HookEntryClass : IYukiHookXposedInit {
YukiHookAPI.Configs.isDebug = true YukiHookAPI.Configs.isDebug = true
YukiHookAPI.Configs.isAllowPrintingLogs = true YukiHookAPI.Configs.isAllowPrintingLogs = true
YukiHookAPI.Configs.isEnableModulePrefsCache = true YukiHookAPI.Configs.isEnableModulePrefsCache = true
YukiHookAPI.Configs.isEnableModuleAppResourcesCache = true
YukiHookAPI.Configs.isEnableMemberCache = true YukiHookAPI.Configs.isEnableMemberCache = true
} }

View File

@@ -31,6 +31,7 @@ package com.highcapable.yukihookapi
import android.app.Application import android.app.Application
import android.content.Context import android.content.Context
import android.content.res.Resources
import com.highcapable.yukihookapi.YukiHookAPI.configs import com.highcapable.yukihookapi.YukiHookAPI.configs
import com.highcapable.yukihookapi.YukiHookAPI.encase import com.highcapable.yukihookapi.YukiHookAPI.encase
import com.highcapable.yukihookapi.hook.core.finder.ConstructorFinder import com.highcapable.yukihookapi.hook.core.finder.ConstructorFinder
@@ -139,6 +140,17 @@ object YukiHookAPI {
*/ */
var isEnableModulePrefsCache = true var isEnableModulePrefsCache = true
/**
* 是否启用当前 Xposed 模块自身 [Resources] 缓存功能
*
* - 为防止内存复用过高问题 - 此功能默认启用
*
* - ❗关闭后每次使用 [PackageParam.moduleAppResources] 都会重新创建 - 可能会造成运行缓慢
*
* 你可以手动调用 [PackageParam.refreshModuleAppResources] 来刷新缓存
*/
var isEnableModuleAppResourcesCache = true
/** /**
* 是否启用 [Member] 缓存功能 * 是否启用 [Member] 缓存功能
* *

View File

@@ -32,6 +32,7 @@ package com.highcapable.yukihookapi.hook.param
import android.app.Application import android.app.Application
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import android.content.res.Resources import android.content.res.Resources
import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.hook.bean.HookClass import com.highcapable.yukihookapi.hook.bean.HookClass
import com.highcapable.yukihookapi.hook.bean.HookResources import com.highcapable.yukihookapi.hook.bean.HookResources
import com.highcapable.yukihookapi.hook.bean.VariousClass import com.highcapable.yukihookapi.hook.bean.VariousClass
@@ -139,7 +140,9 @@ open class PackageParam(@PublishedApi internal var wrapper: PackageParamWrapper?
* @return [YukiModuleResources] * @return [YukiModuleResources]
* @throws IllegalStateException 如果当前 Hook Framework 不支持此功能 * @throws IllegalStateException 如果当前 Hook Framework 不支持此功能
*/ */
val moduleAppResources get() = YukiHookBridge.moduleAppResources ?: error("Current Hook Framework not support moduleAppResources") val moduleAppResources
get() = (if (YukiHookAPI.Configs.isEnableModuleAppResourcesCache) YukiHookBridge.moduleAppResources
else YukiHookBridge.dynamicModuleAppResources) ?: error("Current Hook Framework not support moduleAppResources")
/** /**
* 获得当前使用的存取数据对象缓存实例 * 获得当前使用的存取数据对象缓存实例
@@ -174,6 +177,9 @@ open class PackageParam(@PublishedApi internal var wrapper: PackageParamWrapper?
this.wrapper = anotherParam.wrapper this.wrapper = anotherParam.wrapper
} }
/** 刷新当前 Xposed 模块自身 [Resources] */
fun refreshModuleAppResources() = YukiHookBridge.refreshModuleAppResources()
/** /**
* 装载并 Hook 指定、全部包名的 APP * 装载并 Hook 指定、全部包名的 APP
* *

View File

@@ -77,6 +77,12 @@ object YukiHookBridge {
/** 当前 Xposed 模块自身 [Resources] */ /** 当前 Xposed 模块自身 [Resources] */
internal var moduleAppResources: YukiModuleResources? = null internal var moduleAppResources: YukiModuleResources? = null
/**
* 获取当前 Xposed 模块自身动态 [Resources]
* @return [YukiModuleResources] or null
*/
internal val dynamicModuleAppResources get() = runCatching { YukiModuleResources.createInstance(moduleAppFilePath) }.getOrNull()
/** /**
* 模块是否装载了 Xposed 回调方法 * 模块是否装载了 Xposed 回调方法
* *
@@ -185,6 +191,11 @@ object YukiHookBridge {
} }
} }
/** 刷新当前 Xposed 模块自身 [Resources] */
internal fun refreshModuleAppResources() {
dynamicModuleAppResources?.let { moduleAppResources = it }
}
/** /**
* 标识 Xposed API 装载完成 * 标识 Xposed API 装载完成
* *
@@ -204,7 +215,7 @@ object YukiHookBridge {
@YukiGenerateApi @YukiGenerateApi
fun callXposedZygoteLoaded(sparam: IXposedHookZygoteInit.StartupParam) { fun callXposedZygoteLoaded(sparam: IXposedHookZygoteInit.StartupParam) {
moduleAppFilePath = sparam.modulePath moduleAppFilePath = sparam.modulePath
moduleAppResources = YukiModuleResources.createInstance(moduleAppFilePath) refreshModuleAppResources()
} }
/** /**

View File

@@ -53,7 +53,7 @@ class YukiModuleResources(private val baseInstance: XModuleResources) :
* @param path Xposed 模块 APK 路径 * @param path Xposed 模块 APK 路径
* @return [YukiModuleResources] * @return [YukiModuleResources]
*/ */
fun createInstance(path: String) = YukiModuleResources(XModuleResources.createInstance(path, null)) internal fun createInstance(path: String) = YukiModuleResources(XModuleResources.createInstance(path, null))
} }
/** /**