diff options
4 files changed, 33 insertions, 7 deletions
diff --git a/services/core/java/com/android/server/am/BroadcastQueueImpl.java b/services/core/java/com/android/server/am/BroadcastQueueImpl.java index 4b8dc99c67d9..bd36c3ff6f98 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueImpl.java @@ -835,7 +835,7 @@ public class BroadcastQueueImpl extends BroadcastQueue { OOM_ADJ_REASON_START_RECEIVER); } } else if (filter.receiverList.app != null) { - mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(filter.receiverList.app, + mService.mOomAdjuster.unfreezeTemporarily(filter.receiverList.app, CachedAppOptimizer.UNFREEZE_REASON_START_RECEIVER); } @@ -1129,7 +1129,7 @@ public class BroadcastQueueImpl extends BroadcastQueue { } if (sendResult) { if (r.callerApp != null) { - mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily( + mService.mOomAdjuster.unfreezeTemporarily( r.callerApp, CachedAppOptimizer.UNFREEZE_REASON_FINISH_RECEIVER); } diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index 5010ec03285f..2eeed295b899 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -927,7 +927,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { final ProcessRecord app = r.resultToApp; final IApplicationThread thread = (app != null) ? app.getOnewayThread() : null; if (thread != null) { - mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily( + mService.mOomAdjuster.unfreezeTemporarily( app, CachedAppOptimizer.UNFREEZE_REASON_FINISH_RECEIVER); if (r.shareIdentity && app.uid != r.callingUid) { mService.mPackageManagerInt.grantImplicitAccess(r.userId, r.intent, @@ -1513,7 +1513,7 @@ class BroadcastQueueModernImpl extends BroadcastQueue { mService.updateLruProcessLocked(queue.app, false, null); } - mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(queue.app, + mService.mOomAdjuster.unfreezeTemporarily(queue.app, CachedAppOptimizer.UNFREEZE_REASON_START_RECEIVER); if (queue.runningOomAdjusted) { diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 84a80993c4b2..a86c02d4b826 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -349,6 +349,7 @@ public class OomAdjuster { private final ArrayList<UidRecord> mTmpBecameIdle = new ArrayList<UidRecord>(); private final ActiveUids mTmpUidRecords; private final ArrayDeque<ProcessRecord> mTmpQueue; + private final ArraySet<ProcessRecord> mTmpProcessSet = new ArraySet<>(); private final ArraySet<ProcessRecord> mPendingProcessSet = new ArraySet<>(); private final ArraySet<ProcessRecord> mProcessesInCycle = new ArraySet<>(); @@ -3472,4 +3473,29 @@ public class OomAdjuster { CachedAppOptimizer.getUnfreezeReasonCodeFromOomAdjReason(oomAdjReason)); } } + + @GuardedBy("mService") + void unfreezeTemporarily(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) { + if (!mCachedAppOptimizer.useFreezer()) { + return; + } + + final ProcessCachedOptimizerRecord opt = app.mOptRecord; + if (!opt.isFrozen() && !opt.isPendingFreeze()) { + return; + } + + final ArrayList<ProcessRecord> processes = mTmpProcessList; + final ActiveUids uids = mTmpUidRecords; + mTmpProcessSet.add(app); + collectReachableProcessesLocked(mTmpProcessSet, processes, uids); + mTmpProcessSet.clear(); + // Now processes contains app's downstream and app + final int size = processes.size(); + for (int i = 0; i < size; i++) { + ProcessRecord proc = processes.get(i); + mCachedAppOptimizer.unfreezeTemporarily(proc, reason); + } + processes.clear(); + } } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java index bca39ae64823..b74729b36cd2 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java @@ -222,7 +222,7 @@ public class BroadcastQueueTest { realAms.mActivityTaskManager = new ActivityTaskManagerService(mContext); realAms.mActivityTaskManager.initialize(null, null, mContext.getMainLooper()); realAms.mAtmInternal = spy(realAms.mActivityTaskManager.getAtmInternal()); - realAms.mOomAdjuster.mCachedAppOptimizer = spy(realAms.mOomAdjuster.mCachedAppOptimizer); + realAms.mOomAdjuster = spy(realAms.mOomAdjuster); realAms.mPackageManagerInt = mPackageManagerInt; realAms.mUsageStatsService = mUsageStatsManagerInt; realAms.mProcessesReady = true; @@ -951,7 +951,7 @@ public class BroadcastQueueTest { // cold-started apps to be thawed, but the modern stack does } else { // Confirm that app was thawed - verify(mAms.mOomAdjuster.mCachedAppOptimizer, atLeastOnce()).unfreezeTemporarily( + verify(mAms.mOomAdjuster, atLeastOnce()).unfreezeTemporarily( eq(receiverApp), eq(OomAdjuster.OOM_ADJ_REASON_START_RECEIVER)); // Confirm that we added package to process @@ -1394,7 +1394,7 @@ public class BroadcastQueueTest { anyInt(), any()); // Finally, verify that we thawed the final receiver - verify(mAms.mOomAdjuster.mCachedAppOptimizer).unfreezeTemporarily(eq(callerApp), + verify(mAms.mOomAdjuster).unfreezeTemporarily(eq(callerApp), eq(OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER)); } |