Closed cledwynl closed 1 month ago
设备1:小米11 安卓版本:12 LSPosed 版本:1.9.2 (7024) - Zygisk
设备2:小米13 安卓版本:14 HyperOS 1.0.9.0 LSPosed 版本:1.9.2 (7024) - Zygisk
使用 ModulePreferenceFragment 管理 prefs 时有概率出现无法读取的情况,特别是关闭了 debuggable 的 release 包。进入 shell 查看创建的 prefs 文件,权限为660。
发现如果在调用 ModulePreferenceFragment.onCreatePreferences 前按如下代码所示手动创建 prefs,则能让新创建的 prefs 文件权限为 664,宿主可读取。
ModulePreferenceFragment.onCreatePreferences
override fun onCreatePreferences( savedInstanceState: Bundle?, rootKey: String?, ) { requireActivity().getSharedPreferences( "${activity?.packageName}_preferences", Context.MODE_WORLD_READABLE, ) super.onCreatePreferences(savedInstanceState, rootKey) }
如果没有上面这段代码,ModulePreferenceFragment.onCreatePreferences 会先读取了 currentSharedPrefs,调用了 PreferenceManager.getDefaultSharedPreferences
currentSharedPrefs
PreferenceManager.getDefaultSharedPreferences
private val currentSharedPrefs get() = PreferenceManager.getDefaultSharedPreferences(currentActivity) @CallSuper override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { currentSharedPrefs.registerOnSharedPreferenceChangeListener(this) makeNewXShareReadableIfPossible() onCreatePreferencesInModuleApp(savedInstanceState, rootKey) }
而 PreferenceManager.getDefaultSharedPreferences 中创建的 prefs 权限为 MODE_PRIVATE,导致创建的 prefs 文件权限为 660,后续的 makeNewXShareReadableIfPossible 并未能将 prefs 文件权限改正为 664。
MODE_PRIVATE
makeNewXShareReadableIfPossible
public static SharedPreferences getDefaultSharedPreferences(@NonNull Context context) { return context.getSharedPreferences(getDefaultSharedPreferencesName(context), getDefaultSharedPreferencesMode()); } private static int getDefaultSharedPreferencesMode() { return Context.MODE_PRIVATE; }
相关:
你可以这样测试一下,如果没问题你可以提个 pr 修复一下
设备1:小米11 安卓版本:12 LSPosed 版本:1.9.2 (7024) - Zygisk
设备2:小米13 安卓版本:14 HyperOS 1.0.9.0 LSPosed 版本:1.9.2 (7024) - Zygisk
使用 ModulePreferenceFragment 管理 prefs 时有概率出现无法读取的情况,特别是关闭了 debuggable 的 release 包。进入 shell 查看创建的 prefs 文件,权限为660。
发现如果在调用
ModulePreferenceFragment.onCreatePreferences
前按如下代码所示手动创建 prefs,则能让新创建的 prefs 文件权限为 664,宿主可读取。如果没有上面这段代码,
ModulePreferenceFragment.onCreatePreferences
会先读取了currentSharedPrefs
,调用了PreferenceManager.getDefaultSharedPreferences
而
PreferenceManager.getDefaultSharedPreferences
中创建的 prefs 权限为MODE_PRIVATE
,导致创建的 prefs 文件权限为 660,后续的makeNewXShareReadableIfPossible
并未能将 prefs 文件权限改正为 664。相关: