diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f98327b3c1c18..0a80d4505d47b 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3969,11 +3969,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 620fb2cd8553c..d02fd7387f598 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -2085,25 +2085,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) { @@ -2140,6 +2121,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; }