diff options
| -rw-r--r-- | core/java/android/os/RecoverySystem.java | 6 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/ZygoteInit.java | 7 | ||||
| -rw-r--r-- | core/jni/com_android_internal_os_Zygote.cpp | 35 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/AppErrors.java | 3 |
4 files changed, 48 insertions, 3 deletions
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index dd7be53d9865..028e30ab93f0 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -695,6 +695,7 @@ public class RecoverySystem { String line = null; int bytesWrittenInMiB = -1, bytesStashedInMiB = -1; int timeTotal = -1; + int uncryptTime = -1; int sourceVersion = -1; while ((line = in.readLine()) != null) { // Here is an example of lines in last_install: @@ -730,6 +731,8 @@ public class RecoverySystem { if (line.startsWith("time")) { timeTotal = scaled; + } else if (line.startsWith("uncrypt_time")) { + uncryptTime = scaled; } else if (line.startsWith("source_build")) { sourceVersion = scaled; } else if (line.startsWith("bytes_written")) { @@ -745,6 +748,9 @@ public class RecoverySystem { if (timeTotal != -1) { MetricsLogger.histogram(context, "ota_time_total", timeTotal); } + if (uncryptTime != -1) { + MetricsLogger.histogram(context, "ota_uncrypt_time", uncryptTime); + } if (sourceVersion != -1) { MetricsLogger.histogram(context, "ota_source_version", sourceVersion); } diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index b57aea634bee..9efa83361166 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -691,6 +691,13 @@ public class ZygoteInit { // an error. ZygoteHooks.startZygoteNoThreadCreation(); + // Zygote goes into its own process group. + try { + Os.setpgid(0, 0); + } catch (ErrnoException ex) { + throw new RuntimeException("Failed to setpgid(0,0)", ex); + } + try { Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "ZygoteInit"); RuntimeInit.enableDdms(); diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 3f4b2a61321b..5202a98bc030 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -32,6 +32,7 @@ #include <signal.h> #include <stdlib.h> #include <sys/capability.h> +#include <sys/cdefs.h> #include <sys/personality.h> #include <sys/prctl.h> #include <sys/resource.h> @@ -667,11 +668,39 @@ static jint com_android_internal_os_Zygote_nativeForkSystemServer( 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. + // and no need unmount storage operation in MountEmulatedStorage method. + // Zygote process does not utilize root storage spaces and unshares its mount namespace below. + + // See storage config details at http://source.android.com/tech/storage/ + // Create private mount namespace shared by all children + if (unshare(CLONE_NEWNS) == -1) { + RuntimeAbort(env, __LINE__, "Failed to unshare()"); + return; + } + + // Mark rootfs as being a slave so that changes from default + // namespace only flow into our children. + if (mount("rootfs", "/", nullptr, (MS_SLAVE | MS_REC), nullptr) == -1) { + RuntimeAbort(env, __LINE__, "Failed to mount() rootfs as MS_SLAVE"); + return; + } + + // Create a staging tmpfs that is shared by our children; they will + // bind mount storage into their respective private namespaces, which + // are isolated from each other. + const char* target_base = getenv("EMULATED_STORAGE_TARGET"); + if (target_base != nullptr) { +#define STRINGIFY_UID(x) __STRING(x) + if (mount("tmpfs", target_base, "tmpfs", MS_NOSUID | MS_NODEV, + "uid=0,gid=" STRINGIFY_UID(AID_SDCARD_R) ",mode=0751") == -1) { + ALOGE("Failed to mount tmpfs to %s", target_base); + RuntimeAbort(env, __LINE__, "Failed to mount tmpfs"); + return; + } +#undef STRINGIFY_UID + } UnmountTree("/storage"); - return; } static const JNINativeMethod gMethods[] = { diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index 724f66f51ca2..ba799f2ca3d1 100644 --- a/services/core/java/com/android/server/am/AppErrors.java +++ b/services/core/java/com/android/server/am/AppErrors.java @@ -756,6 +756,9 @@ class AppErrors { } else if (app.killedByAm) { Slog.i(TAG, "App already killed by AM skipping ANR: " + app + " " + annotation); return; + } else if (app.killed) { + Slog.i(TAG, "Skipping died app ANR: " + app + " " + annotation); + return; } // In case we come through here for the same app before completing |