From 2980de4a59db048851fbbac9cd847a96a12fa4ec Mon Sep 17 00:00:00 2001 From: Christopher Ferris Date: Tue, 20 Jun 2017 16:13:40 -0700 Subject: [PATCH] Add a common call when wrapping an app. When an application is wrapped using setprop wrap., it doesn't set the special zygote flag, or make the mallopt call. This means that a wrapped application will behave differently, and not be able to track zygote native allocations versus app native allocations. This CL adds a nativePreApplicationInit call that is used after the Zygote is forked, and when a wrapped application is called. Bug: 62068500 Test: Booted sailfish system. Verified that the zygote has not called Test: the new function. Verified the function is called when a wrapper Test: is used. Verified the function is called when the Zygote forks Test: a process. Change-Id: I392e1b5429be77def63f7815b072d68e9408cc7f --- .../com/android/internal/os/WrapperInit.java | 2 ++ core/java/com/android/internal/os/Zygote.java | 5 +++++ 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 b245678e59374..608bc9ff33d34 100644 --- a/core/java/com/android/internal/os/WrapperInit.java +++ b/core/java/com/android/internal/os/WrapperInit.java @@ -163,6 +163,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 5eca496e2ee82..0106b81baf9fb 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -120,6 +120,11 @@ public final class Zygote { int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose, 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 diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index d73e7dd501408..cb53106dbf28b 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) {