summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/com/android/internal/os/ZygoteConnection.java2
-rw-r--r--core/java/com/android/internal/os/ZygoteInit.java32
2 files changed, 27 insertions, 7 deletions
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index 39cb464de56c..e9e642a58a33 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -171,6 +171,8 @@ class ZygoteConnection {
return handleAbiListQuery();
}
+ ZygoteInit.maybePreload();
+
if (parsedArgs.preloadPackage != null) {
return handlePreloadPackage(parsedArgs.preloadPackage,
parsedArgs.preloadPackageLibs);
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index c88e9da49c8e..f47784ee7c03 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -112,6 +112,8 @@ public class ZygoteInit {
private static final int ROOT_UID = 0;
private static final int ROOT_GID = 0;
+ private static boolean sPreloadComplete;
+
static void preload(BootTimingsTraceLog bootTimingsTraceLog) {
Log.d(TAG, "begin preload");
bootTimingsTraceLog.traceBegin("BeginIcuCachePinning");
@@ -134,6 +136,15 @@ public class ZygoteInit {
endIcuCachePinning();
warmUpJcaProviders();
Log.d(TAG, "end preload");
+
+ sPreloadComplete = true;
+ }
+
+ public static void maybePreload() {
+ if (!sPreloadComplete) {
+ Log.i(TAG, "Lazily preloading resources.");
+ preload(new BootTimingsTraceLog("ZygoteInitTiming_lazy", Trace.TRACE_TAG_DALVIK));
+ }
}
private static void beginIcuCachePinning() {
@@ -660,9 +671,12 @@ public class ZygoteInit {
boolean startSystemServer = false;
String socketName = "zygote";
String abiList = null;
+ boolean enableLazyPreload = false;
for (int i = 1; i < argv.length; i++) {
if ("start-system-server".equals(argv[i])) {
startSystemServer = true;
+ } else if ("--enable-lazy-preload".equals(argv[i])) {
+ enableLazyPreload = true;
} else if (argv[i].startsWith(ABI_LIST_ARG)) {
abiList = argv[i].substring(ABI_LIST_ARG.length());
} else if (argv[i].startsWith(SOCKET_NAME_ARG)) {
@@ -677,13 +691,17 @@ public class ZygoteInit {
}
zygoteServer.registerServerSocket(socketName);
- bootTimingsTraceLog.traceBegin("ZygotePreload");
- EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
- SystemClock.uptimeMillis());
- preload(bootTimingsTraceLog);
- EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
- SystemClock.uptimeMillis());
- bootTimingsTraceLog.traceEnd(); // ZygotePreload
+ // In some configurations, we avoid preloading resources and classes eagerly.
+ // In such cases, we will preload things prior to our first fork.
+ if (!enableLazyPreload) {
+ bootTimingsTraceLog.traceBegin("ZygotePreload");
+ EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
+ SystemClock.uptimeMillis());
+ preload(bootTimingsTraceLog);
+ EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
+ SystemClock.uptimeMillis());
+ bootTimingsTraceLog.traceEnd(); // ZygotePreload
+ }
// Finish profiling the zygote initialization.
SamplingProfilerIntegration.writeZygoteSnapshot();