@@ -407,6 +407,12 @@ abstract class ForegroundToken implements IBinder.DeathRecipient {
407407 */
408408 ProcessRecord mHomeProcess;
409409
410+ /**
411+ * This is the process holding the activity the user last visited that
412+ * is in a different process from the one they are currently in.
413+ */
414+ ProcessRecord mPreviousProcess;
415+
410416 /**
411417 * Packages that the user has asked to have run in screen size
412418 * compatibility mode instead of filling the screen.
@@ -8114,6 +8120,7 @@ boolean dumpProcessesLocked(FileDescriptor fd, PrintWriter pw, String[] args,
81148120
81158121 pw.println();
81168122 pw.println(" mHomeProcess: " + mHomeProcess);
8123+ pw.println(" mPreviousProcess: " + mPreviousProcess);
81178124 if (mHeavyWeightProcess != null) {
81188125 pw.println(" mHeavyWeightProcess: " + mHeavyWeightProcess);
81198126 }
@@ -8212,6 +8219,7 @@ boolean dumpOomLocked(FileDescriptor fd, PrintWriter pw, String[] args,
82128219 pw.print(" BACKUP_APP_ADJ: "); pw.println(ProcessList.BACKUP_APP_ADJ);
82138220 pw.print(" SERVICE_ADJ: "); pw.println(ProcessList.SERVICE_ADJ);
82148221 pw.print(" HOME_APP_ADJ: "); pw.println(ProcessList.HOME_APP_ADJ);
8222+ pw.print(" PREVIOUS_APP_ADJ: "); pw.println(ProcessList.PREVIOUS_APP_ADJ);
82158223 pw.print(" SERVICE_B_ADJ: "); pw.println(ProcessList.SERVICE_B_ADJ);
82168224 pw.print(" HIDDEN_APP_MIN_ADJ: "); pw.println(ProcessList.HIDDEN_APP_MIN_ADJ);
82178225 pw.print(" HIDDEN_APP_MAX_ADJ: "); pw.println(ProcessList.HIDDEN_APP_MAX_ADJ);
@@ -8228,6 +8236,7 @@ boolean dumpOomLocked(FileDescriptor fd, PrintWriter pw, String[] args,
82288236
82298237 pw.println();
82308238 pw.println(" mHomeProcess: " + mHomeProcess);
8239+ pw.println(" mPreviousProcess: " + mPreviousProcess);
82318240 if (mHeavyWeightProcess != null) {
82328241 pw.println(" mHeavyWeightProcess: " + mHeavyWeightProcess);
82338242 }
@@ -9009,6 +9018,8 @@ public int compare(Pair<ProcessRecord, Integer> object1,
90099018 oomAdj = buildOomTag("bak", " ", r.setAdj, ProcessList.HIDDEN_APP_MIN_ADJ);
90109019 } else if (r.setAdj >= ProcessList.SERVICE_B_ADJ) {
90119020 oomAdj = buildOomTag("svcb ", null, r.setAdj, ProcessList.SERVICE_B_ADJ);
9021+ } else if (r.setAdj >= ProcessList.PREVIOUS_APP_ADJ) {
9022+ oomAdj = buildOomTag("prev ", null, r.setAdj, ProcessList.PREVIOUS_APP_ADJ);
90129023 } else if (r.setAdj >= ProcessList.HOME_APP_ADJ) {
90139024 oomAdj = buildOomTag("home ", null, r.setAdj, ProcessList.HOME_APP_ADJ);
90149025 } else if (r.setAdj >= ProcessList.SERVICE_ADJ) {
@@ -9287,12 +9298,13 @@ final void dumpApplicationMemoryUsage(FileDescriptor fd,
92879298 ProcessList.SYSTEM_ADJ, ProcessList.PERSISTENT_PROC_ADJ, ProcessList.FOREGROUND_APP_ADJ,
92889299 ProcessList.VISIBLE_APP_ADJ, ProcessList.PERCEPTIBLE_APP_ADJ, ProcessList.HEAVY_WEIGHT_APP_ADJ,
92899300 ProcessList.BACKUP_APP_ADJ, ProcessList.SERVICE_ADJ, ProcessList.HOME_APP_ADJ,
9290- ProcessList.SERVICE_B_ADJ, ProcessList.HIDDEN_APP_MAX_ADJ
9301+ ProcessList.PREVIOUS_APP_ADJ, ProcessList. SERVICE_B_ADJ, ProcessList.HIDDEN_APP_MAX_ADJ
92919302 };
92929303 final String[] oomLabel = new String[] {
92939304 "System", "Persistent", "Foreground",
92949305 "Visible", "Perceptible", "Heavy Weight",
9295- "Backup", "A Services", "Home", "B Services", "Background"
9306+ "Backup", "A Services", "Home", "Previous",
9307+ "B Services", "Background"
92969308 };
92979309 long oomPss[] = new long[oomLabel.length];
92989310 ArrayList<MemItem>[] oomProcs = (ArrayList<MemItem>[])new ArrayList[oomLabel.length];
@@ -9714,7 +9726,10 @@ private final void cleanUpApplicationRecordLocked(ProcessRecord app,
97149726 if (app == mHomeProcess) {
97159727 mHomeProcess = null;
97169728 }
9717-
9729+ if (app == mPreviousProcess) {
9730+ mPreviousProcess = null;
9731+ }
9732+
97189733 if (restart) {
97199734 // We have components that still need to be running in the
97209735 // process, so re-launch it.
@@ -13112,6 +13127,17 @@ private final int computeOomAdjLocked(ProcessRecord app, int hiddenAdj,
1311213127 app.adjType = "home";
1311313128 }
1311413129
13130+ if (adj > ProcessList.PREVIOUS_APP_ADJ && app == mPreviousProcess
13131+ && app.activities.size() > 0) {
13132+ // This was the previous process that showed UI to the user.
13133+ // We want to try to keep it around more aggressively, to give
13134+ // a good experience around switching between two apps.
13135+ adj = ProcessList.PREVIOUS_APP_ADJ;
13136+ schedGroup = Process.THREAD_GROUP_BG_NONINTERACTIVE;
13137+ app.hidden = false;
13138+ app.adjType = "previous";
13139+ }
13140+
1311513141 if (false) Slog.i(TAG, "OOM " + app + ": initial adj=" + adj
1311613142 + " reason=" + app.adjType);
1311713143
@@ -13841,7 +13867,8 @@ final void updateOomAdjLocked() {
1384113867 } else {
1384213868 numBg++;
1384313869 }
13844- } else if (app.curAdj >= ProcessList.HOME_APP_ADJ) {
13870+ } else if (app.curAdj >= ProcessList.HOME_APP_ADJ
13871+ && app.curAdj != ProcessList.SERVICE_B_ADJ) {
1384513872 numBg++;
1384613873 }
1384713874 }
0 commit comments