Loading AconfigFlags.bp +17 −0 Original line number Original line Diff line number Diff line Loading @@ -64,6 +64,7 @@ aconfig_srcjars = [ ":android.hardware.usb.flags-aconfig-java{.generated_srcjars}", ":android.hardware.usb.flags-aconfig-java{.generated_srcjars}", ":android.tracing.flags-aconfig-java{.generated_srcjars}", ":android.tracing.flags-aconfig-java{.generated_srcjars}", ":android.appwidget.flags-aconfig-java{.generated_srcjars}", ":android.appwidget.flags-aconfig-java{.generated_srcjars}", ":android.webkit.flags-aconfig-java{.generated_srcjars}", ] ] filegroup { filegroup { Loading Loading @@ -762,3 +763,19 @@ java_aconfig_library { aconfig_declarations: "android.appwidget.flags-aconfig", aconfig_declarations: "android.appwidget.flags-aconfig", defaults: ["framework-minus-apex-aconfig-java-defaults"], defaults: ["framework-minus-apex-aconfig-java-defaults"], } } // WebView aconfig_declarations { name: "android.webkit.flags-aconfig", package: "android.webkit", srcs: [ "core/java/android/webkit/*.aconfig", "services/core/java/com/android/server/webkit/*.aconfig", ], } java_aconfig_library { name: "android.webkit.flags-aconfig-java", aconfig_declarations: "android.webkit.flags-aconfig", defaults: ["framework-minus-apex-aconfig-java-defaults"], } services/core/java/com/android/server/webkit/WebViewUpdateService.java +8 −2 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.webkit; package com.android.server.webkit; import static android.webkit.Flags.updateServiceV2; import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; Loading Loading @@ -51,7 +53,7 @@ public class WebViewUpdateService extends SystemService { private static final String TAG = "WebViewUpdateService"; private static final String TAG = "WebViewUpdateService"; private BroadcastReceiver mWebViewUpdatedReceiver; private BroadcastReceiver mWebViewUpdatedReceiver; private WebViewUpdateServiceImpl mImpl; private WebViewUpdateServiceInterface mImpl; static final int PACKAGE_CHANGED = 0; static final int PACKAGE_CHANGED = 0; static final int PACKAGE_ADDED = 1; static final int PACKAGE_ADDED = 1; Loading @@ -60,8 +62,12 @@ public class WebViewUpdateService extends SystemService { public WebViewUpdateService(Context context) { public WebViewUpdateService(Context context) { super(context); super(context); if (updateServiceV2()) { mImpl = new WebViewUpdateServiceImpl2(context, SystemImpl.getInstance()); } else { mImpl = new WebViewUpdateServiceImpl(context, SystemImpl.getInstance()); mImpl = new WebViewUpdateServiceImpl(context, SystemImpl.getInstance()); } } } @Override @Override public void onStart() { public void onStart() { Loading services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +27 −14 Original line number Original line Diff line number Diff line Loading @@ -63,7 +63,7 @@ import java.util.List; * * * @hide * @hide */ */ class WebViewUpdateServiceImpl { class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { private static final String TAG = WebViewUpdateServiceImpl.class.getSimpleName(); private static final String TAG = WebViewUpdateServiceImpl.class.getSimpleName(); private static class WebViewPackageMissingException extends Exception { private static class WebViewPackageMissingException extends Exception { Loading Loading @@ -112,7 +112,8 @@ class WebViewUpdateServiceImpl { mSystemInterface = systemInterface; mSystemInterface = systemInterface; } } void packageStateChanged(String packageName, int changedState, int userId) { @Override public void packageStateChanged(String packageName, int changedState, int userId) { // We don't early out here in different cases where we could potentially early-out (e.g. if // We don't early out here in different cases where we could potentially early-out (e.g. if // we receive PACKAGE_CHANGED for another user than the system user) since that would // we receive PACKAGE_CHANGED for another user than the system user) since that would // complicate this logic further and open up for more edge cases. // complicate this logic further and open up for more edge cases. Loading Loading @@ -163,7 +164,8 @@ class WebViewUpdateServiceImpl { } } } } void prepareWebViewInSystemServer() { @Override public void prepareWebViewInSystemServer() { mSystemInterface.notifyZygote(isMultiProcessEnabled()); mSystemInterface.notifyZygote(isMultiProcessEnabled()); try { try { synchronized (mLock) { synchronized (mLock) { Loading Loading @@ -210,7 +212,8 @@ class WebViewUpdateServiceImpl { mSystemInterface.ensureZygoteStarted(); mSystemInterface.ensureZygoteStarted(); } } void handleNewUser(int userId) { @Override public void handleNewUser(int userId) { // The system user is always started at boot, and by that point we have already run one // The system user is always started at boot, and by that point we have already run one // round of the package-changing logic (through prepareWebViewInSystemServer()), so early // round of the package-changing logic (through prepareWebViewInSystemServer()), so early // out here. // out here. Loading @@ -218,7 +221,8 @@ class WebViewUpdateServiceImpl { handleUserChange(); handleUserChange(); } } void handleUserRemoved(int userId) { @Override public void handleUserRemoved(int userId) { handleUserChange(); handleUserChange(); } } Loading @@ -232,14 +236,16 @@ class WebViewUpdateServiceImpl { updateCurrentWebViewPackage(null); updateCurrentWebViewPackage(null); } } void notifyRelroCreationCompleted() { @Override public void notifyRelroCreationCompleted() { synchronized (mLock) { synchronized (mLock) { mNumRelroCreationsFinished++; mNumRelroCreationsFinished++; checkIfRelrosDoneLocked(); checkIfRelrosDoneLocked(); } } } } WebViewProviderResponse waitForAndGetProvider() { @Override public WebViewProviderResponse waitForAndGetProvider() { PackageInfo webViewPackage = null; PackageInfo webViewPackage = null; final long timeoutTimeMs = System.nanoTime() / NS_PER_MS + WAIT_TIMEOUT_MS; final long timeoutTimeMs = System.nanoTime() / NS_PER_MS + WAIT_TIMEOUT_MS; boolean webViewReady = false; boolean webViewReady = false; Loading Loading @@ -284,7 +290,8 @@ class WebViewUpdateServiceImpl { * replacing that provider it will not be in use directly, but will be used when the relros * replacing that provider it will not be in use directly, but will be used when the relros * or the replacement are done). * or the replacement are done). */ */ String changeProviderAndSetting(String newProviderName) { @Override public String changeProviderAndSetting(String newProviderName) { PackageInfo newPackage = updateCurrentWebViewPackage(newProviderName); PackageInfo newPackage = updateCurrentWebViewPackage(newProviderName); if (newPackage == null) return ""; if (newPackage == null) return ""; return newPackage.packageName; return newPackage.packageName; Loading Loading @@ -367,7 +374,8 @@ class WebViewUpdateServiceImpl { /** /** * Fetch only the currently valid WebView packages. * Fetch only the currently valid WebView packages. **/ **/ WebViewProviderInfo[] getValidWebViewPackages() { @Override public WebViewProviderInfo[] getValidWebViewPackages() { ProviderAndPackageInfo[] providersAndPackageInfos = getValidWebViewPackagesAndInfos(); ProviderAndPackageInfo[] providersAndPackageInfos = getValidWebViewPackagesAndInfos(); WebViewProviderInfo[] providers = WebViewProviderInfo[] providers = new WebViewProviderInfo[providersAndPackageInfos.length]; new WebViewProviderInfo[providersAndPackageInfos.length]; Loading Loading @@ -464,11 +472,13 @@ class WebViewUpdateServiceImpl { return true; return true; } } WebViewProviderInfo[] getWebViewPackages() { @Override public WebViewProviderInfo[] getWebViewPackages() { return mSystemInterface.getWebViewPackages(); return mSystemInterface.getWebViewPackages(); } } PackageInfo getCurrentWebViewPackage() { @Override public PackageInfo getCurrentWebViewPackage() { synchronized (mLock) { synchronized (mLock) { return mCurrentWebViewPackage; return mCurrentWebViewPackage; } } Loading Loading @@ -620,7 +630,8 @@ class WebViewUpdateServiceImpl { return null; return null; } } boolean isMultiProcessEnabled() { @Override public boolean isMultiProcessEnabled() { int settingValue = mSystemInterface.getMultiProcessSetting(mContext); int settingValue = mSystemInterface.getMultiProcessSetting(mContext); if (mSystemInterface.isMultiProcessDefaultEnabled()) { if (mSystemInterface.isMultiProcessDefaultEnabled()) { // Multiprocess should be enabled unless the user has turned it off manually. // Multiprocess should be enabled unless the user has turned it off manually. Loading @@ -631,7 +642,8 @@ class WebViewUpdateServiceImpl { } } } } void enableMultiProcess(boolean enable) { @Override public void enableMultiProcess(boolean enable) { PackageInfo current = getCurrentWebViewPackage(); PackageInfo current = getCurrentWebViewPackage(); mSystemInterface.setMultiProcessSetting(mContext, mSystemInterface.setMultiProcessSetting(mContext, enable ? MULTIPROCESS_SETTING_ON_VALUE : MULTIPROCESS_SETTING_OFF_VALUE); enable ? MULTIPROCESS_SETTING_ON_VALUE : MULTIPROCESS_SETTING_OFF_VALUE); Loading @@ -644,7 +656,8 @@ class WebViewUpdateServiceImpl { /** /** * Dump the state of this Service. * Dump the state of this Service. */ */ void dumpState(PrintWriter pw) { @Override public void dumpState(PrintWriter pw) { pw.println("Current WebView Update Service state"); pw.println("Current WebView Update Service state"); pw.println(String.format(" Multiprocess enabled: %b", isMultiProcessEnabled())); pw.println(String.format(" Multiprocess enabled: %b", isMultiProcessEnabled())); synchronized (mLock) { synchronized (mLock) { Loading services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java 0 → 100644 +747 −0 File added.Preview size limit exceeded, changes collapsed. Show changes services/core/java/com/android/server/webkit/WebViewUpdateServiceInterface.java 0 → 100644 +50 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.webkit; import android.content.pm.PackageInfo; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; import java.io.PrintWriter; interface WebViewUpdateServiceInterface { void packageStateChanged(String packageName, int changedState, int userId); void handleNewUser(int userId); void handleUserRemoved(int userId); WebViewProviderInfo[] getWebViewPackages(); void prepareWebViewInSystemServer(); void notifyRelroCreationCompleted(); WebViewProviderResponse waitForAndGetProvider(); String changeProviderAndSetting(String newProviderName); WebViewProviderInfo[] getValidWebViewPackages(); PackageInfo getCurrentWebViewPackage(); boolean isMultiProcessEnabled(); void enableMultiProcess(boolean enable); void dumpState(PrintWriter pw); } Loading
AconfigFlags.bp +17 −0 Original line number Original line Diff line number Diff line Loading @@ -64,6 +64,7 @@ aconfig_srcjars = [ ":android.hardware.usb.flags-aconfig-java{.generated_srcjars}", ":android.hardware.usb.flags-aconfig-java{.generated_srcjars}", ":android.tracing.flags-aconfig-java{.generated_srcjars}", ":android.tracing.flags-aconfig-java{.generated_srcjars}", ":android.appwidget.flags-aconfig-java{.generated_srcjars}", ":android.appwidget.flags-aconfig-java{.generated_srcjars}", ":android.webkit.flags-aconfig-java{.generated_srcjars}", ] ] filegroup { filegroup { Loading Loading @@ -762,3 +763,19 @@ java_aconfig_library { aconfig_declarations: "android.appwidget.flags-aconfig", aconfig_declarations: "android.appwidget.flags-aconfig", defaults: ["framework-minus-apex-aconfig-java-defaults"], defaults: ["framework-minus-apex-aconfig-java-defaults"], } } // WebView aconfig_declarations { name: "android.webkit.flags-aconfig", package: "android.webkit", srcs: [ "core/java/android/webkit/*.aconfig", "services/core/java/com/android/server/webkit/*.aconfig", ], } java_aconfig_library { name: "android.webkit.flags-aconfig-java", aconfig_declarations: "android.webkit.flags-aconfig", defaults: ["framework-minus-apex-aconfig-java-defaults"], }
services/core/java/com/android/server/webkit/WebViewUpdateService.java +8 −2 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.server.webkit; package com.android.server.webkit; import static android.webkit.Flags.updateServiceV2; import android.content.BroadcastReceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.Intent; Loading Loading @@ -51,7 +53,7 @@ public class WebViewUpdateService extends SystemService { private static final String TAG = "WebViewUpdateService"; private static final String TAG = "WebViewUpdateService"; private BroadcastReceiver mWebViewUpdatedReceiver; private BroadcastReceiver mWebViewUpdatedReceiver; private WebViewUpdateServiceImpl mImpl; private WebViewUpdateServiceInterface mImpl; static final int PACKAGE_CHANGED = 0; static final int PACKAGE_CHANGED = 0; static final int PACKAGE_ADDED = 1; static final int PACKAGE_ADDED = 1; Loading @@ -60,8 +62,12 @@ public class WebViewUpdateService extends SystemService { public WebViewUpdateService(Context context) { public WebViewUpdateService(Context context) { super(context); super(context); if (updateServiceV2()) { mImpl = new WebViewUpdateServiceImpl2(context, SystemImpl.getInstance()); } else { mImpl = new WebViewUpdateServiceImpl(context, SystemImpl.getInstance()); mImpl = new WebViewUpdateServiceImpl(context, SystemImpl.getInstance()); } } } @Override @Override public void onStart() { public void onStart() { Loading
services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java +27 −14 Original line number Original line Diff line number Diff line Loading @@ -63,7 +63,7 @@ import java.util.List; * * * @hide * @hide */ */ class WebViewUpdateServiceImpl { class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface { private static final String TAG = WebViewUpdateServiceImpl.class.getSimpleName(); private static final String TAG = WebViewUpdateServiceImpl.class.getSimpleName(); private static class WebViewPackageMissingException extends Exception { private static class WebViewPackageMissingException extends Exception { Loading Loading @@ -112,7 +112,8 @@ class WebViewUpdateServiceImpl { mSystemInterface = systemInterface; mSystemInterface = systemInterface; } } void packageStateChanged(String packageName, int changedState, int userId) { @Override public void packageStateChanged(String packageName, int changedState, int userId) { // We don't early out here in different cases where we could potentially early-out (e.g. if // We don't early out here in different cases where we could potentially early-out (e.g. if // we receive PACKAGE_CHANGED for another user than the system user) since that would // we receive PACKAGE_CHANGED for another user than the system user) since that would // complicate this logic further and open up for more edge cases. // complicate this logic further and open up for more edge cases. Loading Loading @@ -163,7 +164,8 @@ class WebViewUpdateServiceImpl { } } } } void prepareWebViewInSystemServer() { @Override public void prepareWebViewInSystemServer() { mSystemInterface.notifyZygote(isMultiProcessEnabled()); mSystemInterface.notifyZygote(isMultiProcessEnabled()); try { try { synchronized (mLock) { synchronized (mLock) { Loading Loading @@ -210,7 +212,8 @@ class WebViewUpdateServiceImpl { mSystemInterface.ensureZygoteStarted(); mSystemInterface.ensureZygoteStarted(); } } void handleNewUser(int userId) { @Override public void handleNewUser(int userId) { // The system user is always started at boot, and by that point we have already run one // The system user is always started at boot, and by that point we have already run one // round of the package-changing logic (through prepareWebViewInSystemServer()), so early // round of the package-changing logic (through prepareWebViewInSystemServer()), so early // out here. // out here. Loading @@ -218,7 +221,8 @@ class WebViewUpdateServiceImpl { handleUserChange(); handleUserChange(); } } void handleUserRemoved(int userId) { @Override public void handleUserRemoved(int userId) { handleUserChange(); handleUserChange(); } } Loading @@ -232,14 +236,16 @@ class WebViewUpdateServiceImpl { updateCurrentWebViewPackage(null); updateCurrentWebViewPackage(null); } } void notifyRelroCreationCompleted() { @Override public void notifyRelroCreationCompleted() { synchronized (mLock) { synchronized (mLock) { mNumRelroCreationsFinished++; mNumRelroCreationsFinished++; checkIfRelrosDoneLocked(); checkIfRelrosDoneLocked(); } } } } WebViewProviderResponse waitForAndGetProvider() { @Override public WebViewProviderResponse waitForAndGetProvider() { PackageInfo webViewPackage = null; PackageInfo webViewPackage = null; final long timeoutTimeMs = System.nanoTime() / NS_PER_MS + WAIT_TIMEOUT_MS; final long timeoutTimeMs = System.nanoTime() / NS_PER_MS + WAIT_TIMEOUT_MS; boolean webViewReady = false; boolean webViewReady = false; Loading Loading @@ -284,7 +290,8 @@ class WebViewUpdateServiceImpl { * replacing that provider it will not be in use directly, but will be used when the relros * replacing that provider it will not be in use directly, but will be used when the relros * or the replacement are done). * or the replacement are done). */ */ String changeProviderAndSetting(String newProviderName) { @Override public String changeProviderAndSetting(String newProviderName) { PackageInfo newPackage = updateCurrentWebViewPackage(newProviderName); PackageInfo newPackage = updateCurrentWebViewPackage(newProviderName); if (newPackage == null) return ""; if (newPackage == null) return ""; return newPackage.packageName; return newPackage.packageName; Loading Loading @@ -367,7 +374,8 @@ class WebViewUpdateServiceImpl { /** /** * Fetch only the currently valid WebView packages. * Fetch only the currently valid WebView packages. **/ **/ WebViewProviderInfo[] getValidWebViewPackages() { @Override public WebViewProviderInfo[] getValidWebViewPackages() { ProviderAndPackageInfo[] providersAndPackageInfos = getValidWebViewPackagesAndInfos(); ProviderAndPackageInfo[] providersAndPackageInfos = getValidWebViewPackagesAndInfos(); WebViewProviderInfo[] providers = WebViewProviderInfo[] providers = new WebViewProviderInfo[providersAndPackageInfos.length]; new WebViewProviderInfo[providersAndPackageInfos.length]; Loading Loading @@ -464,11 +472,13 @@ class WebViewUpdateServiceImpl { return true; return true; } } WebViewProviderInfo[] getWebViewPackages() { @Override public WebViewProviderInfo[] getWebViewPackages() { return mSystemInterface.getWebViewPackages(); return mSystemInterface.getWebViewPackages(); } } PackageInfo getCurrentWebViewPackage() { @Override public PackageInfo getCurrentWebViewPackage() { synchronized (mLock) { synchronized (mLock) { return mCurrentWebViewPackage; return mCurrentWebViewPackage; } } Loading Loading @@ -620,7 +630,8 @@ class WebViewUpdateServiceImpl { return null; return null; } } boolean isMultiProcessEnabled() { @Override public boolean isMultiProcessEnabled() { int settingValue = mSystemInterface.getMultiProcessSetting(mContext); int settingValue = mSystemInterface.getMultiProcessSetting(mContext); if (mSystemInterface.isMultiProcessDefaultEnabled()) { if (mSystemInterface.isMultiProcessDefaultEnabled()) { // Multiprocess should be enabled unless the user has turned it off manually. // Multiprocess should be enabled unless the user has turned it off manually. Loading @@ -631,7 +642,8 @@ class WebViewUpdateServiceImpl { } } } } void enableMultiProcess(boolean enable) { @Override public void enableMultiProcess(boolean enable) { PackageInfo current = getCurrentWebViewPackage(); PackageInfo current = getCurrentWebViewPackage(); mSystemInterface.setMultiProcessSetting(mContext, mSystemInterface.setMultiProcessSetting(mContext, enable ? MULTIPROCESS_SETTING_ON_VALUE : MULTIPROCESS_SETTING_OFF_VALUE); enable ? MULTIPROCESS_SETTING_ON_VALUE : MULTIPROCESS_SETTING_OFF_VALUE); Loading @@ -644,7 +656,8 @@ class WebViewUpdateServiceImpl { /** /** * Dump the state of this Service. * Dump the state of this Service. */ */ void dumpState(PrintWriter pw) { @Override public void dumpState(PrintWriter pw) { pw.println("Current WebView Update Service state"); pw.println("Current WebView Update Service state"); pw.println(String.format(" Multiprocess enabled: %b", isMultiProcessEnabled())); pw.println(String.format(" Multiprocess enabled: %b", isMultiProcessEnabled())); synchronized (mLock) { synchronized (mLock) { Loading
services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java 0 → 100644 +747 −0 File added.Preview size limit exceeded, changes collapsed. Show changes
services/core/java/com/android/server/webkit/WebViewUpdateServiceInterface.java 0 → 100644 +50 −0 Original line number Original line Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.webkit; import android.content.pm.PackageInfo; import android.webkit.WebViewProviderInfo; import android.webkit.WebViewProviderResponse; import java.io.PrintWriter; interface WebViewUpdateServiceInterface { void packageStateChanged(String packageName, int changedState, int userId); void handleNewUser(int userId); void handleUserRemoved(int userId); WebViewProviderInfo[] getWebViewPackages(); void prepareWebViewInSystemServer(); void notifyRelroCreationCompleted(); WebViewProviderResponse waitForAndGetProvider(); String changeProviderAndSetting(String newProviderName); WebViewProviderInfo[] getValidWebViewPackages(); PackageInfo getCurrentWebViewPackage(); boolean isMultiProcessEnabled(); void enableMultiProcess(boolean enable); void dumpState(PrintWriter pw); }