Loading services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java +54 −46 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.content.pm.Signature; import android.os.AsyncTask; import android.os.Trace; import android.os.UserHandle; import android.text.TextUtils; import android.util.Slog; import android.webkit.UserPackage; import android.webkit.WebViewFactory; Loading Loading @@ -70,10 +71,6 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { WebViewPackageMissingException(String message) { super(message); } WebViewPackageMissingException(Exception e) { super(e); } } private static final int WAIT_TIMEOUT_MS = 1000; // KEY_DISPATCHING_TIMEOUT is 5000. Loading Loading @@ -365,9 +362,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { AsyncTask.THREAD_POOL_EXECUTOR.execute(this::startZygoteWhenReady); } /** * Fetch only the currently valid WebView packages. **/ /** Fetch only the currently valid WebView packages. */ @Override public WebViewProviderInfo[] getValidWebViewPackages() { ProviderAndPackageInfo[] providersAndPackageInfos = getValidWebViewPackagesAndInfos(); Loading Loading @@ -636,9 +631,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { "enableMultiProcess shouldn't be called if update_service_v2 flag is set."); } /** * Dump the state of this Service. */ /** Dump the state of this Service. */ @Override public void dumpState(PrintWriter pw) { pw.println("Current WebView Update Service state"); Loading @@ -646,30 +639,38 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { if (mCurrentWebViewPackage == null) { pw.println(" Current WebView package is null"); } else { pw.println(String.format(" Current WebView package (name, version): (%s, %s)", pw.println( TextUtils.formatSimple( " Current WebView package (name, version): (%s, %s)", mCurrentWebViewPackage.packageName, mCurrentWebViewPackage.versionName)); } pw.println(String.format(" Minimum targetSdkVersion: %d", UserPackage.MINIMUM_SUPPORTED_SDK)); pw.println(String.format(" Minimum WebView version code: %d", mMinimumVersionCode)); pw.println(String.format(" Number of relros started: %d", mNumRelroCreationsStarted)); pw.println(String.format(" Number of relros finished: %d", mNumRelroCreationsFinished)); pw.println(String.format(" WebView package dirty: %b", mWebViewPackageDirty)); pw.println(String.format(" Any WebView package installed: %b", mAnyWebViewInstalled)); pw.println( TextUtils.formatSimple( " Minimum targetSdkVersion: %d", UserPackage.MINIMUM_SUPPORTED_SDK)); pw.println( TextUtils.formatSimple( " Minimum WebView version code: %d", mMinimumVersionCode)); pw.println( TextUtils.formatSimple( " Number of relros started: %d", mNumRelroCreationsStarted)); pw.println( TextUtils.formatSimple( " Number of relros finished: %d", mNumRelroCreationsFinished)); pw.println(TextUtils.formatSimple(" WebView package dirty: %b", mWebViewPackageDirty)); pw.println( TextUtils.formatSimple( " Any WebView package installed: %b", mAnyWebViewInstalled)); try { PackageInfo preferredWebViewPackage = findPreferredWebViewPackage(); pw.println(String.format( pw.println( TextUtils.formatSimple( " Preferred WebView package (name, version): (%s, %s)", preferredWebViewPackage.packageName, preferredWebViewPackage.versionName)); } catch (WebViewPackageMissingException e) { pw.println(String.format(" Preferred WebView package: none")); pw.println(" Preferred WebView package: none"); } dumpAllPackageInformationLocked(pw); Loading @@ -685,26 +686,33 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { PackageInfo systemUserPackageInfo = userPackages.get(UserHandle.USER_SYSTEM).getPackageInfo(); if (systemUserPackageInfo == null) { pw.println(String.format(" %s is NOT installed.", provider.packageName)); pw.println( TextUtils.formatSimple(" %s is NOT installed.", provider.packageName)); continue; } int validity = validityResult(provider, systemUserPackageInfo); String packageDetails = String.format( String packageDetails = TextUtils.formatSimple( "versionName: %s, versionCode: %d, targetSdkVersion: %d", systemUserPackageInfo.versionName, systemUserPackageInfo.getLongVersionCode(), systemUserPackageInfo.applicationInfo.targetSdkVersion); if (validity == VALIDITY_OK) { boolean installedForAllUsers = isInstalledAndEnabledForAllUsers( mSystemInterface.getPackageInfoForProviderAllUsers(mContext, provider)); pw.println(String.format( boolean installedForAllUsers = isInstalledAndEnabledForAllUsers( mSystemInterface.getPackageInfoForProviderAllUsers( mContext, provider)); pw.println( TextUtils.formatSimple( " Valid package %s (%s) is %s installed/enabled for all users", systemUserPackageInfo.packageName, packageDetails, installedForAllUsers ? "" : "NOT")); } else { pw.println(String.format(" Invalid package %s (%s), reason: %s", pw.println( TextUtils.formatSimple( " Invalid package %s (%s), reason: %s", systemUserPackageInfo.packageName, packageDetails, getInvalidityReason(validity))); Loading services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java +21 −3 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.webkit; import static android.webkit.Flags.updateServiceV2; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; Loading @@ -25,6 +27,9 @@ import android.content.pm.PackageInfo; import android.content.pm.Signature; import android.os.Build; import android.os.Bundle; import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.test.suitebuilder.annotation.MediumTest; import android.util.Base64; import android.webkit.UserPackage; Loading @@ -35,6 +40,7 @@ import android.webkit.WebViewProviderResponse; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatcher; Loading @@ -55,11 +61,14 @@ import java.util.concurrent.CountDownLatch; public class WebViewUpdateServiceTest { private final static String TAG = WebViewUpdateServiceTest.class.getSimpleName(); private WebViewUpdateServiceImpl mWebViewUpdateServiceImpl; private WebViewUpdateServiceInterface mWebViewUpdateServiceImpl; private TestSystemImpl mTestSystemImpl; private static final String WEBVIEW_LIBRARY_FLAG = "com.android.webview.WebViewLibrary"; @Rule public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); /** * Creates a new instance. */ Loading Loading @@ -92,9 +101,14 @@ public class WebViewUpdateServiceTest { TestSystemImpl testing = new TestSystemImpl(packages, numRelros, isDebuggable, multiProcessDefault); mTestSystemImpl = Mockito.spy(testing); if (updateServiceV2()) { mWebViewUpdateServiceImpl = new WebViewUpdateServiceImpl2(null /*Context*/, mTestSystemImpl); } else { mWebViewUpdateServiceImpl = new WebViewUpdateServiceImpl(null /*Context*/, mTestSystemImpl); } } private void setEnabledAndValidPackageInfos(WebViewProviderInfo[] providers) { // Set package infos for the primary user (user 0). Loading Loading @@ -1310,11 +1324,13 @@ public class WebViewUpdateServiceTest { } @Test @RequiresFlagsDisabled("android.webkit.update_service_v2") public void testMultiProcessEnabledByDefault() { testMultiProcessByDefault(true /* enabledByDefault */); } @Test @RequiresFlagsDisabled("android.webkit.update_service_v2") public void testMultiProcessDisabledByDefault() { testMultiProcessByDefault(false /* enabledByDefault */); } Loading Loading @@ -1344,6 +1360,7 @@ public class WebViewUpdateServiceTest { } @Test @RequiresFlagsDisabled("android.webkit.update_service_v2") public void testMultiProcessEnabledByDefaultWithSettingsValue() { testMultiProcessByDefaultWithSettingsValue( true /* enabledByDefault */, Integer.MIN_VALUE, false /* expectEnabled */); Loading @@ -1356,6 +1373,7 @@ public class WebViewUpdateServiceTest { } @Test @RequiresFlagsDisabled("android.webkit.update_service_v2") public void testMultiProcessDisabledByDefaultWithSettingsValue() { testMultiProcessByDefaultWithSettingsValue( false /* enabledByDefault */, Integer.MIN_VALUE, false /* expectEnabled */); Loading Loading
services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java +54 −46 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.content.pm.Signature; import android.os.AsyncTask; import android.os.Trace; import android.os.UserHandle; import android.text.TextUtils; import android.util.Slog; import android.webkit.UserPackage; import android.webkit.WebViewFactory; Loading Loading @@ -70,10 +71,6 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { WebViewPackageMissingException(String message) { super(message); } WebViewPackageMissingException(Exception e) { super(e); } } private static final int WAIT_TIMEOUT_MS = 1000; // KEY_DISPATCHING_TIMEOUT is 5000. Loading Loading @@ -365,9 +362,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { AsyncTask.THREAD_POOL_EXECUTOR.execute(this::startZygoteWhenReady); } /** * Fetch only the currently valid WebView packages. **/ /** Fetch only the currently valid WebView packages. */ @Override public WebViewProviderInfo[] getValidWebViewPackages() { ProviderAndPackageInfo[] providersAndPackageInfos = getValidWebViewPackagesAndInfos(); Loading Loading @@ -636,9 +631,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { "enableMultiProcess shouldn't be called if update_service_v2 flag is set."); } /** * Dump the state of this Service. */ /** Dump the state of this Service. */ @Override public void dumpState(PrintWriter pw) { pw.println("Current WebView Update Service state"); Loading @@ -646,30 +639,38 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { if (mCurrentWebViewPackage == null) { pw.println(" Current WebView package is null"); } else { pw.println(String.format(" Current WebView package (name, version): (%s, %s)", pw.println( TextUtils.formatSimple( " Current WebView package (name, version): (%s, %s)", mCurrentWebViewPackage.packageName, mCurrentWebViewPackage.versionName)); } pw.println(String.format(" Minimum targetSdkVersion: %d", UserPackage.MINIMUM_SUPPORTED_SDK)); pw.println(String.format(" Minimum WebView version code: %d", mMinimumVersionCode)); pw.println(String.format(" Number of relros started: %d", mNumRelroCreationsStarted)); pw.println(String.format(" Number of relros finished: %d", mNumRelroCreationsFinished)); pw.println(String.format(" WebView package dirty: %b", mWebViewPackageDirty)); pw.println(String.format(" Any WebView package installed: %b", mAnyWebViewInstalled)); pw.println( TextUtils.formatSimple( " Minimum targetSdkVersion: %d", UserPackage.MINIMUM_SUPPORTED_SDK)); pw.println( TextUtils.formatSimple( " Minimum WebView version code: %d", mMinimumVersionCode)); pw.println( TextUtils.formatSimple( " Number of relros started: %d", mNumRelroCreationsStarted)); pw.println( TextUtils.formatSimple( " Number of relros finished: %d", mNumRelroCreationsFinished)); pw.println(TextUtils.formatSimple(" WebView package dirty: %b", mWebViewPackageDirty)); pw.println( TextUtils.formatSimple( " Any WebView package installed: %b", mAnyWebViewInstalled)); try { PackageInfo preferredWebViewPackage = findPreferredWebViewPackage(); pw.println(String.format( pw.println( TextUtils.formatSimple( " Preferred WebView package (name, version): (%s, %s)", preferredWebViewPackage.packageName, preferredWebViewPackage.versionName)); } catch (WebViewPackageMissingException e) { pw.println(String.format(" Preferred WebView package: none")); pw.println(" Preferred WebView package: none"); } dumpAllPackageInformationLocked(pw); Loading @@ -685,26 +686,33 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface { PackageInfo systemUserPackageInfo = userPackages.get(UserHandle.USER_SYSTEM).getPackageInfo(); if (systemUserPackageInfo == null) { pw.println(String.format(" %s is NOT installed.", provider.packageName)); pw.println( TextUtils.formatSimple(" %s is NOT installed.", provider.packageName)); continue; } int validity = validityResult(provider, systemUserPackageInfo); String packageDetails = String.format( String packageDetails = TextUtils.formatSimple( "versionName: %s, versionCode: %d, targetSdkVersion: %d", systemUserPackageInfo.versionName, systemUserPackageInfo.getLongVersionCode(), systemUserPackageInfo.applicationInfo.targetSdkVersion); if (validity == VALIDITY_OK) { boolean installedForAllUsers = isInstalledAndEnabledForAllUsers( mSystemInterface.getPackageInfoForProviderAllUsers(mContext, provider)); pw.println(String.format( boolean installedForAllUsers = isInstalledAndEnabledForAllUsers( mSystemInterface.getPackageInfoForProviderAllUsers( mContext, provider)); pw.println( TextUtils.formatSimple( " Valid package %s (%s) is %s installed/enabled for all users", systemUserPackageInfo.packageName, packageDetails, installedForAllUsers ? "" : "NOT")); } else { pw.println(String.format(" Invalid package %s (%s), reason: %s", pw.println( TextUtils.formatSimple( " Invalid package %s (%s), reason: %s", systemUserPackageInfo.packageName, packageDetails, getInvalidityReason(validity))); Loading
services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java +21 −3 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.webkit; import static android.webkit.Flags.updateServiceV2; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; Loading @@ -25,6 +27,9 @@ import android.content.pm.PackageInfo; import android.content.pm.Signature; import android.os.Build; import android.os.Bundle; import android.platform.test.annotations.RequiresFlagsDisabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.test.suitebuilder.annotation.MediumTest; import android.util.Base64; import android.webkit.UserPackage; Loading @@ -35,6 +40,7 @@ import android.webkit.WebViewProviderResponse; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatcher; Loading @@ -55,11 +61,14 @@ import java.util.concurrent.CountDownLatch; public class WebViewUpdateServiceTest { private final static String TAG = WebViewUpdateServiceTest.class.getSimpleName(); private WebViewUpdateServiceImpl mWebViewUpdateServiceImpl; private WebViewUpdateServiceInterface mWebViewUpdateServiceImpl; private TestSystemImpl mTestSystemImpl; private static final String WEBVIEW_LIBRARY_FLAG = "com.android.webview.WebViewLibrary"; @Rule public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); /** * Creates a new instance. */ Loading Loading @@ -92,9 +101,14 @@ public class WebViewUpdateServiceTest { TestSystemImpl testing = new TestSystemImpl(packages, numRelros, isDebuggable, multiProcessDefault); mTestSystemImpl = Mockito.spy(testing); if (updateServiceV2()) { mWebViewUpdateServiceImpl = new WebViewUpdateServiceImpl2(null /*Context*/, mTestSystemImpl); } else { mWebViewUpdateServiceImpl = new WebViewUpdateServiceImpl(null /*Context*/, mTestSystemImpl); } } private void setEnabledAndValidPackageInfos(WebViewProviderInfo[] providers) { // Set package infos for the primary user (user 0). Loading Loading @@ -1310,11 +1324,13 @@ public class WebViewUpdateServiceTest { } @Test @RequiresFlagsDisabled("android.webkit.update_service_v2") public void testMultiProcessEnabledByDefault() { testMultiProcessByDefault(true /* enabledByDefault */); } @Test @RequiresFlagsDisabled("android.webkit.update_service_v2") public void testMultiProcessDisabledByDefault() { testMultiProcessByDefault(false /* enabledByDefault */); } Loading Loading @@ -1344,6 +1360,7 @@ public class WebViewUpdateServiceTest { } @Test @RequiresFlagsDisabled("android.webkit.update_service_v2") public void testMultiProcessEnabledByDefaultWithSettingsValue() { testMultiProcessByDefaultWithSettingsValue( true /* enabledByDefault */, Integer.MIN_VALUE, false /* expectEnabled */); Loading @@ -1356,6 +1373,7 @@ public class WebViewUpdateServiceTest { } @Test @RequiresFlagsDisabled("android.webkit.update_service_v2") public void testMultiProcessDisabledByDefaultWithSettingsValue() { testMultiProcessByDefaultWithSettingsValue( false /* enabledByDefault */, Integer.MIN_VALUE, false /* expectEnabled */); Loading