From cf4b2542fae9d6c5d3788c6a935824094fb1c1ea Mon Sep 17 00:00:00 2001 From: Yusuke Sato Date: Wed, 17 Jun 2015 00:21:28 -0700 Subject: [PATCH] Trace Process.killProcessGroup calls in server/am/ to make it easier to find boot time regressions like 21813611 and 21861473. Process.killProcessGroup is a blocking call and usually takes about 50ms to finish on a recent device even when the process group contains only one process. Since Process.killProcessGroup tends to be called in a loop, the function can be a bottleneck. Bug: 21813611 Change-Id: I9c1727c0c0b321a30c96321198cc02f438496ded --- .../server/am/ActivityManagerService.java | 16 +++++++++++----- .../com/android/server/am/ProcessRecord.java | 3 +++ 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 667abb64b4a54..946397550f980 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -2747,13 +2747,19 @@ public final class ActivityManagerService extends ActivityManagerNative return index; } + private static void killProcessGroup(int uid, int pid) { + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "killProcessGroup"); + Process.killProcessGroup(uid, pid); + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); + } + final void removeLruProcessLocked(ProcessRecord app) { int lrui = mLruProcesses.lastIndexOf(app); if (lrui >= 0) { if (!app.killed) { Slog.wtfStack(TAG, "Removing process that hasn't been killed: " + app); Process.killProcessQuiet(app.pid); - Process.killProcessGroup(app.info.uid, app.pid); + killProcessGroup(app.info.uid, app.pid); } if (lrui <= mLruProcessActivityStart) { mLruProcessActivityStart--; @@ -3118,7 +3124,7 @@ public final class ActivityManagerService extends ActivityManagerNative // clean it up now. if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG_PROCESSES, "App died: " + app); checkTime(startTime, "startProcess: bad proc running, killing"); - Process.killProcessGroup(app.info.uid, app.pid); + killProcessGroup(app.info.uid, app.pid); handleAppDiedLocked(app, true, true); checkTime(startTime, "startProcess: done killing old proc"); } @@ -4604,7 +4610,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (!fromBinderDied) { Process.killProcessQuiet(pid); } - Process.killProcessGroup(app.info.uid, pid); + killProcessGroup(app.info.uid, pid); app.killed = true; } @@ -5927,7 +5933,7 @@ public final class ActivityManagerService extends ActivityManagerNative EventLog.writeEvent(EventLogTags.AM_DROP_PROCESS, pid); if (pid > 0 && pid != MY_PID) { Process.killProcessQuiet(pid); - //TODO: Process.killProcessGroup(app.info.uid, pid); + //TODO: killProcessGroup(app.info.uid, pid); } else { try { thread.scheduleExit(); @@ -12390,7 +12396,7 @@ public final class ActivityManagerService extends ActivityManagerNative } else { // Huh. Process.killProcess(pid); - Process.killProcessGroup(uid, pid); + killProcessGroup(uid, pid); } } return; diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 3acd3a387bcca..bd31a218f4c1f 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -40,6 +40,7 @@ import android.os.Bundle; import android.os.IBinder; import android.os.Process; import android.os.SystemClock; +import android.os.Trace; import android.os.UserHandle; import android.util.ArrayMap; import android.util.PrintWriterPrinter; @@ -536,6 +537,7 @@ final class ProcessRecord { void kill(String reason, boolean noisy) { if (!killedByAm) { + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "kill"); if (noisy) { Slog.i(TAG, "Killing " + toShortString() + " (adj " + setAdj + "): " + reason); } @@ -546,6 +548,7 @@ final class ProcessRecord { killed = true; killedByAm = true; } + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); } }