summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Martijn Coenen <maco@google.com> 2018-12-07 17:29:21 +0100
committer Martijn Coenen <maco@google.com> 2019-01-07 09:10:31 +0000
commit2ce0d86a77a26899d0b737cda97f636c25753fde (patch)
tree84be19fa35933e7fbe40a3df61f5f35ef817f7c2
parent01e719bebbd3bcc64d4ddb4ace8ac01082e3b706 (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.java18
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);