Loading packages/SettingsLib/res/values/strings.xml +0 −5 Original line number Diff line number Diff line Loading @@ -733,11 +733,6 @@ <!-- Services settings screen, setting option summary for the user to go to the screen to view running services --> <string name="runningservices_settings_summary">View and control currently running services</string> <!-- Developer settings: enable WebView multiprocess name [CHAR LIMIT=50] --> <string name="enable_webview_multiprocess">Multiprocess WebView</string> <!-- Developer settings: enable WebView multiprocess summary [CHAR LIMIT=60] --> <string name="enable_webview_multiprocess_desc">Run WebView renderers separately</string> <!-- Developer settings: select WebView provider title [CHAR LIMIT=30] --> <string name="select_webview_provider_title">WebView implementation</string> <!-- Developer settings: select WebView provider dialog title [CHAR LIMIT=30] --> Loading services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +9 −16 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; import java.io.PrintWriter; import java.lang.Integer; import java.util.List; /** Loading Loading @@ -72,6 +73,9 @@ public class WebViewUpdateServiceImpl { private WebViewUpdater mWebViewUpdater; final private Context mContext; private final static int MULTIPROCESS_SETTING_ON_VALUE = Integer.MAX_VALUE; private final static int MULTIPROCESS_SETTING_OFF_VALUE = Integer.MIN_VALUE; public WebViewUpdateServiceImpl(Context context, SystemInterface systemInterface) { mContext = context; mSystemInterface = systemInterface; Loading Loading @@ -234,31 +238,20 @@ public class WebViewUpdateServiceImpl { } boolean isMultiProcessEnabled() { PackageInfo current = getCurrentWebViewPackage(); if (current == null) return false; int currentVersion = current.versionCode; int settingValue = mSystemInterface.getMultiProcessSetting(mContext); if (mSystemInterface.isMultiProcessDefaultEnabled()) { // Multiprocess should be enabled unless the user has turned it off manually for this // version or newer, as we want to re-enable it when it's updated to get fresh // bug reports. return settingValue > -currentVersion; // Multiprocess should be enabled unless the user has turned it off manually. return settingValue > MULTIPROCESS_SETTING_OFF_VALUE; } else { // Multiprocess should not be enabled, unless the user has turned it on manually for // any version. return settingValue > 0; // Multiprocess should not be enabled, unless the user has turned it on manually. return settingValue >= MULTIPROCESS_SETTING_ON_VALUE; } } void enableMultiProcess(boolean enable) { // The value we store for the setting is the version code of the current package, if it's // enabled, or the negation of the version code of the current package, if it's disabled. // Users who have a setting from before this scheme was implemented will have it set to 0 or // 1 instead. PackageInfo current = getCurrentWebViewPackage(); int currentVersion = current != null ? current.versionCode : 1; mSystemInterface.setMultiProcessSetting(mContext, enable ? currentVersion : -currentVersion); enable ? MULTIPROCESS_SETTING_ON_VALUE : MULTIPROCESS_SETTING_OFF_VALUE); mSystemInterface.notifyZygote(enable); if (current != null) { mSystemInterface.killPackageDependents(current.packageName); Loading services/core/java/com/android/server/webkit/WebViewUpdateServiceShellCommand.java +15 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,10 @@ class WebViewUpdateServiceShellCommand extends ShellCommand { return enableFallbackLogic(true); case "set-webview-implementation": return setWebViewImplementation(); case "enable-multiprocess": return enableMultiProcess(true); case "disable-multiprocess": return enableMultiProcess(false); default: return handleDefaultCommands(cmd); } Loading Loading @@ -74,6 +78,13 @@ class WebViewUpdateServiceShellCommand extends ShellCommand { } } private int enableMultiProcess(boolean enable) throws RemoteException { final PrintWriter pw = getOutPrintWriter(); mInterface.enableMultiProcess(enable); pw.println("Success"); return 0; } @Override public void onHelp() { PrintWriter pw = getOutPrintWriter(); Loading @@ -90,6 +101,10 @@ class WebViewUpdateServiceShellCommand extends ShellCommand { pw.println(" package is available."); pw.println(" set-webview-implementation PACKAGE"); pw.println(" Set the WebView implementation to the specified package."); pw.println(" enable-multiprocess"); pw.println(" Enable multi-process mode for WebView"); pw.println(" disable-multiprocess"); pw.println(" Disable multi-process mode for WebView"); pw.println(); } } services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java +52 −48 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import org.mockito.Mockito; import org.mockito.Matchers; import org.mockito.compat.ArgumentMatcher; import java.lang.Integer; import java.util.concurrent.CountDownLatch; Loading Loading @@ -1530,12 +1531,22 @@ public class WebViewUpdateServiceTest { @Test public void testMultiProcessEnabledByDefault() { testMultiProcessByDefault(true /* enabledByDefault */); } @Test public void testMultiProcessDisabledByDefault() { testMultiProcessByDefault(false /* enabledByDefault */); } private void testMultiProcessByDefault(boolean enabledByDefault) { String primaryPackage = "primary"; WebViewProviderInfo[] packages = new WebViewProviderInfo[] { new WebViewProviderInfo( primaryPackage, "", true /* default available */, false /* fallback */, null)}; setupWithPackages(packages, true /* fallback logic enabled */, 1 /* numRelros */, true /* debuggable */, true /* multiprocess by default */); true /* debuggable */, enabledByDefault /* not multiprocess by default */); mTestSystemImpl.setPackageInfo(createPackageInfo(primaryPackage, true /* enabled */, true /* valid */, true /* installed */, null /* signatures */, 10 /* lastUpdateTime*/, false /* not hidden */, 1000 /* versionCode */, Loading @@ -1544,35 +1555,54 @@ public class WebViewUpdateServiceTest { runWebViewBootPreparationOnMainSync(); checkPreparationPhasesForPackage(primaryPackage, 1 /* first preparation phase */); // Check it's on by default assertTrue(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); // Check it's off by default assertEquals(enabledByDefault, mWebViewUpdateServiceImpl.isMultiProcessEnabled()); // Test toggling it mWebViewUpdateServiceImpl.enableMultiProcess(false); assertFalse(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); mWebViewUpdateServiceImpl.enableMultiProcess(true); assertTrue(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); mWebViewUpdateServiceImpl.enableMultiProcess(!enabledByDefault); assertEquals(!enabledByDefault, mWebViewUpdateServiceImpl.isMultiProcessEnabled()); mWebViewUpdateServiceImpl.enableMultiProcess(enabledByDefault); assertEquals(enabledByDefault, mWebViewUpdateServiceImpl.isMultiProcessEnabled()); } // Disable, then upgrade provider, which should re-enable it mWebViewUpdateServiceImpl.enableMultiProcess(false); mTestSystemImpl.setPackageInfo(createPackageInfo(primaryPackage, true /* enabled */, true /* valid */, true /* installed */, null /* signatures */, 20 /* lastUpdateTime*/, false /* not hidden */, 2000 /* versionCode */, false /* isSystemApp */)); mWebViewUpdateServiceImpl.packageStateChanged(primaryPackage, WebViewUpdateService.PACKAGE_ADDED_REPLACED, 0); checkPreparationPhasesForPackage(primaryPackage, 2); assertTrue(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); @Test public void testMultiProcessEnabledByDefaultWithSettingsValue() { testMultiProcessByDefaultWithSettingsValue( true /* enabledByDefault */, Integer.MIN_VALUE, false /* expectEnabled */); testMultiProcessByDefaultWithSettingsValue( true /* enabledByDefault */, -999999, true /* expectEnabled */); testMultiProcessByDefaultWithSettingsValue( true /* enabledByDefault */, 0, true /* expectEnabled */); testMultiProcessByDefaultWithSettingsValue( true /* enabledByDefault */, 999999, true /* expectEnabled */); } @Test public void testMultiProcessDisabledByDefault() { public void testMultiProcessDisabledByDefaultWithSettingsValue() { testMultiProcessByDefaultWithSettingsValue( false /* enabledByDefault */, Integer.MIN_VALUE, false /* expectEnabled */); testMultiProcessByDefaultWithSettingsValue( false /* enabledByDefault */, 0, false /* expectEnabled */); testMultiProcessByDefaultWithSettingsValue( false /* enabledByDefault */, 999999, false /* expectEnabled */); testMultiProcessByDefaultWithSettingsValue( false /* enabledByDefault */, Integer.MAX_VALUE, true /* expectEnabled */); } /** * Test the logic of the multiprocess setting depending on whether multiprocess is enabled by * default, and what the setting is set to. * @param enabledByDefault whether multiprocess is enabled by default. * @param settingValue value of the multiprocess setting. */ private void testMultiProcessByDefaultWithSettingsValue( boolean enabledByDefault, int settingValue, boolean expectEnabled) { String primaryPackage = "primary"; WebViewProviderInfo[] packages = new WebViewProviderInfo[] { new WebViewProviderInfo( primaryPackage, "", true /* default available */, false /* fallback */, null)}; setupWithPackages(packages, true /* fallback logic enabled */, 1 /* numRelros */, true /* debuggable */, false /* not multiprocess by default */); true /* debuggable */, enabledByDefault /* multiprocess by default */); mTestSystemImpl.setPackageInfo(createPackageInfo(primaryPackage, true /* enabled */, true /* valid */, true /* installed */, null /* signatures */, 10 /* lastUpdateTime*/, false /* not hidden */, 1000 /* versionCode */, Loading @@ -1581,38 +1611,12 @@ public class WebViewUpdateServiceTest { runWebViewBootPreparationOnMainSync(); checkPreparationPhasesForPackage(primaryPackage, 1 /* first preparation phase */); // Check it's off by default assertFalse(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); // Test toggling it mWebViewUpdateServiceImpl.enableMultiProcess(true); assertTrue(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); mWebViewUpdateServiceImpl.enableMultiProcess(false); assertFalse(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); // Disable, then upgrade provider, which should not re-enable it mWebViewUpdateServiceImpl.enableMultiProcess(false); mTestSystemImpl.setPackageInfo(createPackageInfo(primaryPackage, true /* enabled */, true /* valid */, true /* installed */, null /* signatures */, 20 /* lastUpdateTime*/, false /* not hidden */, 2000 /* versionCode */, false /* isSystemApp */)); mWebViewUpdateServiceImpl.packageStateChanged(primaryPackage, WebViewUpdateService.PACKAGE_ADDED_REPLACED, 0); checkPreparationPhasesForPackage(primaryPackage, 2); assertFalse(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); mTestSystemImpl.setMultiProcessSetting(null /* context */, settingValue); // Enable, then upgrade provider, which should leave it on mWebViewUpdateServiceImpl.enableMultiProcess(true); mTestSystemImpl.setPackageInfo(createPackageInfo(primaryPackage, true /* enabled */, true /* valid */, true /* installed */, null /* signatures */, 30 /* lastUpdateTime*/, false /* not hidden */, 3000 /* versionCode */, false /* isSystemApp */)); mWebViewUpdateServiceImpl.packageStateChanged(primaryPackage, WebViewUpdateService.PACKAGE_ADDED_REPLACED, 0); checkPreparationPhasesForPackage(primaryPackage, 3); assertTrue(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); assertEquals(expectEnabled, mWebViewUpdateServiceImpl.isMultiProcessEnabled()); } /** * Ensure that packages with a targetSdkVersion targeting the current platform are valid, and * that packages targeting an older version are not valid. Loading Loading
packages/SettingsLib/res/values/strings.xml +0 −5 Original line number Diff line number Diff line Loading @@ -733,11 +733,6 @@ <!-- Services settings screen, setting option summary for the user to go to the screen to view running services --> <string name="runningservices_settings_summary">View and control currently running services</string> <!-- Developer settings: enable WebView multiprocess name [CHAR LIMIT=50] --> <string name="enable_webview_multiprocess">Multiprocess WebView</string> <!-- Developer settings: enable WebView multiprocess summary [CHAR LIMIT=60] --> <string name="enable_webview_multiprocess_desc">Run WebView renderers separately</string> <!-- Developer settings: select WebView provider title [CHAR LIMIT=30] --> <string name="select_webview_provider_title">WebView implementation</string> <!-- Developer settings: select WebView provider dialog title [CHAR LIMIT=30] --> Loading
services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +9 −16 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; import java.io.PrintWriter; import java.lang.Integer; import java.util.List; /** Loading Loading @@ -72,6 +73,9 @@ public class WebViewUpdateServiceImpl { private WebViewUpdater mWebViewUpdater; final private Context mContext; private final static int MULTIPROCESS_SETTING_ON_VALUE = Integer.MAX_VALUE; private final static int MULTIPROCESS_SETTING_OFF_VALUE = Integer.MIN_VALUE; public WebViewUpdateServiceImpl(Context context, SystemInterface systemInterface) { mContext = context; mSystemInterface = systemInterface; Loading Loading @@ -234,31 +238,20 @@ public class WebViewUpdateServiceImpl { } boolean isMultiProcessEnabled() { PackageInfo current = getCurrentWebViewPackage(); if (current == null) return false; int currentVersion = current.versionCode; int settingValue = mSystemInterface.getMultiProcessSetting(mContext); if (mSystemInterface.isMultiProcessDefaultEnabled()) { // Multiprocess should be enabled unless the user has turned it off manually for this // version or newer, as we want to re-enable it when it's updated to get fresh // bug reports. return settingValue > -currentVersion; // Multiprocess should be enabled unless the user has turned it off manually. return settingValue > MULTIPROCESS_SETTING_OFF_VALUE; } else { // Multiprocess should not be enabled, unless the user has turned it on manually for // any version. return settingValue > 0; // Multiprocess should not be enabled, unless the user has turned it on manually. return settingValue >= MULTIPROCESS_SETTING_ON_VALUE; } } void enableMultiProcess(boolean enable) { // The value we store for the setting is the version code of the current package, if it's // enabled, or the negation of the version code of the current package, if it's disabled. // Users who have a setting from before this scheme was implemented will have it set to 0 or // 1 instead. PackageInfo current = getCurrentWebViewPackage(); int currentVersion = current != null ? current.versionCode : 1; mSystemInterface.setMultiProcessSetting(mContext, enable ? currentVersion : -currentVersion); enable ? MULTIPROCESS_SETTING_ON_VALUE : MULTIPROCESS_SETTING_OFF_VALUE); mSystemInterface.notifyZygote(enable); if (current != null) { mSystemInterface.killPackageDependents(current.packageName); Loading
services/core/java/com/android/server/webkit/WebViewUpdateServiceShellCommand.java +15 −0 Original line number Diff line number Diff line Loading @@ -43,6 +43,10 @@ class WebViewUpdateServiceShellCommand extends ShellCommand { return enableFallbackLogic(true); case "set-webview-implementation": return setWebViewImplementation(); case "enable-multiprocess": return enableMultiProcess(true); case "disable-multiprocess": return enableMultiProcess(false); default: return handleDefaultCommands(cmd); } Loading Loading @@ -74,6 +78,13 @@ class WebViewUpdateServiceShellCommand extends ShellCommand { } } private int enableMultiProcess(boolean enable) throws RemoteException { final PrintWriter pw = getOutPrintWriter(); mInterface.enableMultiProcess(enable); pw.println("Success"); return 0; } @Override public void onHelp() { PrintWriter pw = getOutPrintWriter(); Loading @@ -90,6 +101,10 @@ class WebViewUpdateServiceShellCommand extends ShellCommand { pw.println(" package is available."); pw.println(" set-webview-implementation PACKAGE"); pw.println(" Set the WebView implementation to the specified package."); pw.println(" enable-multiprocess"); pw.println(" Enable multi-process mode for WebView"); pw.println(" disable-multiprocess"); pw.println(" Disable multi-process mode for WebView"); pw.println(); } }
services/tests/servicestests/src/com/android/server/webkit/WebViewUpdateServiceTest.java +52 −48 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import org.mockito.Mockito; import org.mockito.Matchers; import org.mockito.compat.ArgumentMatcher; import java.lang.Integer; import java.util.concurrent.CountDownLatch; Loading Loading @@ -1530,12 +1531,22 @@ public class WebViewUpdateServiceTest { @Test public void testMultiProcessEnabledByDefault() { testMultiProcessByDefault(true /* enabledByDefault */); } @Test public void testMultiProcessDisabledByDefault() { testMultiProcessByDefault(false /* enabledByDefault */); } private void testMultiProcessByDefault(boolean enabledByDefault) { String primaryPackage = "primary"; WebViewProviderInfo[] packages = new WebViewProviderInfo[] { new WebViewProviderInfo( primaryPackage, "", true /* default available */, false /* fallback */, null)}; setupWithPackages(packages, true /* fallback logic enabled */, 1 /* numRelros */, true /* debuggable */, true /* multiprocess by default */); true /* debuggable */, enabledByDefault /* not multiprocess by default */); mTestSystemImpl.setPackageInfo(createPackageInfo(primaryPackage, true /* enabled */, true /* valid */, true /* installed */, null /* signatures */, 10 /* lastUpdateTime*/, false /* not hidden */, 1000 /* versionCode */, Loading @@ -1544,35 +1555,54 @@ public class WebViewUpdateServiceTest { runWebViewBootPreparationOnMainSync(); checkPreparationPhasesForPackage(primaryPackage, 1 /* first preparation phase */); // Check it's on by default assertTrue(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); // Check it's off by default assertEquals(enabledByDefault, mWebViewUpdateServiceImpl.isMultiProcessEnabled()); // Test toggling it mWebViewUpdateServiceImpl.enableMultiProcess(false); assertFalse(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); mWebViewUpdateServiceImpl.enableMultiProcess(true); assertTrue(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); mWebViewUpdateServiceImpl.enableMultiProcess(!enabledByDefault); assertEquals(!enabledByDefault, mWebViewUpdateServiceImpl.isMultiProcessEnabled()); mWebViewUpdateServiceImpl.enableMultiProcess(enabledByDefault); assertEquals(enabledByDefault, mWebViewUpdateServiceImpl.isMultiProcessEnabled()); } // Disable, then upgrade provider, which should re-enable it mWebViewUpdateServiceImpl.enableMultiProcess(false); mTestSystemImpl.setPackageInfo(createPackageInfo(primaryPackage, true /* enabled */, true /* valid */, true /* installed */, null /* signatures */, 20 /* lastUpdateTime*/, false /* not hidden */, 2000 /* versionCode */, false /* isSystemApp */)); mWebViewUpdateServiceImpl.packageStateChanged(primaryPackage, WebViewUpdateService.PACKAGE_ADDED_REPLACED, 0); checkPreparationPhasesForPackage(primaryPackage, 2); assertTrue(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); @Test public void testMultiProcessEnabledByDefaultWithSettingsValue() { testMultiProcessByDefaultWithSettingsValue( true /* enabledByDefault */, Integer.MIN_VALUE, false /* expectEnabled */); testMultiProcessByDefaultWithSettingsValue( true /* enabledByDefault */, -999999, true /* expectEnabled */); testMultiProcessByDefaultWithSettingsValue( true /* enabledByDefault */, 0, true /* expectEnabled */); testMultiProcessByDefaultWithSettingsValue( true /* enabledByDefault */, 999999, true /* expectEnabled */); } @Test public void testMultiProcessDisabledByDefault() { public void testMultiProcessDisabledByDefaultWithSettingsValue() { testMultiProcessByDefaultWithSettingsValue( false /* enabledByDefault */, Integer.MIN_VALUE, false /* expectEnabled */); testMultiProcessByDefaultWithSettingsValue( false /* enabledByDefault */, 0, false /* expectEnabled */); testMultiProcessByDefaultWithSettingsValue( false /* enabledByDefault */, 999999, false /* expectEnabled */); testMultiProcessByDefaultWithSettingsValue( false /* enabledByDefault */, Integer.MAX_VALUE, true /* expectEnabled */); } /** * Test the logic of the multiprocess setting depending on whether multiprocess is enabled by * default, and what the setting is set to. * @param enabledByDefault whether multiprocess is enabled by default. * @param settingValue value of the multiprocess setting. */ private void testMultiProcessByDefaultWithSettingsValue( boolean enabledByDefault, int settingValue, boolean expectEnabled) { String primaryPackage = "primary"; WebViewProviderInfo[] packages = new WebViewProviderInfo[] { new WebViewProviderInfo( primaryPackage, "", true /* default available */, false /* fallback */, null)}; setupWithPackages(packages, true /* fallback logic enabled */, 1 /* numRelros */, true /* debuggable */, false /* not multiprocess by default */); true /* debuggable */, enabledByDefault /* multiprocess by default */); mTestSystemImpl.setPackageInfo(createPackageInfo(primaryPackage, true /* enabled */, true /* valid */, true /* installed */, null /* signatures */, 10 /* lastUpdateTime*/, false /* not hidden */, 1000 /* versionCode */, Loading @@ -1581,38 +1611,12 @@ public class WebViewUpdateServiceTest { runWebViewBootPreparationOnMainSync(); checkPreparationPhasesForPackage(primaryPackage, 1 /* first preparation phase */); // Check it's off by default assertFalse(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); // Test toggling it mWebViewUpdateServiceImpl.enableMultiProcess(true); assertTrue(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); mWebViewUpdateServiceImpl.enableMultiProcess(false); assertFalse(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); // Disable, then upgrade provider, which should not re-enable it mWebViewUpdateServiceImpl.enableMultiProcess(false); mTestSystemImpl.setPackageInfo(createPackageInfo(primaryPackage, true /* enabled */, true /* valid */, true /* installed */, null /* signatures */, 20 /* lastUpdateTime*/, false /* not hidden */, 2000 /* versionCode */, false /* isSystemApp */)); mWebViewUpdateServiceImpl.packageStateChanged(primaryPackage, WebViewUpdateService.PACKAGE_ADDED_REPLACED, 0); checkPreparationPhasesForPackage(primaryPackage, 2); assertFalse(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); mTestSystemImpl.setMultiProcessSetting(null /* context */, settingValue); // Enable, then upgrade provider, which should leave it on mWebViewUpdateServiceImpl.enableMultiProcess(true); mTestSystemImpl.setPackageInfo(createPackageInfo(primaryPackage, true /* enabled */, true /* valid */, true /* installed */, null /* signatures */, 30 /* lastUpdateTime*/, false /* not hidden */, 3000 /* versionCode */, false /* isSystemApp */)); mWebViewUpdateServiceImpl.packageStateChanged(primaryPackage, WebViewUpdateService.PACKAGE_ADDED_REPLACED, 0); checkPreparationPhasesForPackage(primaryPackage, 3); assertTrue(mWebViewUpdateServiceImpl.isMultiProcessEnabled()); assertEquals(expectEnabled, mWebViewUpdateServiceImpl.isMultiProcessEnabled()); } /** * Ensure that packages with a targetSdkVersion targeting the current platform are valid, and * that packages targeting an older version are not valid. Loading