Merge "Zygote: Fix race condition on package preloads." into oc-dr1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
84e0f453d1
@@ -488,8 +488,8 @@ public class ZygoteProcess {
|
||||
* Instructs the zygote to pre-load the classes and native libraries at the given paths
|
||||
* for the specified abi. Not all zygotes support this function.
|
||||
*/
|
||||
public void preloadPackageForAbi(String packagePath, String libsPath, String cacheKey,
|
||||
String abi) throws ZygoteStartFailedEx, IOException {
|
||||
public boolean preloadPackageForAbi(String packagePath, String libsPath, String cacheKey,
|
||||
String abi) throws ZygoteStartFailedEx, IOException {
|
||||
synchronized(mLock) {
|
||||
ZygoteState state = openZygoteSocketIfNeeded(abi);
|
||||
state.writer.write("4");
|
||||
@@ -508,6 +508,8 @@ public class ZygoteProcess {
|
||||
state.writer.newLine();
|
||||
|
||||
state.writer.flush();
|
||||
|
||||
return (state.inputStream.readInt() == 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ import android.util.Log;
|
||||
import android.webkit.WebViewFactory;
|
||||
import android.webkit.WebViewFactoryProvider;
|
||||
|
||||
import java.io.DataOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
@@ -87,17 +88,28 @@ class WebViewZygoteInit {
|
||||
// Once we have the classloader, look up the WebViewFactoryProvider implementation and
|
||||
// call preloadInZygote() on it to give it the opportunity to preload the native library
|
||||
// and perform any other initialisation work that should be shared among the children.
|
||||
boolean preloadSucceeded = false;
|
||||
try {
|
||||
Class<WebViewFactoryProvider> providerClass =
|
||||
WebViewFactory.getWebViewProviderClass(loader);
|
||||
Object result = providerClass.getMethod("preloadInZygote").invoke(null);
|
||||
if (!((Boolean)result).booleanValue()) {
|
||||
preloadSucceeded = ((Boolean) result).booleanValue();
|
||||
if (!preloadSucceeded) {
|
||||
Log.e(TAG, "preloadInZygote returned false");
|
||||
}
|
||||
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException |
|
||||
IllegalAccessException | InvocationTargetException e) {
|
||||
Log.e(TAG, "Exception while preloading package", e);
|
||||
}
|
||||
|
||||
try {
|
||||
DataOutputStream socketOut = getSocketOutputStream();
|
||||
socketOut.writeInt(preloadSucceeded ? 1 : 0);
|
||||
} catch (IOException ioe) {
|
||||
Log.e(TAG, "Error writing to command socket", ioe);
|
||||
return true;
|
||||
}
|
||||
|
||||
Log.i(TAG, "Package preload done");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -314,6 +314,10 @@ class ZygoteConnection {
|
||||
return ZygoteInit.isPreloadComplete();
|
||||
}
|
||||
|
||||
protected DataOutputStream getSocketOutputStream() {
|
||||
return mSocketOutStream;
|
||||
}
|
||||
|
||||
protected boolean handlePreloadPackage(String packagePath, String libsPath, String cacheKey) {
|
||||
throw new RuntimeException("Zyogte does not support package preloading");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user