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

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

View File

@@ -32,6 +32,7 @@ package com.highcapable.yukihookapi.hook.param
import android.app.Application
import android.content.pm.ApplicationInfo
import android.content.res.Resources
import com.highcapable.yukihookapi.YukiHookAPI
import com.highcapable.yukihookapi.hook.bean.HookClass
import com.highcapable.yukihookapi.hook.bean.HookResources
import com.highcapable.yukihookapi.hook.bean.VariousClass
@@ -139,7 +140,9 @@ open class PackageParam(@PublishedApi internal var wrapper: PackageParamWrapper?
* @return [YukiModuleResources]
* @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
}
/** 刷新当前 Xposed 模块自身 [Resources] */
fun refreshModuleAppResources() = YukiHookBridge.refreshModuleAppResources()
/**
* 装载并 Hook 指定、全部包名的 APP
*

View File

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

View File

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