diff options
3 files changed, 47 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java index e9c40964aee4..043470f62850 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java @@ -30,6 +30,7 @@ import android.os.PatternMatcher; import android.os.Process; import android.os.ResultReceiver; import android.os.ShellCallback; +import android.os.SystemClock; import android.os.UserHandle; import android.util.Slog; import android.webkit.IWebViewUpdateService; @@ -37,6 +38,7 @@ import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; import com.android.internal.util.DumpUtils; +import com.android.modules.expresslog.Histogram; import com.android.server.LocalServices; import com.android.server.SystemService; @@ -52,6 +54,14 @@ public class WebViewUpdateService extends SystemService { private static final String TAG = "WebViewUpdateService"; + private static final Histogram sPrepareWebViewInSystemServerLatency = new Histogram( + "webview.value_prepare_webview_in_system_server_latency", + new Histogram.ScaledRangeOptions(20, 0, 1, 1.5f)); + + private static final Histogram sAppWaitingForRelroCompletionDelay = new Histogram( + "webview.value_app_waiting_for_relro_completion_delay", + new Histogram.ScaledRangeOptions(20, 0, 1, 1.4f)); + private BroadcastReceiver mWebViewUpdatedReceiver; private WebViewUpdateServiceInterface mImpl; @@ -132,7 +142,10 @@ public class WebViewUpdateService extends SystemService { } public void prepareWebViewInSystemServer() { + long currentTimeMs = SystemClock.uptimeMillis(); mImpl.prepareWebViewInSystemServer(); + sPrepareWebViewInSystemServerLatency.logSample( + (float) (SystemClock.uptimeMillis() - currentTimeMs)); } private static String packageNameFromIntent(Intent intent) { @@ -204,8 +217,12 @@ public class WebViewUpdateService extends SystemService { throw new IllegalStateException("Cannot create a WebView from the SystemServer"); } + long startTimeMs = SystemClock.uptimeMillis(); final WebViewProviderResponse webViewProviderResponse = WebViewUpdateService.this.mImpl.waitForAndGetProvider(); + long endTimeMs = SystemClock.uptimeMillis(); + sAppWaitingForRelroCompletionDelay.logSample((float) (endTimeMs - startTimeMs)); + if (webViewProviderResponse.packageInfo != null) { grantVisibilityToCaller( webViewProviderResponse.packageInfo.packageName, Binder.getCallingUid()); diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java index 1d6ad6d3a6d9..532ff984ae56 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java @@ -23,12 +23,15 @@ import android.content.pm.Signature; import android.os.AsyncTask; import android.os.Trace; import android.os.UserHandle; +import android.util.AndroidRuntimeException; import android.util.Slog; import android.webkit.UserPackage; import android.webkit.WebViewFactory; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; +import com.android.modules.expresslog.Counter; + import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; @@ -357,6 +360,12 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { mNumRelroCreationsFinished = 0; mNumRelroCreationsStarted = mSystemInterface.onWebViewProviderChanged(newPackage); + Counter.logIncrement("webview.value_on_webview_provider_changed_counter"); + if (newPackage.packageName.equals(getDefaultWebViewPackage().packageName)) { + Counter.logIncrement( + "webview.value_on_webview_provider_changed_" + + "with_default_package_counter"); + } // If the relro creations finish before we know the number of started creations // we will have to do any cleanup/notifying here. checkIfRelrosDoneLocked(); @@ -388,9 +397,15 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { @Override public WebViewProviderInfo getDefaultWebViewPackage() { - throw new IllegalStateException( - "getDefaultWebViewPackage shouldn't be called if update_service_v2 flag is" - + " disabled."); + for (WebViewProviderInfo provider : getWebViewPackages()) { + if (provider.availableByDefault) { + return provider; + } + } + + // This should be unreachable because the config parser enforces that there is at least + // one availableByDefault provider. + throw new AndroidRuntimeException("No available by default WebView Provider."); } private static class ProviderAndPackageInfo { diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java index 596de686089e..9bfef4f367de 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java @@ -31,6 +31,8 @@ import android.webkit.WebViewFactory; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; +import com.android.modules.expresslog.Counter; + import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; @@ -383,6 +385,12 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { mNumRelroCreationsFinished = 0; mNumRelroCreationsStarted = mSystemInterface.onWebViewProviderChanged(newPackage); + Counter.logIncrement("webview.value_on_webview_provider_changed_counter"); + if (newPackage.packageName.equals(getDefaultWebViewPackage().packageName)) { + Counter.logIncrement( + "webview.value_on_webview_provider_changed_" + + "with_default_package_counter"); + } // If the relro creations finish before we know the number of started creations // we will have to do any cleanup/notifying here. checkIfRelrosDoneLocked(); @@ -450,6 +458,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { * for all users, otherwise use the default provider. */ private PackageInfo findPreferredWebViewPackage() throws WebViewPackageMissingException { + Counter.logIncrement("webview.value_find_preferred_webview_package_counter"); // If the user has chosen provider, use that (if it's installed and enabled for all // users). String userChosenPackageName = mSystemInterface.getUserChosenWebViewProvider(mContext); @@ -479,12 +488,15 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { PackageInfo packageInfo = mSystemInterface.getPackageInfoForProvider(mDefaultProvider); if (validityResult(mDefaultProvider, packageInfo) == VALIDITY_OK) { return packageInfo; + } else { + Counter.logIncrement("webview.value_default_webview_package_invalid_counter"); } } catch (NameNotFoundException e) { Slog.w(TAG, "Default WebView package (" + mDefaultProvider.packageName + ") not found"); } // This should never happen during normal operation (only with modified system images). + Counter.logIncrement("webview.value_webview_not_usable_for_all_users_counter"); mAnyWebViewInstalled = false; throw new WebViewPackageMissingException("Could not find a loadable WebView package"); } |