HighCapable / YukiHookAPI

⛱️ An efficient Hook API and Xposed Module solution built in Kotlin.
https://highcapable.github.io/YukiHookAPI/
Apache License 2.0
1.42k stars 105 forks source link

通过 ModulePreferenceFragment 创建的 prefs 无法被宿主读取 #86

Closed cledwynl closed 1 month ago

cledwynl commented 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,宿主可读取。

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

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。

public static SharedPreferences getDefaultSharedPreferences(@NonNull Context context) {
    return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
            getDefaultSharedPreferencesMode());
}

private static int getDefaultSharedPreferencesMode() {
    return Context.MODE_PRIVATE;
}

相关:

fankes commented 1 month ago

你可以这样测试一下,如果没问题你可以提个 pr 修复一下