diff options
| -rw-r--r-- | services/java/com/android/server/am/ActiveServices.java | 10 | ||||
| -rw-r--r-- | services/java/com/android/server/am/ProcessStatsService.java | 9 |
2 files changed, 16 insertions, 3 deletions
diff --git a/services/java/com/android/server/am/ActiveServices.java b/services/java/com/android/server/am/ActiveServices.java index b75eab4e02b3..37fbb139a7e5 100644 --- a/services/java/com/android/server/am/ActiveServices.java +++ b/services/java/com/android/server/am/ActiveServices.java @@ -299,11 +299,17 @@ public final class ActiveServices { boolean addToStarting = false; if (!callerFg && r.app == null && mAm.mStartedUsers.get(r.userId) != null) { ProcessRecord proc = mAm.getProcessRecordLocked(r.processName, r.appInfo.uid); - if (proc == null || proc.curProcState >= ActivityManager.PROCESS_STATE_RECEIVER) { + if (proc == null || proc.curProcState > ActivityManager.PROCESS_STATE_RECEIVER) { // If this is not coming from a foreground caller, then we may want // to delay the start if there are already other background services // that are starting. This is to avoid process start spam when lots // of applications are all handling things like connectivity broadcasts. + // We only do this for cached processes, because otherwise an application + // can have assumptions about calling startService() for a service to run + // in its own process, and for that process to not be killed before the + // service is started. This is especially the case for receivers, which + // may start a service in onReceive() to do some additional work and have + // initialized some global state as part of that. if (DEBUG_DELAYED_SERVICE) Slog.v(TAG, "Potential start delay of " + r + " in " + proc); if (r.delayed) { @@ -324,7 +330,7 @@ public final class ActiveServices { } else if (proc.curProcState >= ActivityManager.PROCESS_STATE_SERVICE) { // We slightly loosen when we will enqueue this new service as a background // starting service we are waiting for, to also include processes that are - // currently running other services. + // currently running other services or receivers. addToStarting = true; if (DEBUG_DELAYED_STATS) Slog.v(TAG, "Not delaying, but counting as bg: " + r); } else if (DEBUG_DELAYED_STATS) { diff --git a/services/java/com/android/server/am/ProcessStatsService.java b/services/java/com/android/server/am/ProcessStatsService.java index f5f43ab29548..582e11e5b3f8 100644 --- a/services/java/com/android/server/am/ProcessStatsService.java +++ b/services/java/com/android/server/am/ProcessStatsService.java @@ -445,7 +445,7 @@ public final class ProcessStatsService extends IProcessStats.Stub { static private void dumpHelp(PrintWriter pw) { pw.println("Process stats (procstats) dump options:"); pw.println(" [--checkin|-c|--csv] [--csv-screen] [--csv-proc] [--csv-mem]"); - pw.println(" [--details] [--current] [--commit] [--write] [-h] [<package.name>]"); + pw.println(" [--details] [--current] [--commit] [--reset] [--write] [-h] [<package.name>]"); pw.println(" --checkin: perform a checkin: print and delete old committed states."); pw.println(" --c: print only state in checkin format."); pw.println(" --csv: output data suitable for putting in a spreadsheet."); @@ -456,6 +456,7 @@ public final class ProcessStatsService extends IProcessStats.Stub { pw.println(" --details: dump all execution details, not just summary."); pw.println(" --current: only dump current state."); pw.println(" --commit: commit current stats to disk and reset to start new stats."); + pw.println(" --reset: reset current stats, without committing."); pw.println(" --write: write current in-memory stats to disk."); pw.println(" --read: replace current stats with last-written stats."); pw.println(" -a: print everything."); @@ -557,6 +558,12 @@ public final class ProcessStatsService extends IProcessStats.Stub { pw.println("Process stats committed."); } return; + } else if ("--reset".equals(arg)) { + synchronized (mAm) { + mProcessStats.resetSafely(); + pw.println("Process stats reset."); + } + return; } else if ("--write".equals(arg)) { synchronized (mAm) { writeStateSyncLocked(); |