diff options
| -rw-r--r-- | core/java/android/os/ZygoteProcess.java | 6 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/WebViewZygoteInit.java | 14 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/ZygoteConnection.java | 4 |
3 files changed, 21 insertions, 3 deletions
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java index 0d81bd9c74dc..7a13ee89d393 100644 --- a/core/java/android/os/ZygoteProcess.java +++ b/core/java/android/os/ZygoteProcess.java @@ -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); } } diff --git a/core/java/com/android/internal/os/WebViewZygoteInit.java b/core/java/com/android/internal/os/WebViewZygoteInit.java index e28079fd5cdd..58e4a3ed8deb 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<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; } diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java index 2013ac09d8e2..f0c0b99de65e 100644 --- a/core/java/com/android/internal/os/ZygoteConnection.java +++ b/core/java/com/android/internal/os/ZygoteConnection.java @@ -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"); } |