From 9455bd0105f974de3d1164890353c2a0d0605840 Mon Sep 17 00:00:00 2001 From: Hui Shu Date: Fri, 8 Apr 2016 13:25:26 -0700 Subject: [PATCH] Cache the parsed result of WebView provider config xml BUG: 27736084 Change-Id: I3665a5fd4777d22c6f217b358195edbeaad3bb1d --- .../java/com/android/server/webkit/SystemImpl.java | 29 ++++++++++++++++------ .../server/webkit/WebViewUpdateService.java | 2 +- .../server/webkit/WebViewUpdateServiceImpl.java | 2 +- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/webkit/SystemImpl.java b/services/core/java/com/android/server/webkit/SystemImpl.java index 876bb20d2573..361f0d47fc61 100644 --- a/services/core/java/com/android/server/webkit/SystemImpl.java +++ b/services/core/java/com/android/server/webkit/SystemImpl.java @@ -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 { diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java index bbb49511a805..9b971e0557f8 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java @@ -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 diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java index 8c01c4cf76a1..7ad88db8a82b 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java @@ -400,7 +400,7 @@ public class WebViewUpdateServiceImpl { } - private class ProviderAndPackageInfo { + private static class ProviderAndPackageInfo { public final WebViewProviderInfo provider; public final PackageInfo packageInfo; -- 2.11.0