diff options
| author | 2017-06-22 18:32:22 +0000 | |
|---|---|---|
| committer | 2017-06-22 18:32:22 +0000 | |
| commit | bb6cf84a40b9a842f59fc4d0102c26a071b19f4c (patch) | |
| tree | fa241a7e7561eae1eafef0ddd8134106d808dd55 | |
| parent | 34dc5a58b33811b55263629c500966d44978288b (diff) | |
| parent | 12e0975963b57ae3e20aa5ec999afa7743f4dea2 (diff) | |
Merge "Add a common call when wrapping an app."
am: 12e0975963
Change-Id: I81830a6d826cd109c99f6e857204f96da9d4a656
| -rw-r--r-- | core/java/com/android/internal/os/WrapperInit.java | 2 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/Zygote.java | 5 | ||||
| -rw-r--r-- | core/jni/com_android_internal_os_Zygote.cpp | 22 |
3 files changed, 23 insertions, 6 deletions
diff --git a/core/java/com/android/internal/os/WrapperInit.java b/core/java/com/android/internal/os/WrapperInit.java index aced75d6a0ba..1a556d5a0ace 100644 --- a/core/java/com/android/internal/os/WrapperInit.java +++ b/core/java/com/android/internal/os/WrapperInit.java @@ -160,6 +160,8 @@ public class WrapperInit { argv = removedArgs; } + // Perform the same initialization that would happen after the Zygote forks. + Zygote.nativePreApplicationInit(); RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader); } diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index e065843a3961..91d9d1e43cf7 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -121,6 +121,11 @@ public final class Zygote { int[] fdsToIgnore, String instructionSet, String appDataDir); /** + * Called to do any initialization before starting an application. + */ + native static void nativePreApplicationInit(); + + /** * Special method to start the system server process. In addition to the * common actions performed in forkAndSpecialize, the pid of the child * process is recorded such that the death of the child process will cause diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index d73e7dd50140..cb53106dbf28 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -221,6 +221,14 @@ static void SetRLimits(JNIEnv* env, jobjectArray javaRlimits) { // The debug malloc library needs to know whether it's the zygote or a child. extern "C" int gMallocLeakZygoteChild; +static void PreApplicationInit() { + // The child process sets this to indicate it's not the zygote. + gMallocLeakZygoteChild = 1; + + // Set the jemalloc decay time to 1. + mallopt(M_DECAY_TIME, 1); +} + static void EnableKeepCapabilities(JNIEnv* env) { int rc = prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0); if (rc == -1) { @@ -517,11 +525,7 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra pid_t pid = fork(); if (pid == 0) { - // The child process. - gMallocLeakZygoteChild = 1; - - // Set the jemalloc decay time to 1. - mallopt(M_DECAY_TIME, 1); + PreApplicationInit(); // Clean up any descriptors which must be closed immediately DetachDescriptors(env, fdsToClose); @@ -678,6 +682,10 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra namespace android { +static void com_android_internal_os_Zygote_nativePreApplicationInit(JNIEnv*, jclass) { + PreApplicationInit(); +} + static jint com_android_internal_os_Zygote_nativeForkAndSpecialize( JNIEnv* env, jclass, jint uid, jint gid, jintArray gids, jint debug_flags, jobjectArray rlimits, @@ -807,7 +815,9 @@ static const JNINativeMethod gMethods[] = { { "nativeAllowFileAcrossFork", "(Ljava/lang/String;)V", (void *) com_android_internal_os_Zygote_nativeAllowFileAcrossFork }, { "nativeUnmountStorageOnInit", "()V", - (void *) com_android_internal_os_Zygote_nativeUnmountStorageOnInit } + (void *) com_android_internal_os_Zygote_nativeUnmountStorageOnInit }, + { "nativePreApplicationInit", "()V", + (void *) com_android_internal_os_Zygote_nativePreApplicationInit } }; int register_com_android_internal_os_Zygote(JNIEnv* env) { |