Loading core/java/com/android/internal/os/Zygote.java +6 −0 Original line number Diff line number Diff line Loading @@ -149,6 +149,12 @@ public final class Zygote { native private static int nativeForkSystemServer(int uid, int gid, int[] gids, int debugFlags, int[][] rlimits, long permittedCapabilities, long effectiveCapabilities); /** * Zygote unmount storage space on initializing. * This method is called once. */ native protected static void nativeUnmountStorageOnInit(); private static void callPostForkChildHooks(int debugFlags, boolean isSystemServer, String instructionSet) { VM_HOOKS.postForkChild(debugFlags, isSystemServer, instructionSet); Loading core/java/com/android/internal/os/ZygoteInit.java +3 −0 Original line number Diff line number Diff line Loading @@ -621,6 +621,9 @@ public class ZygoteInit { // Zygote. Trace.setTracingEnabled(false); // Zygote process unmounts root storage spaces. Zygote.nativeUnmountStorageOnInit(); if (startSystemServer) { startSystemServer(abiList, socketName); } Loading core/jni/com_android_internal_os_Zygote.cpp +13 −4 Original line number Diff line number Diff line Loading @@ -302,9 +302,6 @@ static bool MountEmulatedStorage(uid_t uid, jint mount_mode, return false; } // Unmount storage provided by root namespace and mount requested view UnmountTree("/storage"); String8 storageSource; if (mount_mode == MOUNT_EXTERNAL_DEFAULT) { storageSource = "/mnt/runtime/default"; Loading Loading @@ -663,12 +660,24 @@ static jint com_android_internal_os_Zygote_nativeForkSystemServer( return pid; } static void com_android_internal_os_Zygote_nativeUnmountStorageOnInit(JNIEnv* env, jclass) { // Zygote process unmount root storage space initially before every child processes are forked. // Every forked child processes (include SystemServer) only mount their own root storage space // And no need unmount storage operation in MountEmulatedStorage method. // Zygote process does not utilize root storage spaces and unshared its mount namespace from the ART. UnmountTree("/storage"); return; } static const JNINativeMethod gMethods[] = { { "nativeForkAndSpecialize", "(II[II[[IILjava/lang/String;Ljava/lang/String;[ILjava/lang/String;Ljava/lang/String;)I", (void *) com_android_internal_os_Zygote_nativeForkAndSpecialize }, { "nativeForkSystemServer", "(II[II[[IJJ)I", (void *) com_android_internal_os_Zygote_nativeForkSystemServer } (void *) com_android_internal_os_Zygote_nativeForkSystemServer }, { "nativeUnmountStorageOnInit", "()V", (void *) com_android_internal_os_Zygote_nativeUnmountStorageOnInit } }; int register_com_android_internal_os_Zygote(JNIEnv* env) { Loading Loading
core/java/com/android/internal/os/Zygote.java +6 −0 Original line number Diff line number Diff line Loading @@ -149,6 +149,12 @@ public final class Zygote { native private static int nativeForkSystemServer(int uid, int gid, int[] gids, int debugFlags, int[][] rlimits, long permittedCapabilities, long effectiveCapabilities); /** * Zygote unmount storage space on initializing. * This method is called once. */ native protected static void nativeUnmountStorageOnInit(); private static void callPostForkChildHooks(int debugFlags, boolean isSystemServer, String instructionSet) { VM_HOOKS.postForkChild(debugFlags, isSystemServer, instructionSet); Loading
core/java/com/android/internal/os/ZygoteInit.java +3 −0 Original line number Diff line number Diff line Loading @@ -621,6 +621,9 @@ public class ZygoteInit { // Zygote. Trace.setTracingEnabled(false); // Zygote process unmounts root storage spaces. Zygote.nativeUnmountStorageOnInit(); if (startSystemServer) { startSystemServer(abiList, socketName); } Loading
core/jni/com_android_internal_os_Zygote.cpp +13 −4 Original line number Diff line number Diff line Loading @@ -302,9 +302,6 @@ static bool MountEmulatedStorage(uid_t uid, jint mount_mode, return false; } // Unmount storage provided by root namespace and mount requested view UnmountTree("/storage"); String8 storageSource; if (mount_mode == MOUNT_EXTERNAL_DEFAULT) { storageSource = "/mnt/runtime/default"; Loading Loading @@ -663,12 +660,24 @@ static jint com_android_internal_os_Zygote_nativeForkSystemServer( return pid; } static void com_android_internal_os_Zygote_nativeUnmountStorageOnInit(JNIEnv* env, jclass) { // Zygote process unmount root storage space initially before every child processes are forked. // Every forked child processes (include SystemServer) only mount their own root storage space // And no need unmount storage operation in MountEmulatedStorage method. // Zygote process does not utilize root storage spaces and unshared its mount namespace from the ART. UnmountTree("/storage"); return; } static const JNINativeMethod gMethods[] = { { "nativeForkAndSpecialize", "(II[II[[IILjava/lang/String;Ljava/lang/String;[ILjava/lang/String;Ljava/lang/String;)I", (void *) com_android_internal_os_Zygote_nativeForkAndSpecialize }, { "nativeForkSystemServer", "(II[II[[IJJ)I", (void *) com_android_internal_os_Zygote_nativeForkSystemServer } (void *) com_android_internal_os_Zygote_nativeForkSystemServer }, { "nativeUnmountStorageOnInit", "()V", (void *) com_android_internal_os_Zygote_nativeUnmountStorageOnInit } }; int register_com_android_internal_os_Zygote(JNIEnv* env) { Loading