Merge "Synchronize access to WebViewZygote." am: fd6f631de5

am: c8111e07d0

Change-Id: I8c389a9c06bd0b8d1964756323e6c7e010901f89
This commit is contained in:
Robert Sesek
2017-01-05 09:37:32 +00:00
committed by android-build-merger

View File

@@ -24,6 +24,8 @@ import android.os.ZygoteProcess;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
@@ -38,33 +40,59 @@ public class WebViewZygote {
private static final String WEBVIEW_ZYGOTE_SERVICE_32 = "webview_zygote32"; private static final String WEBVIEW_ZYGOTE_SERVICE_32 = "webview_zygote32";
private static final String WEBVIEW_ZYGOTE_SERVICE_64 = "webview_zygote64"; private static final String WEBVIEW_ZYGOTE_SERVICE_64 = "webview_zygote64";
/**
* Lock object that protects all other static members.
*/
private static final Object sLock = new Object();
/**
* Instance that maintains the socket connection to the zygote. This is null if the zygote
* is not running or is not connected.
*/
@GuardedBy("sLock")
private static ZygoteProcess sZygote; private static ZygoteProcess sZygote;
/**
* Information about the selected WebView package. This is set from #onWebViewProviderChanged().
*/
@GuardedBy("sLock")
private static PackageInfo sPackage; private static PackageInfo sPackage;
/**
* Flag for whether multi-process WebView is enabled. If this is false, the zygote
* will not be started.
*/
@GuardedBy("sLock")
private static boolean sMultiprocessEnabled = false; private static boolean sMultiprocessEnabled = false;
public static ZygoteProcess getProcess() { public static ZygoteProcess getProcess() {
connectToZygoteIfNeeded(); synchronized (sLock) {
connectToZygoteIfNeededLocked();
return sZygote; return sZygote;
} }
}
public static String getPackageName() { public static String getPackageName() {
synchronized (sLock) {
return sPackage.packageName; return sPackage.packageName;
} }
}
public static boolean isMultiprocessEnabled() { public static boolean isMultiprocessEnabled() {
synchronized (sLock) {
return sMultiprocessEnabled && sPackage != null; return sMultiprocessEnabled && sPackage != null;
} }
}
public static void setMultiprocessEnabled(boolean enabled) { public static void setMultiprocessEnabled(boolean enabled) {
synchronized (sLock) {
sMultiprocessEnabled = enabled; sMultiprocessEnabled = enabled;
// When toggling between multi-process being on/off, start or stop the // When toggling between multi-process being on/off, start or stop the
// service. If it is enabled and the zygote is not yet started, bring up the service. // service. If it is enabled and the zygote is not yet started, bring up the service.
// Otherwise, bring down the service. The name may be null if the package // Otherwise, bring down the service. The name may be null if the package
// information has not yet been resolved. // information has not yet been resolved.
final String serviceName = getServiceName(); final String serviceName = getServiceNameLocked();
if (serviceName == null) return; if (serviceName == null) return;
if (enabled && sZygote == null) { if (enabled && sZygote == null) {
@@ -74,8 +102,11 @@ public class WebViewZygote {
sZygote = null; sZygote = null;
} }
} }
}
public static void onWebViewProviderChanged(PackageInfo packageInfo) { public static void onWebViewProviderChanged(PackageInfo packageInfo) {
String serviceName;
synchronized (sLock) {
sPackage = packageInfo; sPackage = packageInfo;
// If multi-process is not enabled, then do not start the zygote service. // If multi-process is not enabled, then do not start the zygote service.
@@ -83,11 +114,14 @@ public class WebViewZygote {
return; return;
} }
final String serviceName = getServiceName(); serviceName = getServiceNameLocked();
sZygote = null;
// The service may enter the RUNNING state before it opens the socket,
// so connectToZygoteIfNeededLocked() may still fail.
if (SystemService.isStopped(serviceName)) { if (SystemService.isStopped(serviceName)) {
SystemService.start(serviceName); SystemService.start(serviceName);
} else if (sZygote != null) { } else {
SystemService.restart(serviceName); SystemService.restart(serviceName);
} }
@@ -98,10 +132,12 @@ public class WebViewZygote {
return; return;
} }
connectToZygoteIfNeeded(); connectToZygoteIfNeededLocked();
}
} }
private static String getServiceName() { @GuardedBy("sLock")
private static String getServiceNameLocked() {
if (sPackage == null) if (sPackage == null)
return null; return null;
@@ -113,7 +149,8 @@ public class WebViewZygote {
return WEBVIEW_ZYGOTE_SERVICE_32; return WEBVIEW_ZYGOTE_SERVICE_32;
} }
private static void connectToZygoteIfNeeded() { @GuardedBy("sLock")
private static void connectToZygoteIfNeededLocked() {
if (sZygote != null) if (sZygote != null)
return; return;
@@ -122,7 +159,7 @@ public class WebViewZygote {
return; return;
} }
final String serviceName = getServiceName(); final String serviceName = getServiceNameLocked();
if (!SystemService.isRunning(serviceName)) { if (!SystemService.isRunning(serviceName)) {
Log.e(LOGTAG, serviceName + " is not running"); Log.e(LOGTAG, serviceName + " is not running");
return; return;