SharedPreferences的MODE_MULTI_PROCESS是否比MODE_PRIVATE安全

时间:2013-09-26 00:46:43

标签: android process sharedpreferences

Android documentation没有说明任何关于MODE_MULTI_PROCESS的安全性(安全性)是否安全。

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

3 个答案:

答案 0 :(得分:9)

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

一方面是MODE_PRIVATE / MODE_WORLD_READABLE / MODE_WORLD_WRITEABLE而另一方面MODE_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;
}

答案 1 :(得分:0)

我想这不安全。

该文档还指出:“这是Gingerbread(Android 2.3)之前和之前的遗留(但未记录)行为,并且在定位此类版本时会隐含此标志。对于针对大于Android 2.3的SDK版本的应用程序,此标志必须是如果需要,明确设置。“这似乎是一个他们不鼓励使用的旧功能。

答案 2 :(得分:0)

有一种机制可以阻止外部进程的访问:SharedPreferences是app-private。 Android安全模型阻止其他应用程序访问该文件,即使他们可以找出其名称(相信我并不容易)。