diff options
| author | 2018-12-07 17:29:21 +0100 | |
|---|---|---|
| committer | 2019-01-07 09:10:31 +0000 | |
| commit | 2ce0d86a77a26899d0b737cda97f636c25753fde (patch) | |
| tree | 84be19fa35933e7fbe40a3df61f5f35ef817f7c2 | |
| parent | 01e719bebbd3bcc64d4ddb4ace8ac01082e3b706 (diff) | |
Call into application to do AppZygote preloading.
For now, assume a class named <package_name>.ZygotePreload
exists, with a method named doPreload() to do the preload.
This should probably be replaced by having an entry in
the manifest.
Bug: 111434506
Test: preload called
Change-Id: Id632e46087eb5c719e6b310ffe007f76d3cbaf7d
| -rw-r--r-- | core/java/com/android/internal/os/AppZygoteInit.java | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/core/java/com/android/internal/os/AppZygoteInit.java b/core/java/com/android/internal/os/AppZygoteInit.java index 09f4b36027cf..afe6dade62ac 100644 --- a/core/java/com/android/internal/os/AppZygoteInit.java +++ b/core/java/com/android/internal/os/AppZygoteInit.java @@ -23,6 +23,8 @@ import android.util.Log; import java.io.DataOutputStream; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; /** * Startup class for an Application zygote process. @@ -70,9 +72,21 @@ class AppZygoteInit { protected void handlePreloadApp(ApplicationInfo appInfo) { Log.i(TAG, "Beginning application preload for " + appInfo.packageName); LoadedApk loadedApk = new LoadedApk(null, appInfo, null, null, false, true, false); - // Initialize the classLoader ClassLoader loader = loadedApk.getClassLoader(); - + Class<?> cl; + Method m; + try { + cl = Class.forName(appInfo.packageName + ".ZygotePreload", true, loader); + m = cl.getMethod("doPreload"); + m.setAccessible(true); + m.invoke(null); + } catch (ClassNotFoundException e) { + // Don't treat this as an error since an app may not want to do any preloads + Log.w(TAG, "No ZygotePreload class found for " + appInfo.packageName); + } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { + Log.e(TAG, "AppZygote application preload failed for " + + appInfo.packageName, e); + } try { DataOutputStream socketOut = getSocketOutputStream(); socketOut.writeInt(loader != null ? 1 : 0); |