diff options
3 files changed, 89 insertions, 4 deletions
diff --git a/core/java/android/webkit/WebViewFactoryProvider.java b/core/java/android/webkit/WebViewFactoryProvider.java index e1e2e8cd35d7..4a2f9ba696a5 100644 --- a/core/java/android/webkit/WebViewFactoryProvider.java +++ b/core/java/android/webkit/WebViewFactoryProvider.java @@ -36,16 +36,31 @@ import java.util.List; */ @SystemApi public interface WebViewFactoryProvider { - /** @hide */ + /** + * Used as the requirement when Flags.useBEntryPoint() is false. + * @hide + */ int MINIMUM_SUPPORTED_TARGET_SDK = Build.VERSION_CODES.TIRAMISU; /** + * Used as the requirement when Flags.useBEntryPoint() is true. + * TODO: set to the actual minimum required version code - this is just the + * version shipped in V. + * @hide + */ + long MINIMUM_SUPPORTED_VERSION_CODE = 661308800L; + + /** * Returns whether the WebView implementation represented by {@code packageInfo} * is compatible with this version of Android. * @hide */ static boolean isCompatibleImplementationPackage(@NonNull PackageInfo packageInfo) { - return packageInfo.applicationInfo.targetSdkVersion >= MINIMUM_SUPPORTED_TARGET_SDK; + if (Flags.useBEntryPoint()) { + return packageInfo.versionCode >= MINIMUM_SUPPORTED_VERSION_CODE; + } else { + return packageInfo.applicationInfo.targetSdkVersion >= MINIMUM_SUPPORTED_TARGET_SDK; + } } /** @@ -54,7 +69,13 @@ public interface WebViewFactoryProvider { * @hide */ static @NonNull String describeCompatibleImplementationPackage() { - return TextUtils.formatSimple("Minimum targetSdkVersion: %d", MINIMUM_SUPPORTED_TARGET_SDK); + if (Flags.useBEntryPoint()) { + return TextUtils.formatSimple("Minimum versionCode for OS support: %d", + MINIMUM_SUPPORTED_VERSION_CODE); + } else { + return TextUtils.formatSimple("Minimum targetSdkVersion: %d", + MINIMUM_SUPPORTED_TARGET_SDK); + } } /** @@ -63,7 +84,11 @@ public interface WebViewFactoryProvider { * @hide */ static @NonNull String getWebViewFactoryClassName() { - return "com.android.webview.chromium.WebViewChromiumFactoryProviderForT"; + if (Flags.useBEntryPoint()) { + return "com.android.webview.chromium.WebViewChromiumFactoryProviderForB"; + } else { + return "com.android.webview.chromium.WebViewChromiumFactoryProviderForT"; + } } /** diff --git a/core/java/android/webkit/flags.aconfig b/core/java/android/webkit/flags.aconfig index c9e94d2f57f6..c5176a2f1f15 100644 --- a/core/java/android/webkit/flags.aconfig +++ b/core/java/android/webkit/flags.aconfig @@ -42,3 +42,11 @@ flag { description: "New APIs required by File System Access" bug: "40101963" } + +flag { + name: "use_b_entry_point" + namespace: "webview" + description: "Use B-specific entry point to WebView APK" + bug: "373617389" + is_fixed_read_only: true +} diff --git a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java index 0b1b54804b5e..bf99b6af2345 100644 --- a/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java @@ -25,9 +25,12 @@ 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.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.util.Base64; +import android.webkit.Flags; import android.webkit.WebViewFactory; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; @@ -1239,6 +1242,7 @@ public class WebViewUpdateServiceTest { * that packages targeting an older version are not valid. */ @Test + @RequiresFlagsDisabled(Flags.FLAG_USE_B_ENTRY_POINT) public void testTargetSdkVersionValidity() { PackageInfo newSdkPackage = createPackageInfo("newTargetSdkPackage", true /* enabled */, true /* valid */, true /* installed */); @@ -1280,6 +1284,54 @@ public class WebViewUpdateServiceTest { 1 /* first preparation phase */); } + /** + * Ensure that packages with a versionCode new enough for the current platform are valid, and + * that older packages are not valid. + */ + @Test + @RequiresFlagsEnabled(Flags.FLAG_USE_B_ENTRY_POINT) + public void testVersionCodeOSCompatValidity() { + PackageInfo newVersionPackage = createPackageInfo("newVersionPackage", + true /* enabled */, true /* valid */, true /* installed */); + newVersionPackage.setLongVersionCode(200L); + PackageInfo currentVersionPackage = createPackageInfo("currentVersionPackage", + true /* enabled */, true /* valid */, true /* installed */); + currentVersionPackage.setLongVersionCode(100L); + PackageInfo oldVersionPackage = createPackageInfo("oldVersionPackage", + true /* enabled */, true /* valid */, true /* installed */); + oldVersionPackage.setLongVersionCode(50L); + + WebViewProviderInfo newVersionProviderInfo = + new WebViewProviderInfo(newVersionPackage.packageName, "", true, false, null); + WebViewProviderInfo currentVersionProviderInfo = + new WebViewProviderInfo(currentVersionPackage.packageName, "", true, false, null); + WebViewProviderInfo[] packages = + new WebViewProviderInfo[] { + currentVersionProviderInfo, + new WebViewProviderInfo(oldVersionPackage.packageName, "", true, false, null), + newVersionProviderInfo + }; + setupWithPackages(packages); + // Mock the compatibility predicate as requiring 100 as versionCode. + mTestSystemImpl.setCompatibilityPredicate( + pi -> pi.getLongVersionCode() >= 100L); + // Start with the setting pointing to the invalid package + mTestSystemImpl.updateUserSetting(oldVersionPackage.packageName); + + mTestSystemImpl.setPackageInfo(newVersionPackage); + mTestSystemImpl.setPackageInfo(currentVersionPackage); + mTestSystemImpl.setPackageInfo(oldVersionPackage); + + assertArrayEquals( + new WebViewProviderInfo[] { currentVersionProviderInfo, newVersionProviderInfo }, + mWebViewUpdateServiceImpl.getValidWebViewPackages()); + + runWebViewBootPreparationOnMainSync(); + + checkPreparationPhasesForPackage(currentVersionPackage.packageName, + 1 /* first preparation phase */); + } + @Test public void testDefaultWebViewPackageIsTheFirstAvailableByDefault() { String nonDefaultPackage = "nonDefaultPackage"; |