SharedPreferences的MODE_MULTI_PROCESS是否比MODE_PRIVATE安全

dor*_*ors 3 android process sharedpreferences

Android文档没有说明任何有关,而MODE_MULTI_PROCESS是安全的(安全明智)与否.

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

bwt*_*bwt 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;
}
Run Code Online (Sandbox Code Playgroud)