Loading services/core/java/com/android/server/webkit/WebViewUpdateService.java +17 −0 Original line number Original line Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.os.PatternMatcher; import android.os.Process; import android.os.Process; import android.os.ResultReceiver; import android.os.ResultReceiver; import android.os.ShellCallback; import android.os.ShellCallback; import android.os.SystemClock; import android.os.UserHandle; import android.os.UserHandle; import android.util.Slog; import android.util.Slog; import android.webkit.IWebViewUpdateService; import android.webkit.IWebViewUpdateService; Loading @@ -37,6 +38,7 @@ import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; import android.webkit.WebViewProviderResponse; import com.android.internal.util.DumpUtils; import com.android.internal.util.DumpUtils; import com.android.modules.expresslog.Histogram; import com.android.server.LocalServices; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.SystemService; Loading @@ -52,6 +54,14 @@ public class WebViewUpdateService extends SystemService { private static final String TAG = "WebViewUpdateService"; 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 BroadcastReceiver mWebViewUpdatedReceiver; private WebViewUpdateServiceInterface mImpl; private WebViewUpdateServiceInterface mImpl; Loading Loading @@ -132,7 +142,10 @@ public class WebViewUpdateService extends SystemService { } } public void prepareWebViewInSystemServer() { public void prepareWebViewInSystemServer() { long currentTimeMs = SystemClock.uptimeMillis(); mImpl.prepareWebViewInSystemServer(); mImpl.prepareWebViewInSystemServer(); sPrepareWebViewInSystemServerLatency.logSample( (float) (SystemClock.uptimeMillis() - currentTimeMs)); } } private static String packageNameFromIntent(Intent intent) { private static String packageNameFromIntent(Intent intent) { Loading Loading @@ -204,8 +217,12 @@ public class WebViewUpdateService extends SystemService { throw new IllegalStateException("Cannot create a WebView from the SystemServer"); throw new IllegalStateException("Cannot create a WebView from the SystemServer"); } } long startTimeMs = SystemClock.uptimeMillis(); final WebViewProviderResponse webViewProviderResponse = final WebViewProviderResponse webViewProviderResponse = WebViewUpdateService.this.mImpl.waitForAndGetProvider(); WebViewUpdateService.this.mImpl.waitForAndGetProvider(); long endTimeMs = SystemClock.uptimeMillis(); sAppWaitingForRelroCompletionDelay.logSample((float) (endTimeMs - startTimeMs)); if (webViewProviderResponse.packageInfo != null) { if (webViewProviderResponse.packageInfo != null) { grantVisibilityToCaller( grantVisibilityToCaller( webViewProviderResponse.packageInfo.packageName, Binder.getCallingUid()); webViewProviderResponse.packageInfo.packageName, Binder.getCallingUid()); Loading services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +18 −3 Original line number Original line Diff line number Diff line Loading @@ -23,12 +23,15 @@ import android.content.pm.Signature; import android.os.AsyncTask; import android.os.AsyncTask; import android.os.Trace; import android.os.Trace; import android.os.UserHandle; import android.os.UserHandle; import android.util.AndroidRuntimeException; import android.util.Slog; import android.util.Slog; import android.webkit.UserPackage; import android.webkit.UserPackage; import android.webkit.WebViewFactory; import android.webkit.WebViewFactory; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; import android.webkit.WebViewProviderResponse; import com.android.modules.expresslog.Counter; import java.io.PrintWriter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.ArrayList; import java.util.List; import java.util.List; Loading Loading @@ -357,6 +360,12 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { mNumRelroCreationsFinished = 0; mNumRelroCreationsFinished = 0; mNumRelroCreationsStarted = mNumRelroCreationsStarted = mSystemInterface.onWebViewProviderChanged(newPackage); 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 // If the relro creations finish before we know the number of started creations // we will have to do any cleanup/notifying here. // we will have to do any cleanup/notifying here. checkIfRelrosDoneLocked(); checkIfRelrosDoneLocked(); Loading Loading @@ -388,9 +397,15 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { @Override @Override public WebViewProviderInfo getDefaultWebViewPackage() { public WebViewProviderInfo getDefaultWebViewPackage() { throw new IllegalStateException( for (WebViewProviderInfo provider : getWebViewPackages()) { "getDefaultWebViewPackage shouldn't be called if update_service_v2 flag is" if (provider.availableByDefault) { + " disabled."); 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 { private static class ProviderAndPackageInfo { Loading services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java +12 −0 Original line number Original line Diff line number Diff line Loading @@ -31,6 +31,8 @@ import android.webkit.WebViewFactory; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; import android.webkit.WebViewProviderResponse; import com.android.modules.expresslog.Counter; import java.io.PrintWriter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.ArrayList; import java.util.List; import java.util.List; Loading Loading @@ -412,6 +414,12 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { mNumRelroCreationsFinished = 0; mNumRelroCreationsFinished = 0; mNumRelroCreationsStarted = mNumRelroCreationsStarted = mSystemInterface.onWebViewProviderChanged(newPackage); 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 // If the relro creations finish before we know the number of started creations // we will have to do any cleanup/notifying here. // we will have to do any cleanup/notifying here. checkIfRelrosDoneLocked(); checkIfRelrosDoneLocked(); Loading Loading @@ -479,6 +487,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { * for all users, otherwise use the default provider. * for all users, otherwise use the default provider. */ */ private PackageInfo findPreferredWebViewPackage() throws WebViewPackageMissingException { 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 // If the user has chosen provider, use that (if it's installed and enabled for all // users). // users). String userChosenPackageName = mSystemInterface.getUserChosenWebViewProvider(mContext); String userChosenPackageName = mSystemInterface.getUserChosenWebViewProvider(mContext); Loading Loading @@ -508,12 +517,15 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { PackageInfo packageInfo = mSystemInterface.getPackageInfoForProvider(mDefaultProvider); PackageInfo packageInfo = mSystemInterface.getPackageInfoForProvider(mDefaultProvider); if (validityResult(mDefaultProvider, packageInfo) == VALIDITY_OK) { if (validityResult(mDefaultProvider, packageInfo) == VALIDITY_OK) { return packageInfo; return packageInfo; } else { Counter.logIncrement("webview.value_default_webview_package_invalid_counter"); } } } catch (NameNotFoundException e) { } catch (NameNotFoundException e) { Slog.w(TAG, "Default WebView package (" + mDefaultProvider.packageName + ") not found"); Slog.w(TAG, "Default WebView package (" + mDefaultProvider.packageName + ") not found"); } } // This should never happen during normal operation (only with modified system images). // 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; mAnyWebViewInstalled = false; throw new WebViewPackageMissingException("Could not find a loadable WebView package"); throw new WebViewPackageMissingException("Could not find a loadable WebView package"); } } Loading Loading
services/core/java/com/android/server/webkit/WebViewUpdateService.java +17 −0 Original line number Original line Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.os.PatternMatcher; import android.os.Process; import android.os.Process; import android.os.ResultReceiver; import android.os.ResultReceiver; import android.os.ShellCallback; import android.os.ShellCallback; import android.os.SystemClock; import android.os.UserHandle; import android.os.UserHandle; import android.util.Slog; import android.util.Slog; import android.webkit.IWebViewUpdateService; import android.webkit.IWebViewUpdateService; Loading @@ -37,6 +38,7 @@ import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; import android.webkit.WebViewProviderResponse; import com.android.internal.util.DumpUtils; import com.android.internal.util.DumpUtils; import com.android.modules.expresslog.Histogram; import com.android.server.LocalServices; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.SystemService; Loading @@ -52,6 +54,14 @@ public class WebViewUpdateService extends SystemService { private static final String TAG = "WebViewUpdateService"; 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 BroadcastReceiver mWebViewUpdatedReceiver; private WebViewUpdateServiceInterface mImpl; private WebViewUpdateServiceInterface mImpl; Loading Loading @@ -132,7 +142,10 @@ public class WebViewUpdateService extends SystemService { } } public void prepareWebViewInSystemServer() { public void prepareWebViewInSystemServer() { long currentTimeMs = SystemClock.uptimeMillis(); mImpl.prepareWebViewInSystemServer(); mImpl.prepareWebViewInSystemServer(); sPrepareWebViewInSystemServerLatency.logSample( (float) (SystemClock.uptimeMillis() - currentTimeMs)); } } private static String packageNameFromIntent(Intent intent) { private static String packageNameFromIntent(Intent intent) { Loading Loading @@ -204,8 +217,12 @@ public class WebViewUpdateService extends SystemService { throw new IllegalStateException("Cannot create a WebView from the SystemServer"); throw new IllegalStateException("Cannot create a WebView from the SystemServer"); } } long startTimeMs = SystemClock.uptimeMillis(); final WebViewProviderResponse webViewProviderResponse = final WebViewProviderResponse webViewProviderResponse = WebViewUpdateService.this.mImpl.waitForAndGetProvider(); WebViewUpdateService.this.mImpl.waitForAndGetProvider(); long endTimeMs = SystemClock.uptimeMillis(); sAppWaitingForRelroCompletionDelay.logSample((float) (endTimeMs - startTimeMs)); if (webViewProviderResponse.packageInfo != null) { if (webViewProviderResponse.packageInfo != null) { grantVisibilityToCaller( grantVisibilityToCaller( webViewProviderResponse.packageInfo.packageName, Binder.getCallingUid()); webViewProviderResponse.packageInfo.packageName, Binder.getCallingUid()); Loading
services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +18 −3 Original line number Original line Diff line number Diff line Loading @@ -23,12 +23,15 @@ import android.content.pm.Signature; import android.os.AsyncTask; import android.os.AsyncTask; import android.os.Trace; import android.os.Trace; import android.os.UserHandle; import android.os.UserHandle; import android.util.AndroidRuntimeException; import android.util.Slog; import android.util.Slog; import android.webkit.UserPackage; import android.webkit.UserPackage; import android.webkit.WebViewFactory; import android.webkit.WebViewFactory; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; import android.webkit.WebViewProviderResponse; import com.android.modules.expresslog.Counter; import java.io.PrintWriter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.ArrayList; import java.util.List; import java.util.List; Loading Loading @@ -357,6 +360,12 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { mNumRelroCreationsFinished = 0; mNumRelroCreationsFinished = 0; mNumRelroCreationsStarted = mNumRelroCreationsStarted = mSystemInterface.onWebViewProviderChanged(newPackage); 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 // If the relro creations finish before we know the number of started creations // we will have to do any cleanup/notifying here. // we will have to do any cleanup/notifying here. checkIfRelrosDoneLocked(); checkIfRelrosDoneLocked(); Loading Loading @@ -388,9 +397,15 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { @Override @Override public WebViewProviderInfo getDefaultWebViewPackage() { public WebViewProviderInfo getDefaultWebViewPackage() { throw new IllegalStateException( for (WebViewProviderInfo provider : getWebViewPackages()) { "getDefaultWebViewPackage shouldn't be called if update_service_v2 flag is" if (provider.availableByDefault) { + " disabled."); 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 { private static class ProviderAndPackageInfo { Loading
services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java +12 −0 Original line number Original line Diff line number Diff line Loading @@ -31,6 +31,8 @@ import android.webkit.WebViewFactory; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; import android.webkit.WebViewProviderResponse; import com.android.modules.expresslog.Counter; import java.io.PrintWriter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.ArrayList; import java.util.List; import java.util.List; Loading Loading @@ -412,6 +414,12 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { mNumRelroCreationsFinished = 0; mNumRelroCreationsFinished = 0; mNumRelroCreationsStarted = mNumRelroCreationsStarted = mSystemInterface.onWebViewProviderChanged(newPackage); 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 // If the relro creations finish before we know the number of started creations // we will have to do any cleanup/notifying here. // we will have to do any cleanup/notifying here. checkIfRelrosDoneLocked(); checkIfRelrosDoneLocked(); Loading Loading @@ -479,6 +487,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { * for all users, otherwise use the default provider. * for all users, otherwise use the default provider. */ */ private PackageInfo findPreferredWebViewPackage() throws WebViewPackageMissingException { 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 // If the user has chosen provider, use that (if it's installed and enabled for all // users). // users). String userChosenPackageName = mSystemInterface.getUserChosenWebViewProvider(mContext); String userChosenPackageName = mSystemInterface.getUserChosenWebViewProvider(mContext); Loading Loading @@ -508,12 +517,15 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { PackageInfo packageInfo = mSystemInterface.getPackageInfoForProvider(mDefaultProvider); PackageInfo packageInfo = mSystemInterface.getPackageInfoForProvider(mDefaultProvider); if (validityResult(mDefaultProvider, packageInfo) == VALIDITY_OK) { if (validityResult(mDefaultProvider, packageInfo) == VALIDITY_OK) { return packageInfo; return packageInfo; } else { Counter.logIncrement("webview.value_default_webview_package_invalid_counter"); } } } catch (NameNotFoundException e) { } catch (NameNotFoundException e) { Slog.w(TAG, "Default WebView package (" + mDefaultProvider.packageName + ") not found"); Slog.w(TAG, "Default WebView package (" + mDefaultProvider.packageName + ") not found"); } } // This should never happen during normal operation (only with modified system images). // 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; mAnyWebViewInstalled = false; throw new WebViewPackageMissingException("Could not find a loadable WebView package"); throw new WebViewPackageMissingException("Could not find a loadable WebView package"); } } Loading