diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index cd0b340d489d7..2619fbbdfe47b 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -631,7 +631,7 @@ bool AndroidRuntime::parseCompilerRuntimeOption(const char* property, * * Returns 0 on success. */ -int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote) +int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote, bool primary_zygote) { JavaVMInitArgs initArgs; char propBuf[PROPERTY_VALUE_MAX]; @@ -762,6 +762,10 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote) addOption("-verbose:gc"); //addOption("-verbose:class"); + if (primary_zygote) { + addOption("-Xprimaryzygote"); + } + /* * The default starting and maximum size of the heap. Larger * values should be specified in a product property override. @@ -1123,6 +1127,8 @@ void AndroidRuntime::start(const char* className, const Vector& options className != NULL ? className : "(unknown)", getuid()); static const String8 startSystemServer("start-system-server"); + // Whether this is the primary zygote, meaning the zygote which will fork system server. + bool primary_zygote = false; /* * 'startSystemServer == true' means runtime is obsolete and not run from @@ -1130,6 +1136,7 @@ void AndroidRuntime::start(const char* className, const Vector& options */ for (size_t i = 0; i < options.size(); ++i) { if (options[i] == startSystemServer) { + primary_zygote = true; /* track our progress through the boot sequence */ const int LOG_BOOT_PROGRESS_START = 3000; LOG_EVENT_LONG(LOG_BOOT_PROGRESS_START, ns2ms(systemTime(SYSTEM_TIME_MONOTONIC))); @@ -1165,7 +1172,7 @@ void AndroidRuntime::start(const char* className, const Vector& options JniInvocation jni_invocation; jni_invocation.Init(NULL); JNIEnv* env; - if (startVm(&mJavaVM, &env, zygote) != 0) { + if (startVm(&mJavaVM, &env, zygote, primary_zygote) != 0) { return; } onVmCreated(env); diff --git a/core/jni/include/android_runtime/AndroidRuntime.h b/core/jni/include/android_runtime/AndroidRuntime.h index 3ec8b1fe903f8..9d803f614b38e 100644 --- a/core/jni/include/android_runtime/AndroidRuntime.h +++ b/core/jni/include/android_runtime/AndroidRuntime.h @@ -131,7 +131,7 @@ private: const char* runtimeArg, const char* quotingArg); void parseExtraOpts(char* extraOptsBuf, const char* quotingArg); - int startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote); + int startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote, bool primary_zygote); Vector mOptions; bool mExitWithoutCleanup;