3

Android 文档没有说明任何关于 MODE_MULTI_PROCESS 是否安全(安全方面)的内容。

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

4

3 回答 3

9

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

所以MODE_PRIVATE//一方面是正交标志MODE_WORLD_READABLE。如果您打开with :MODE_WORLD_WRITEABLEMODE_MULTI_PROCESSSharedPreferences

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

并且 asMODE_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;
}
于 2013-09-26T00:59:58.483 回答
0

我想这不安全。

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

于 2013-09-26T00:51:46.240 回答
0

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

于 2013-09-26T01:07:07.210 回答