diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 7f86600338534..5e8d1908eb182 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -134,7 +134,14 @@ class ContextImpl extends Context { /** * Map from package name, to preference name, to cached preferences. */ - private static ArrayMap> sSharedPrefs; + @GuardedBy("ContextImpl.class") + private static ArrayMap> sSharedPrefsCache; + + /** + * Map from preference name to generated path. + */ + @GuardedBy("ContextImpl.class") + private ArrayMap mSharedPrefsPaths; final ActivityThread mMainThread; final LoadedApk mPackageInfo; @@ -335,7 +342,17 @@ class ContextImpl extends Context { } } - final File file = getSharedPreferencesPath(name); + File file; + synchronized (ContextImpl.class) { + if (mSharedPrefsPaths == null) { + mSharedPrefsPaths = new ArrayMap<>(); + } + file = mSharedPrefsPaths.get(name); + if (file == null) { + file = getSharedPreferencesPath(name); + mSharedPrefsPaths.put(name, file); + } + } return getSharedPreferences(file, mode); } @@ -363,15 +380,15 @@ class ContextImpl extends Context { } private ArrayMap getSharedPreferencesCacheLocked() { - if (sSharedPrefs == null) { - sSharedPrefs = new ArrayMap<>(); + if (sSharedPrefsCache == null) { + sSharedPrefsCache = new ArrayMap<>(); } final String packageName = getPackageName(); - ArrayMap packagePrefs = sSharedPrefs.get(packageName); + ArrayMap packagePrefs = sSharedPrefsCache.get(packageName); if (packagePrefs == null) { packagePrefs = new ArrayMap<>(); - sSharedPrefs.put(packageName, packagePrefs); + sSharedPrefsCache.put(packageName, packagePrefs); } return packagePrefs;