diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 2571205bb3afa..53c6758585cf5 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -1460,6 +1460,12 @@ class ProcessRecord implements WindowProcessListener { if (updateServiceConnectionActivities) { mService.mServices.updateServiceConnectionActivitiesLocked(this); } + if (thread == null) { + // Only update lru and oom-adj if the process is alive. Because it may be called + // when cleaning up the last activity from handling process died, the dead process + // should not be added to lru list again. + return; + } mService.mProcessList.updateLruProcessLocked(this, activityChange, null /* client */); if (updateOomAdj) { mService.updateOomAdjLocked(this, OomAdjuster.OOM_ADJ_REASON_ACTIVITY); diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index e8a7a9c1df92b..2e7905c64049e 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -1257,20 +1257,27 @@ public class WindowProcessController extends ConfigurationContainer activities = + (mHasActivities || hasInactiveActivities) ? new ArrayList<>() : mActivities; + if (mHasActivities) { + activities.addAll(mActivities); + } + if (hasInactiveActivities) { // Make sure that all activities in this process are handled. - mActivities.addAll(mInactiveActivities); + activities.addAll(mInactiveActivities); } if (isRemoved()) { // The package of the died process should be force-stopped, so make its activities as // finishing to prevent the process from being started again if the next top (or being // visible) activity also resides in the same process. This must be done before removal. - for (int i = mActivities.size() - 1; i >= 0; i--) { - mActivities.get(i).makeFinishingLocked(); + for (int i = activities.size() - 1; i >= 0; i--) { + activities.get(i).makeFinishingLocked(); } } - for (int i = mActivities.size() - 1; i >= 0; i--) { - final ActivityRecord r = mActivities.get(i); + for (int i = activities.size() - 1; i >= 0; i--) { + final ActivityRecord r = activities.get(i); if (r.mVisibleRequested || r.isVisible()) { // While an activity launches a new activity, it's possible that the old activity // is already requested to be hidden (mVisibleRequested=false), but this visibility