Loading core/java/android/webkit/IWebViewUpdateService.aidl +10 −0 Original line number Diff line number Diff line Loading @@ -78,4 +78,14 @@ interface IWebViewUpdateService { * Enable or disable the WebView package fallback mechanism. */ void enableFallbackLogic(boolean enable); /** * Used by Settings to determine whether multiprocess is enabled. */ boolean isMultiProcessEnabled(); /** * Used by Settings to enable/disable multiprocess. */ void enableMultiProcess(boolean enable); } services/core/java/com/android/server/webkit/SystemImpl.java +11 −12 Original line number Diff line number Diff line Loading @@ -271,21 +271,20 @@ public class SystemImpl implements SystemInterface { } @Override public void setMultiProcessEnabledFromContext(Context context) { boolean enableMultiProcess = false; try { enableMultiProcess = Settings.Global.getInt(context.getContentResolver(), Settings.Global.WEBVIEW_MULTIPROCESS) == 1; } catch (Settings.SettingNotFoundException ex) { public int getMultiProcessSetting(Context context) { return Settings.Global.getInt(context.getContentResolver(), Settings.Global.WEBVIEW_MULTIPROCESS, 0); } WebViewZygote.setMultiprocessEnabled(enableMultiProcess); @Override public void setMultiProcessSetting(Context context, int value) { Settings.Global.putInt(context.getContentResolver(), Settings.Global.WEBVIEW_MULTIPROCESS, value); } @Override public void registerContentObserver(Context context, ContentObserver contentObserver) { context.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.WEBVIEW_MULTIPROCESS), false, contentObserver); public void notifyZygote(boolean enableMultiProcess) { WebViewZygote.setMultiprocessEnabled(enableMultiProcess); } // flags declaring we want extra info from the package manager for webview providers Loading services/core/java/com/android/server/webkit/SystemInterface.java +3 −2 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ public interface SystemInterface { public PackageInfo getPackageInfoForProvider(WebViewProviderInfo configInfo) throws NameNotFoundException; public void setMultiProcessEnabledFromContext(Context context); public void registerContentObserver(Context context, ContentObserver contentObserver); public int getMultiProcessSetting(Context context); public void setMultiProcessSetting(Context context, int value); public void notifyZygote(boolean enableMultiProcess); } services/core/java/com/android/server/webkit/WebViewUpdateService.java +26 −0 Original line number Diff line number Diff line Loading @@ -261,6 +261,32 @@ public class WebViewUpdateService extends SystemService { } } @Override // Binder call public boolean isMultiProcessEnabled() { return WebViewUpdateService.this.mImpl.isMultiProcessEnabled(); } @Override // Binder call public void enableMultiProcess(boolean enable) { if (getContext().checkCallingPermission( android.Manifest.permission.WRITE_SECURE_SETTINGS) != PackageManager.PERMISSION_GRANTED) { String msg = "Permission Denial: enableMultiProcess() from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() + " requires " + android.Manifest.permission.WRITE_SECURE_SETTINGS; Slog.w(TAG, msg); throw new SecurityException(msg); } long callingId = Binder.clearCallingIdentity(); try { WebViewUpdateService.this.mImpl.enableMultiProcess(enable); } finally { Binder.restoreCallingIdentity(callingId); } } @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (getContext().checkCallingOrSelfPermission(android.Manifest.permission.DUMP) Loading services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +14 −32 Original line number Diff line number Diff line Loading @@ -20,8 +20,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.Signature; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.os.UserHandle; import android.util.Base64; Loading Loading @@ -77,7 +75,6 @@ public class WebViewUpdateServiceImpl { private SystemInterface mSystemInterface; private WebViewUpdater mWebViewUpdater; private SettingsObserver mSettingsObserver; final private Context mContext; public WebViewUpdateServiceImpl(Context context, SystemInterface systemInterface) { Loading @@ -97,10 +94,7 @@ public class WebViewUpdateServiceImpl { void prepareWebViewInSystemServer() { updateFallbackStateOnBoot(); mWebViewUpdater.prepareWebViewInSystemServer(); // Register for changes in the multiprocess developer option. This has to be done // here, since the update service gets created before the ContentResolver service. mSettingsObserver = new SettingsObserver(); mSystemInterface.notifyZygote(isMultiProcessEnabled()); } private boolean existsValidNonFallbackProvider(WebViewProviderInfo[] providers) { Loading Loading @@ -247,6 +241,19 @@ public class WebViewUpdateServiceImpl { && packageName.equals(fallbackProvider.packageName)); } boolean isMultiProcessEnabled() { return mSystemInterface.getMultiProcessSetting(mContext) != 0; } void enableMultiProcess(boolean enable) { PackageInfo current = getCurrentWebViewPackage(); mSystemInterface.setMultiProcessSetting(mContext, enable ? 1 : 0); mSystemInterface.notifyZygote(enable); if (current != null) { mSystemInterface.killPackageDependents(current.packageName); } } /** * Class that decides what WebView implementation to use and prepares that implementation for * use. Loading Loading @@ -739,31 +746,6 @@ public class WebViewUpdateServiceImpl { & ApplicationInfo.PRIVATE_FLAG_HIDDEN) == 0)); } /** * Watches for changes in the WEBVIEW_MULTIPROCESS setting and lets * the WebViewZygote know, so it can start or stop the zygote process * appropriately. */ private class SettingsObserver extends ContentObserver { SettingsObserver() { super(new Handler()); mSystemInterface.registerContentObserver(mContext, this); // Push the current value of the setting immediately. notifyZygote(); } @Override public void onChange(boolean selfChange, Uri uri) { notifyZygote(); } private void notifyZygote() { mSystemInterface.setMultiProcessEnabledFromContext(mContext); } } /** * Dump the state of this Service. */ Loading Loading
core/java/android/webkit/IWebViewUpdateService.aidl +10 −0 Original line number Diff line number Diff line Loading @@ -78,4 +78,14 @@ interface IWebViewUpdateService { * Enable or disable the WebView package fallback mechanism. */ void enableFallbackLogic(boolean enable); /** * Used by Settings to determine whether multiprocess is enabled. */ boolean isMultiProcessEnabled(); /** * Used by Settings to enable/disable multiprocess. */ void enableMultiProcess(boolean enable); }
services/core/java/com/android/server/webkit/SystemImpl.java +11 −12 Original line number Diff line number Diff line Loading @@ -271,21 +271,20 @@ public class SystemImpl implements SystemInterface { } @Override public void setMultiProcessEnabledFromContext(Context context) { boolean enableMultiProcess = false; try { enableMultiProcess = Settings.Global.getInt(context.getContentResolver(), Settings.Global.WEBVIEW_MULTIPROCESS) == 1; } catch (Settings.SettingNotFoundException ex) { public int getMultiProcessSetting(Context context) { return Settings.Global.getInt(context.getContentResolver(), Settings.Global.WEBVIEW_MULTIPROCESS, 0); } WebViewZygote.setMultiprocessEnabled(enableMultiProcess); @Override public void setMultiProcessSetting(Context context, int value) { Settings.Global.putInt(context.getContentResolver(), Settings.Global.WEBVIEW_MULTIPROCESS, value); } @Override public void registerContentObserver(Context context, ContentObserver contentObserver) { context.getContentResolver().registerContentObserver( Settings.Global.getUriFor(Settings.Global.WEBVIEW_MULTIPROCESS), false, contentObserver); public void notifyZygote(boolean enableMultiProcess) { WebViewZygote.setMultiprocessEnabled(enableMultiProcess); } // flags declaring we want extra info from the package manager for webview providers Loading
services/core/java/com/android/server/webkit/SystemInterface.java +3 −2 Original line number Diff line number Diff line Loading @@ -50,6 +50,7 @@ public interface SystemInterface { public PackageInfo getPackageInfoForProvider(WebViewProviderInfo configInfo) throws NameNotFoundException; public void setMultiProcessEnabledFromContext(Context context); public void registerContentObserver(Context context, ContentObserver contentObserver); public int getMultiProcessSetting(Context context); public void setMultiProcessSetting(Context context, int value); public void notifyZygote(boolean enableMultiProcess); }
services/core/java/com/android/server/webkit/WebViewUpdateService.java +26 −0 Original line number Diff line number Diff line Loading @@ -261,6 +261,32 @@ public class WebViewUpdateService extends SystemService { } } @Override // Binder call public boolean isMultiProcessEnabled() { return WebViewUpdateService.this.mImpl.isMultiProcessEnabled(); } @Override // Binder call public void enableMultiProcess(boolean enable) { if (getContext().checkCallingPermission( android.Manifest.permission.WRITE_SECURE_SETTINGS) != PackageManager.PERMISSION_GRANTED) { String msg = "Permission Denial: enableMultiProcess() from pid=" + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() + " requires " + android.Manifest.permission.WRITE_SECURE_SETTINGS; Slog.w(TAG, msg); throw new SecurityException(msg); } long callingId = Binder.clearCallingIdentity(); try { WebViewUpdateService.this.mImpl.enableMultiProcess(enable); } finally { Binder.restoreCallingIdentity(callingId); } } @Override protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (getContext().checkCallingOrSelfPermission(android.Manifest.permission.DUMP) Loading
services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +14 −32 Original line number Diff line number Diff line Loading @@ -20,8 +20,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.Signature; import android.database.ContentObserver; import android.net.Uri; import android.os.Handler; import android.os.UserHandle; import android.util.Base64; Loading Loading @@ -77,7 +75,6 @@ public class WebViewUpdateServiceImpl { private SystemInterface mSystemInterface; private WebViewUpdater mWebViewUpdater; private SettingsObserver mSettingsObserver; final private Context mContext; public WebViewUpdateServiceImpl(Context context, SystemInterface systemInterface) { Loading @@ -97,10 +94,7 @@ public class WebViewUpdateServiceImpl { void prepareWebViewInSystemServer() { updateFallbackStateOnBoot(); mWebViewUpdater.prepareWebViewInSystemServer(); // Register for changes in the multiprocess developer option. This has to be done // here, since the update service gets created before the ContentResolver service. mSettingsObserver = new SettingsObserver(); mSystemInterface.notifyZygote(isMultiProcessEnabled()); } private boolean existsValidNonFallbackProvider(WebViewProviderInfo[] providers) { Loading Loading @@ -247,6 +241,19 @@ public class WebViewUpdateServiceImpl { && packageName.equals(fallbackProvider.packageName)); } boolean isMultiProcessEnabled() { return mSystemInterface.getMultiProcessSetting(mContext) != 0; } void enableMultiProcess(boolean enable) { PackageInfo current = getCurrentWebViewPackage(); mSystemInterface.setMultiProcessSetting(mContext, enable ? 1 : 0); mSystemInterface.notifyZygote(enable); if (current != null) { mSystemInterface.killPackageDependents(current.packageName); } } /** * Class that decides what WebView implementation to use and prepares that implementation for * use. Loading Loading @@ -739,31 +746,6 @@ public class WebViewUpdateServiceImpl { & ApplicationInfo.PRIVATE_FLAG_HIDDEN) == 0)); } /** * Watches for changes in the WEBVIEW_MULTIPROCESS setting and lets * the WebViewZygote know, so it can start or stop the zygote process * appropriately. */ private class SettingsObserver extends ContentObserver { SettingsObserver() { super(new Handler()); mSystemInterface.registerContentObserver(mContext, this); // Push the current value of the setting immediately. notifyZygote(); } @Override public void onChange(boolean selfChange, Uri uri) { notifyZygote(); } private void notifyZygote() { mSystemInterface.setMultiProcessEnabledFromContext(mContext); } } /** * Dump the state of this Service. */ Loading