From e97e2367d3006e7a7c7e262acb61165dc515509c Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Mon, 16 May 2022 15:21:26 +0800 Subject: [PATCH] Make YukiHookModulePrefs singleton --- docs/api/public/YukiHookModulePrefs.md | 2 +- docs/config/api-exception.md | 2 +- .../hook/factory/YukiHookFactory.kt | 4 +-- .../yukihookapi/hook/param/PackageParam.kt | 2 +- .../hook/xposed/prefs/YukiHookModulePrefs.kt | 27 ++++++++++++++----- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/docs/api/public/YukiHookModulePrefs.md b/docs/api/public/YukiHookModulePrefs.md index 693d6b41..c0ef9f8a 100644 --- a/docs/api/public/YukiHookModulePrefs.md +++ b/docs/api/public/YukiHookModulePrefs.md @@ -1,7 +1,7 @@ ## YukiHookModulePrefs [class] ```kotlin -class YukiHookModulePrefs(private val context: Context?) +class YukiHookModulePrefs(private var context: Context?) ``` **变更记录** diff --git a/docs/config/api-exception.md b/docs/config/api-exception.md index ab354b53..64b8c1ea 100644 --- a/docs/config/api-exception.md +++ b/docs/config/api-exception.md @@ -539,7 +539,7 @@ class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - // 可以使用但是不推荐 + // ❗为防止存在多个实例 - 不要这样使用 YukiHookModulePrefs(this).getBoolean("test_data") // ✅ 推荐的使用方法 modulePrefs.getBoolean("test_data") 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 224aa62e..8e31c0a9 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 @@ -77,14 +77,14 @@ fun YukiHookXposedInitProxy.encase(vararg hooker: YukiBaseHooker) = YukiHookAPI. * 获取模块的存取对象 * @return [YukiHookModulePrefs] */ -val Context.modulePrefs get() = YukiHookModulePrefs(context = this) +val Context.modulePrefs get() = YukiHookModulePrefs.instance(context = this) /** * 获取模块的存取对象 * @param name 自定义 Sp 存储名称 * @return [YukiHookModulePrefs] */ -fun Context.modulePrefs(name: String) = YukiHookModulePrefs(context = this).name(name) +fun Context.modulePrefs(name: String) = YukiHookModulePrefs.instance(context = this).name(name) /** * 获取当前进程名称 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt index 4b448d37..1f3cabf1 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt @@ -150,7 +150,7 @@ open class PackageParam(@PublishedApi internal var wrapper: PackageParamWrapper? * - ❗作为 Hook API 装载时无法使用 - 会抛出异常 * @return [YukiHookModulePrefs] */ - val prefs by lazy { YukiHookModulePrefs() } + val prefs get() = YukiHookModulePrefs.instance() /** * 获得当前使用的存取数据对象缓存实例 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.kt index 69528bdc..eb0e6a8e 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/prefs/YukiHookModulePrefs.kt @@ -27,7 +27,7 @@ */ @file:Suppress( "SetWorldReadable", "CommitPrefEdits", "DEPRECATION", "WorldReadableFiles", - "unused", "UNCHECKED_CAST", "MemberVisibilityCanBePrivate" + "unused", "UNCHECKED_CAST", "MemberVisibilityCanBePrivate", "StaticFieldLeak" ) package com.highcapable.yukihookapi.hook.xposed.prefs @@ -64,19 +64,34 @@ import java.io.File * - 详情请参考 [API 文档 - YukiHookModulePrefs](https://fankes.github.io/YukiHookAPI/#/api/document?id=yukihookmoduleprefs-class) * @param context 上下文实例 - 默认空 */ -class YukiHookModulePrefs(private val context: Context? = null) { +class YukiHookModulePrefs(private var context: Context? = null) { internal companion object { + /** 当前 [YukiHookModulePrefs] 单例 */ + private var instance: YukiHookModulePrefs? = null + + /** + * 获取 [YukiHookModulePrefs] 单例 + * @param context 实例 - Xposed 环境为空 + * @return [YukiHookModulePrefs] + */ + internal fun instance(context: Context? = null) = + instance?.apply { this.context = context } ?: YukiHookModulePrefs(context).apply { instance = this } + /** * 设置全局可读可写 * @param context 实例 * @param prefsFileName Sp 文件名 */ - internal fun makeWorldReadable(context: Context?, prefsFileName: String) = runCatching { - File(File(context!!.applicationInfo.dataDir, "shared_prefs"), prefsFileName).apply { - setReadable(true, false) - setExecutable(true, false) + internal fun makeWorldReadable(context: Context?, prefsFileName: String) { + runCatching { + context?.also { + File(File(it.applicationInfo.dataDir, "shared_prefs"), prefsFileName).apply { + setReadable(true, false) + setExecutable(true, false) + } + } } } }