Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 53dc3ade authored by Ziad Youssef's avatar Ziad Youssef
Browse files

Add the logging code for WebView Update service metrics

Bug: 308907090

Test: statsd_testdrive 528 593
Change-Id: If5c856c30d730f5e07fa567ea9766a95cea9e7f0
parent 3d736682
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -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());
+18 −3
Original line number Diff line number Diff line
@@ -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 {
+12 −0
Original line number Diff line number Diff line
@@ -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");
    }