diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java index 70452006da276..93826d808c3ad 100644 --- a/core/java/android/os/ZygoteProcess.java +++ b/core/java/android/os/ZygoteProcess.java @@ -463,8 +463,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"); @@ -483,6 +483,8 @@ public class ZygoteProcess { state.writer.newLine(); state.writer.flush(); + + return (state.inputStream.readInt() == 0); } } diff --git a/core/java/com/android/internal/os/WebViewZygoteInit.java b/core/java/com/android/internal/os/WebViewZygoteInit.java index e28079fd5cdd6..58e4a3ed8deb8 100644 --- a/core/java/com/android/internal/os/WebViewZygoteInit.java +++ b/core/java/com/android/internal/os/WebViewZygoteInit.java @@ -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 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; } diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java index 45cb8405468de..d459bc31beba0 100644 --- a/core/java/com/android/internal/os/ZygoteConnection.java +++ b/core/java/com/android/internal/os/ZygoteConnection.java @@ -307,6 +307,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"); }