summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jeff Sharkey <jsharkey@android.com> 2016-02-15 18:35:57 -0700
committer Jeff Sharkey <jsharkey@android.com> 2016-02-15 18:36:01 -0700
commitbe78258e5530613a56bb9d7c3b4a31a5d248ba85 (patch)
tree2b05cb86bcaac079e1215d27cfbfd4cd0c7515fd
parent115d2c189a46f535778d9dd0923f703ff2f888fe (diff)
Add path cache to avoid SharedPreferences jank.
The old getSharedPreferences() API had a side-effect behavior that subsequent calls wouldn't touch disk if there was a cache hit. Now that we're using File as the cache key, we were generating the path every time, which resulted in touching disk. To bring back the old behavior, let's add yet another cache! Bug: 26979210 Change-Id: Ib8346c6f69ae25f8f164e3b7e05bc6358de38906
-rw-r--r--core/java/android/app/ContextImpl.java29
1 files changed, 23 insertions, 6 deletions
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 282707152e6a..377758ee575a 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<String, ArrayMap<File, SharedPreferencesImpl>> sSharedPrefs;
+ @GuardedBy("ContextImpl.class")
+ private static ArrayMap<String, ArrayMap<File, SharedPreferencesImpl>> sSharedPrefsCache;
+
+ /**
+ * Map from preference name to generated path.
+ */
+ @GuardedBy("ContextImpl.class")
+ private ArrayMap<String, File> 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<File, SharedPreferencesImpl> getSharedPreferencesCacheLocked() {
- if (sSharedPrefs == null) {
- sSharedPrefs = new ArrayMap<>();
+ if (sSharedPrefsCache == null) {
+ sSharedPrefsCache = new ArrayMap<>();
}
final String packageName = getPackageName();
- ArrayMap<File, SharedPreferencesImpl> packagePrefs = sSharedPrefs.get(packageName);
+ ArrayMap<File, SharedPreferencesImpl> packagePrefs = sSharedPrefsCache.get(packageName);
if (packagePrefs == null) {
packagePrefs = new ArrayMap<>();
- sSharedPrefs.put(packageName, packagePrefs);
+ sSharedPrefsCache.put(packageName, packagePrefs);
}
return packagePrefs;