From 4405d8af7fb51342836dd15e5fb106c8d4c8543b Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Wed, 6 Mar 2019 22:09:32 +0800 Subject: [PATCH] Fix incomplete consolidation of kill-all-background It is accidental missed in commit aaef731, the method killPackageProcessesLocked with the most parameters is able to be reused for kill-all-background. Bug: 114117787 Test: Launch some activities and put them in background, Enter command "adb shell am kill-all", logcat should print some logs as "kill all background". Change-Id: I2a5700a36843d369bc5ee165bf6fa4405ea87e87 --- .../server/am/ActivityManagerService.java | 7 +++--- .../com/android/server/am/ProcessList.java | 24 ++++--------------- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index ccb9d82571f73..ade6c82069065 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3949,11 +3949,12 @@ public class ActivityManagerService extends IActivityManager.Stub final long callingId = Binder.clearCallingIdentity(); try { synchronized (this) { - mProcessList.killAllBackgroundProcessesLocked(); - + // Allow memory level to go down (the flag needs to be set before updating oom adj) + // because this method is also used to simulate low memory. mAllowLowerMemLevel = true; + mProcessList.killPackageProcessesLocked(null /* packageName */, -1 /* appId */, + UserHandle.USER_ALL, ProcessList.CACHED_APP_MIN_ADJ, "kill all background"); - updateOomAdjLocked(); doLowMemReportIfNeededLocked(null); } } finally { diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 399b818659a47..e68a999e64334 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -2074,25 +2074,6 @@ public final class ProcessList { } } - void killAllBackgroundProcessesLocked() { - final ArrayList procs = new ArrayList<>(); - final int NP = mProcessNames.getMap().size(); - for (int ip = 0; ip < NP; ip++) { - final SparseArray apps = mProcessNames.getMap().valueAt(ip); - final int NA = apps.size(); - for (int ia = 0; ia < NA; ia++) { - final ProcessRecord app = apps.valueAt(ia); - if (app.isPersistent()) { - // We don't kill persistent processes. - continue; - } - if (app.removed || app.setAdj >= ProcessList.CACHED_APP_MIN_ADJ) { - procs.add(app); - } - } - } - } - @GuardedBy("mService") boolean killPackageProcessesLocked(String packageName, int appId, int userId, int minOomAdj, String reason) { @@ -2129,6 +2110,11 @@ public final class ProcessList { // Skip process if it doesn't meet our oom adj requirement. if (app.setAdj < minOomAdj) { + // Note it is still possible to have a process with oom adj 0 in the killed + // processes, but it does not mean misjudgment. E.g. a bound service process + // and its client activity process are both in the background, so they are + // collected to be killed. If the client activity is killed first, the service + // may be scheduled to unbind and become an executing service (oom adj 0). continue; }