OSDN Git Service

Cache the parsed result of WebView provider config xml
authorHui Shu <hush@google.com>
Fri, 8 Apr 2016 20:25:26 +0000 (13:25 -0700)
committerHui Shu <hush@google.com>
Thu, 14 Apr 2016 17:56:20 +0000 (10:56 -0700)
BUG: 27736084
Change-Id: I3665a5fd4777d22c6f217b358195edbeaad3bb1d

services/core/java/com/android/server/webkit/SystemImpl.java
services/core/java/com/android/server/webkit/WebViewUpdateService.java
services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java

index 876bb20..361f0d4 100644 (file)
@@ -59,13 +59,19 @@ public class SystemImpl implements SystemInterface {
     private static final String TAG_AVAILABILITY = "availableByDefault";
     private static final String TAG_SIGNATURE = "signature";
     private static final String TAG_FALLBACK = "isFallback";
+    private final WebViewProviderInfo[] mWebViewProviderPackages;
 
-    /**
-     * Returns all packages declared in the framework resources as potential WebView providers.
-     * @hide
-     * */
-    @Override
-    public WebViewProviderInfo[] getWebViewPackages() {
+    // Initialization-on-demand holder idiom for getting the WebView provider packages once and
+    // for all in a thread-safe manner.
+    private static class LazyHolder {
+        private static final SystemImpl INSTANCE = new SystemImpl();
+    }
+
+    public static SystemImpl getInstance() {
+        return LazyHolder.INSTANCE;
+    }
+
+    private SystemImpl() {
         int numFallbackPackages = 0;
         int numAvailableByDefaultPackages = 0;
         int numAvByDefaultAndNotFallback = 0;
@@ -135,7 +141,16 @@ public class SystemImpl implements SystemInterface {
             throw new AndroidRuntimeException("There must be at least one WebView package "
                     + "that is available by default and not a fallback");
         }
-        return webViewProviders.toArray(new WebViewProviderInfo[webViewProviders.size()]);
+        mWebViewProviderPackages =
+                webViewProviders.toArray(new WebViewProviderInfo[webViewProviders.size()]);
+    }
+    /**
+     * Returns all packages declared in the framework resources as potential WebView providers.
+     * @hide
+     * */
+    @Override
+    public WebViewProviderInfo[] getWebViewPackages() {
+        return mWebViewProviderPackages;
     }
 
     public int getFactoryPackageVersion(String packageName) throws NameNotFoundException {
index bbb4951..9b971e0 100644 (file)
@@ -55,7 +55,7 @@ public class WebViewUpdateService extends SystemService {
 
     public WebViewUpdateService(Context context) {
         super(context);
-        mImpl = new WebViewUpdateServiceImpl(context, new SystemImpl());
+        mImpl = new WebViewUpdateServiceImpl(context, SystemImpl.getInstance());
     }
 
     @Override
index 8c01c4c..7ad88db 100644 (file)
@@ -400,7 +400,7 @@ public class WebViewUpdateServiceImpl {
         }
 
 
-        private class ProviderAndPackageInfo {
+        private static class ProviderAndPackageInfo {
             public final WebViewProviderInfo provider;
             public final PackageInfo packageInfo;