android - SharedPreferences 的 MODE_MULTI_PROCESS 是否不如 MODE_PRIVATE 安全

标签 android process sharedpreferences

Android documentation没有说明任何关于 MODE_MULTI_PROCESS 是否安全(安全方面)的信息。

那么,它安全吗?有理由不使用它吗?

最佳答案

该标志与安全无关,与访问并发有关。它效率较低,但尽量避免由多个进程(来自同一应用程序)访问底层文件引起的问题。如果您不编写多进程应用程序,则不需要它。如果这样做,文档建议使用其他进程间通信。文档出于性能原因而不是安全性原因建议不要这样做。

因此,MODE_PRIVATE/MODE_WORLD_READABLE/MODE_WORLD_WRITEABLEMODE_MULTI_PROCESS 是正交标志。如果您使用以下方式打开 SharedPreferences:

  • MODE_PRIVATE --> 安全
  • MODE_WORLD_READABLE --> 不安全
  • MODE_PRIVATE | MODE_MULTI_PROCESS --> 安全
  • MODE_WORLD_READABLE | MODE_MULTI_PROCESS --> 不安全

并且由于 MODE_PRIVATE 的值为 0:MODE_MULTI_PROCESS 等同于 MODE_PRIVATE | MODE_MULTI_PROCESS(即安全)

实际上 MODE_MULTI_PROCESS 源代码中唯一的用途是在 ContextImpl 类中:

@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
    SharedPreferencesImpl sp;
    synchronized (sSharedPrefs) {
        sp = sSharedPrefs.get(name);
        if (sp == null) {
            File prefsFile = getSharedPrefsFile(name);
            sp = new SharedPreferencesImpl(prefsFile, mode);
            sSharedPrefs.put(name, sp);
            return sp;
        }
    }
    if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
        getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
        // If somebody else (some other process) changed the prefs
        // file behind our back, we reload it.  This has been the
        // historical (if undocumented) behavior.
        sp.startReloadIfChangedUnexpectedly();
    }
    return sp;
}

关于android - SharedPreferences 的 MODE_MULTI_PROCESS 是否不如 MODE_PRIVATE 安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19017518/

相关文章:

android - 使用 Gson JSONObject 解析 JSON 包含 JSON 数组列表

java - 使用java时进程输入流有限制吗?

Objective-c 获取进程列表、它们的路径和参数

android - 从 PreferenceActivity 或 PreferenceFragment 中的资源添加特定命名的 SharedPreferences

android - 如何在同一应用程序中跨钩子(Hook)保持 Xposed 模块中的值(value)

android - Chrome 徽章显示在 'Add To Homescreen' 已安装的 PWA 上(仅安装快捷方式)

android - OpenGL ES2.0 glReadPixels() 通过帧缓冲区从渲染缓冲区读取数据

android - 在 android 中使用共享首选项保存数据

安卓:启动谷歌地图应用程序

c - 为什么这不打印到标准输出 (stdout)?