Loading services/core/java/com/android/server/am/ActivityManagerService.java +2 −1 Original line number Diff line number Diff line Loading @@ -17507,7 +17507,8 @@ public class ActivityManagerService extends IActivityManager.Stub // sends to the activity. After this race issue between WM/ATMS and AMS is solved, this // workaround can be removed. (b/213288355) if (isNewPending) { mOomAdjuster.mCachedAppOptimizer.unfreezeProcess(pid); mOomAdjuster.mCachedAppOptimizer.unfreezeProcess(pid, OomAdjuster.OOM_ADJ_REASON_ACTIVITY); } // We need to update the network rules for the app coming to the top state so that // it can access network when the device or the app is in a restricted state services/core/java/com/android/server/am/BroadcastQueue.java +8 −5 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BROADCAST; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_MU; import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER; import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_START_RECEIVER; import android.annotation.NonNull; Loading Loading @@ -348,7 +350,7 @@ public final class BroadcastQueue { // Force an update, even if there are other pending requests, overall it still saves time, // because time(updateOomAdj(N apps)) <= N * time(updateOomAdj(1 app)). mService.enqueueOomAdjTargetLocked(app); mService.updateOomAdjPendingTargetsLocked(OomAdjuster.OOM_ADJ_REASON_START_RECEIVER); mService.updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_START_RECEIVER); // Tell the application to launch this receiver. maybeReportBroadcastDispatchedEventLocked(r, r.curReceiver.applicationInfo.uid); Loading Loading @@ -976,10 +978,11 @@ public final class BroadcastQueue { filter.receiverList.app.mReceivers.addCurReceiver(r); mService.enqueueOomAdjTargetLocked(r.curApp); mService.updateOomAdjPendingTargetsLocked( OomAdjuster.OOM_ADJ_REASON_START_RECEIVER); OOM_ADJ_REASON_START_RECEIVER); } } else if (filter.receiverList.app != null) { mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(filter.receiverList.app); mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(filter.receiverList.app, OOM_ADJ_REASON_START_RECEIVER); } try { Loading Loading @@ -1263,7 +1266,7 @@ public final class BroadcastQueue { // make sure all processes have correct oom and sched // adjustments. mService.updateOomAdjPendingTargetsLocked( OomAdjuster.OOM_ADJ_REASON_START_RECEIVER); OOM_ADJ_REASON_START_RECEIVER); } // when we have no more ordered broadcast on this queue, stop logging Loading Loading @@ -1345,7 +1348,7 @@ public final class BroadcastQueue { if (sendResult) { if (r.callerApp != null) { mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily( r.callerApp); r.callerApp, OOM_ADJ_REASON_FINISH_RECEIVER); } try { if (DEBUG_BROADCAST) { Loading services/core/java/com/android/server/am/CachedAppOptimizer.java +54 −28 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import android.provider.DeviceConfig.Properties; import android.provider.Settings; import android.text.TextUtils; import android.util.EventLog; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; Loading Loading @@ -904,7 +905,7 @@ public final class CachedAppOptimizer { } if (!enable && opt.isFrozen()) { unfreezeAppLSP(process); unfreezeAppLSP(process, OomAdjuster.OOM_ADJ_REASON_NONE); // Set freezerOverride *after* calling unfreezeAppLSP (it resets the flag) opt.setFreezerOverride(true); Loading Loading @@ -1214,11 +1215,11 @@ public final class CachedAppOptimizer { // This will ensure app will be out of the freezer for at least mFreezerDebounceTimeout. @GuardedBy("mAm") void unfreezeTemporarily(ProcessRecord app) { void unfreezeTemporarily(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) { if (mUseFreezer) { synchronized (mProcLock) { if (app.mOptRecord.isFrozen() || app.mOptRecord.isPendingFreeze()) { unfreezeAppLSP(app); unfreezeAppLSP(app, reason); freezeAppAsyncLSP(app); } } Loading @@ -1244,7 +1245,7 @@ public final class CachedAppOptimizer { } @GuardedBy({"mAm", "mProcLock", "mFreezerLock"}) void unfreezeAppInternalLSP(ProcessRecord app) { void unfreezeAppInternalLSP(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) { final int pid = app.getPid(); final ProcessCachedOptimizerRecord opt = app.mOptRecord; if (opt.isPendingFreeze()) { Loading Loading @@ -1325,14 +1326,14 @@ public final class CachedAppOptimizer { mFreezeHandler.obtainMessage(REPORT_UNFREEZE_MSG, pid, (int) Math.min(opt.getFreezeUnfreezeTime() - freezeTime, Integer.MAX_VALUE), app.processName)); new Pair<String, Integer>(app.processName, reason))); } } @GuardedBy({"mAm", "mProcLock"}) void unfreezeAppLSP(ProcessRecord app) { void unfreezeAppLSP(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) { synchronized (mFreezerLock) { unfreezeAppInternalLSP(app); unfreezeAppInternalLSP(app, reason); } } Loading @@ -1343,25 +1344,14 @@ public final class CachedAppOptimizer { * The caller of this function should still trigger updateOomAdj for AMS to unfreeze the app. * @param pid pid of the process to be unfrozen */ void unfreezeProcess(int pid) { void unfreezeProcess(int pid, @OomAdjuster.OomAdjReason int reason) { synchronized (mFreezerLock) { ProcessRecord app = mFrozenProcesses.get(pid); if (app == null) { return; } Slog.d(TAG_AM, "quick sync unfreeze " + pid); try { freezeBinder(pid, false); } catch (RuntimeException e) { Slog.e(TAG_AM, "Unable to quick unfreeze binder for " + pid); return; } try { Process.setProcessFrozen(pid, app.uid, false); } catch (Exception e) { Slog.e(TAG_AM, "Unable to quick unfreeze " + pid); } unfreezeAppLSP(app, reason); } } Loading Loading @@ -1880,9 +1870,11 @@ public final class CachedAppOptimizer { case REPORT_UNFREEZE_MSG: int pid = msg.arg1; int frozenDuration = msg.arg2; String processName = (String) msg.obj; Pair<String, Integer> obj = (Pair<String, Integer>) msg.obj; String processName = obj.first; int reason = obj.second; reportUnfreeze(pid, frozenDuration, processName); reportUnfreeze(pid, frozenDuration, processName, reason); break; default: return; Loading @@ -1893,7 +1885,7 @@ public final class CachedAppOptimizer { private void rescheduleFreeze(final ProcessRecord proc, final String reason) { Slog.d(TAG_AM, "Reschedule freeze for process " + proc.getPid() + " " + proc.processName + " (" + reason + ")"); unfreezeAppLSP(proc); unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE); freezeAppAsyncLSP(proc); } Loading Loading @@ -1981,7 +1973,8 @@ public final class CachedAppOptimizer { FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__FREEZE_APP, pid, name, unfrozenDuration); unfrozenDuration, FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE); } try { Loading Loading @@ -2011,12 +2004,13 @@ public final class CachedAppOptimizer { } catch (Exception e) { Slog.e(TAG_AM, "Unable to check file locks for " + name + "(" + pid + "): " + e); synchronized (mProcLock) { unfreezeAppLSP(proc); unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE); } } } private void reportUnfreeze(int pid, int frozenDuration, String processName) { private void reportUnfreeze(int pid, int frozenDuration, String processName, @OomAdjuster.OomAdjReason int reason) { EventLog.writeEvent(EventLogTags.AM_UNFREEZE, pid, processName); Loading @@ -2027,7 +2021,39 @@ public final class CachedAppOptimizer { FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__UNFREEZE_APP, pid, processName, frozenDuration); frozenDuration, getUnfreezeReasonCode(reason)); } } private int getUnfreezeReasonCode(@OomAdjuster.OomAdjReason int oomAdjReason) { switch (oomAdjReason) { case OomAdjuster.OOM_ADJ_REASON_ACTIVITY: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__ACTIVITY; case OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__FINISH_RECEIVER; case OomAdjuster.OOM_ADJ_REASON_START_RECEIVER: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__START_RECEIVER; case OomAdjuster.OOM_ADJ_REASON_BIND_SERVICE: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__BIND_SERVICE; case OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__UNBIND_SERVICE; case OomAdjuster.OOM_ADJ_REASON_START_SERVICE: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__START_SERVICE; case OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__GET_PROVIDER; case OomAdjuster.OOM_ADJ_REASON_REMOVE_PROVIDER: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__REMOVE_PROVIDER; case OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__UI_VISIBILITY; case OomAdjuster.OOM_ADJ_REASON_ALLOWLIST: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__ALLOWLIST; case OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__PROCESS_BEGIN; case OomAdjuster.OOM_ADJ_REASON_PROCESS_END: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__PROCESS_END; default: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE; } } Loading @@ -2041,7 +2067,7 @@ public final class CachedAppOptimizer { ProcessRecord app = mFrozenProcesses.get(pid); if (app != null) { Slog.i(TAG_AM, app.processName + " (" + pid + ") holds blocking file lock"); unfreezeAppLSP(app); unfreezeAppLSP(app, OomAdjuster.OOM_ADJ_REASON_NONE); } } } Loading services/core/java/com/android/server/am/OomAdjuster.java +13 −12 Original line number Diff line number Diff line Loading @@ -448,7 +448,7 @@ public class OomAdjuster { */ @GuardedBy({"mService", "mProcLock"}) private boolean performUpdateOomAdjLSP(ProcessRecord app, int cachedAdj, ProcessRecord topApp, long now) { ProcessRecord topApp, long now, @OomAdjReason int oomAdjReason) { if (app.getThread() == null) { return false; } Loading Loading @@ -492,7 +492,7 @@ public class OomAdjuster { } } return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime()); return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime(), oomAdjReason); } /** Loading Loading @@ -592,7 +592,7 @@ public class OomAdjuster { mPendingProcessSet.remove(app); app.mOptRecord.setLastOomAdjChangeReason(oomAdjReason); boolean success = performUpdateOomAdjLSP(app, cachedAdj, topApp, SystemClock.uptimeMillis()); SystemClock.uptimeMillis(), oomAdjReason); // The 'app' here itself might or might not be in the cycle, for example, // the case A <=> B vs. A -> B <=> C; anyway, if we spot a cycle here, re-compute them. if (!success || (wasCached == state.isCached() && oldAdj != ProcessList.INVALID_ADJ Loading Loading @@ -645,7 +645,7 @@ public class OomAdjuster { processes.add(app); assignCachedAdjIfNecessary(processes); applyOomAdjLSP(app, false, SystemClock.uptimeMillis(), SystemClock.elapsedRealtime()); SystemClock.elapsedRealtime(), oomAdjReason); } mTmpProcessList.clear(); mService.mOomAdjProfiler.oomAdjEnded(); Loading Loading @@ -941,7 +941,8 @@ public class OomAdjuster { mNumNonCachedProcs = 0; mNumCachedHiddenProcs = 0; boolean allChanged = updateAndTrimProcessLSP(now, nowElapsed, oldTime, activeUids); boolean allChanged = updateAndTrimProcessLSP(now, nowElapsed, oldTime, activeUids, oomAdjReason); mNumServiceProcs = mNewNumServiceProcs; if (mService.mAlwaysFinishActivities) { Loading Loading @@ -1119,7 +1120,7 @@ public class OomAdjuster { @GuardedBy({"mService", "mProcLock"}) private boolean updateAndTrimProcessLSP(final long now, final long nowElapsed, final long oldTime, final ActiveUids activeUids) { final long oldTime, final ActiveUids activeUids, @OomAdjReason int oomAdjReason) { ArrayList<ProcessRecord> lruList = mProcessList.getLruProcessesLOSP(); final int numLru = lruList.size(); Loading Loading @@ -1147,7 +1148,7 @@ public class OomAdjuster { if (!app.isKilledByAm() && app.getThread() != null) { // We don't need to apply the update for the process which didn't get computed if (state.getCompletedAdjSeq() == mAdjSeq) { applyOomAdjLSP(app, true, now, nowElapsed); applyOomAdjLSP(app, true, now, nowElapsed, oomAdjReason); } final ProcessServiceRecord psr = app.mServices; Loading Loading @@ -2640,7 +2641,7 @@ public class OomAdjuster { /** Applies the computed oomadj, procstate and sched group values and freezes them in set* */ @GuardedBy({"mService", "mProcLock"}) private boolean applyOomAdjLSP(ProcessRecord app, boolean doingAll, long now, long nowElapsed) { long nowElapsed, @OomAdjReason int oomAdjReson) { boolean success = true; final ProcessStateRecord state = app.mState; final UidRecord uidRec = app.getUidRecord(); Loading Loading @@ -2799,7 +2800,7 @@ public class OomAdjuster { changes |= ActivityManagerService.ProcessChangeItem.CHANGE_ACTIVITIES; } updateAppFreezeStateLSP(app); updateAppFreezeStateLSP(app, oomAdjReson); if (state.getReportedProcState() != state.getCurProcState()) { state.setReportedProcState(state.getCurProcState()); Loading Loading @@ -3160,7 +3161,7 @@ public class OomAdjuster { } @GuardedBy({"mService", "mProcLock"}) private void updateAppFreezeStateLSP(ProcessRecord app) { private void updateAppFreezeStateLSP(ProcessRecord app, @OomAdjReason int oomAdjReason) { if (!mCachedAppOptimizer.useFreezer()) { return; } Loading @@ -3172,7 +3173,7 @@ public class OomAdjuster { final ProcessCachedOptimizerRecord opt = app.mOptRecord; // if an app is already frozen and shouldNotFreeze becomes true, immediately unfreeze if (opt.isFrozen() && opt.shouldNotFreeze()) { mCachedAppOptimizer.unfreezeAppLSP(app); mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason); return; } Loading @@ -3182,7 +3183,7 @@ public class OomAdjuster { && !opt.shouldNotFreeze()) { mCachedAppOptimizer.freezeAppAsyncLSP(app); } else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ) { mCachedAppOptimizer.unfreezeAppLSP(app); mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason); } } } Loading
services/core/java/com/android/server/am/ActivityManagerService.java +2 −1 Original line number Diff line number Diff line Loading @@ -17507,7 +17507,8 @@ public class ActivityManagerService extends IActivityManager.Stub // sends to the activity. After this race issue between WM/ATMS and AMS is solved, this // workaround can be removed. (b/213288355) if (isNewPending) { mOomAdjuster.mCachedAppOptimizer.unfreezeProcess(pid); mOomAdjuster.mCachedAppOptimizer.unfreezeProcess(pid, OomAdjuster.OOM_ADJ_REASON_ACTIVITY); } // We need to update the network rules for the app coming to the top state so that // it can access network when the device or the app is in a restricted state
services/core/java/com/android/server/am/BroadcastQueue.java +8 −5 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BROADCAST; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_MU; import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER; import static com.android.server.am.OomAdjuster.OOM_ADJ_REASON_START_RECEIVER; import android.annotation.NonNull; Loading Loading @@ -348,7 +350,7 @@ public final class BroadcastQueue { // Force an update, even if there are other pending requests, overall it still saves time, // because time(updateOomAdj(N apps)) <= N * time(updateOomAdj(1 app)). mService.enqueueOomAdjTargetLocked(app); mService.updateOomAdjPendingTargetsLocked(OomAdjuster.OOM_ADJ_REASON_START_RECEIVER); mService.updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_START_RECEIVER); // Tell the application to launch this receiver. maybeReportBroadcastDispatchedEventLocked(r, r.curReceiver.applicationInfo.uid); Loading Loading @@ -976,10 +978,11 @@ public final class BroadcastQueue { filter.receiverList.app.mReceivers.addCurReceiver(r); mService.enqueueOomAdjTargetLocked(r.curApp); mService.updateOomAdjPendingTargetsLocked( OomAdjuster.OOM_ADJ_REASON_START_RECEIVER); OOM_ADJ_REASON_START_RECEIVER); } } else if (filter.receiverList.app != null) { mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(filter.receiverList.app); mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily(filter.receiverList.app, OOM_ADJ_REASON_START_RECEIVER); } try { Loading Loading @@ -1263,7 +1266,7 @@ public final class BroadcastQueue { // make sure all processes have correct oom and sched // adjustments. mService.updateOomAdjPendingTargetsLocked( OomAdjuster.OOM_ADJ_REASON_START_RECEIVER); OOM_ADJ_REASON_START_RECEIVER); } // when we have no more ordered broadcast on this queue, stop logging Loading Loading @@ -1345,7 +1348,7 @@ public final class BroadcastQueue { if (sendResult) { if (r.callerApp != null) { mService.mOomAdjuster.mCachedAppOptimizer.unfreezeTemporarily( r.callerApp); r.callerApp, OOM_ADJ_REASON_FINISH_RECEIVER); } try { if (DEBUG_BROADCAST) { Loading
services/core/java/com/android/server/am/CachedAppOptimizer.java +54 −28 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ import android.provider.DeviceConfig.Properties; import android.provider.Settings; import android.text.TextUtils; import android.util.EventLog; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; Loading Loading @@ -904,7 +905,7 @@ public final class CachedAppOptimizer { } if (!enable && opt.isFrozen()) { unfreezeAppLSP(process); unfreezeAppLSP(process, OomAdjuster.OOM_ADJ_REASON_NONE); // Set freezerOverride *after* calling unfreezeAppLSP (it resets the flag) opt.setFreezerOverride(true); Loading Loading @@ -1214,11 +1215,11 @@ public final class CachedAppOptimizer { // This will ensure app will be out of the freezer for at least mFreezerDebounceTimeout. @GuardedBy("mAm") void unfreezeTemporarily(ProcessRecord app) { void unfreezeTemporarily(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) { if (mUseFreezer) { synchronized (mProcLock) { if (app.mOptRecord.isFrozen() || app.mOptRecord.isPendingFreeze()) { unfreezeAppLSP(app); unfreezeAppLSP(app, reason); freezeAppAsyncLSP(app); } } Loading @@ -1244,7 +1245,7 @@ public final class CachedAppOptimizer { } @GuardedBy({"mAm", "mProcLock", "mFreezerLock"}) void unfreezeAppInternalLSP(ProcessRecord app) { void unfreezeAppInternalLSP(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) { final int pid = app.getPid(); final ProcessCachedOptimizerRecord opt = app.mOptRecord; if (opt.isPendingFreeze()) { Loading Loading @@ -1325,14 +1326,14 @@ public final class CachedAppOptimizer { mFreezeHandler.obtainMessage(REPORT_UNFREEZE_MSG, pid, (int) Math.min(opt.getFreezeUnfreezeTime() - freezeTime, Integer.MAX_VALUE), app.processName)); new Pair<String, Integer>(app.processName, reason))); } } @GuardedBy({"mAm", "mProcLock"}) void unfreezeAppLSP(ProcessRecord app) { void unfreezeAppLSP(ProcessRecord app, @OomAdjuster.OomAdjReason int reason) { synchronized (mFreezerLock) { unfreezeAppInternalLSP(app); unfreezeAppInternalLSP(app, reason); } } Loading @@ -1343,25 +1344,14 @@ public final class CachedAppOptimizer { * The caller of this function should still trigger updateOomAdj for AMS to unfreeze the app. * @param pid pid of the process to be unfrozen */ void unfreezeProcess(int pid) { void unfreezeProcess(int pid, @OomAdjuster.OomAdjReason int reason) { synchronized (mFreezerLock) { ProcessRecord app = mFrozenProcesses.get(pid); if (app == null) { return; } Slog.d(TAG_AM, "quick sync unfreeze " + pid); try { freezeBinder(pid, false); } catch (RuntimeException e) { Slog.e(TAG_AM, "Unable to quick unfreeze binder for " + pid); return; } try { Process.setProcessFrozen(pid, app.uid, false); } catch (Exception e) { Slog.e(TAG_AM, "Unable to quick unfreeze " + pid); } unfreezeAppLSP(app, reason); } } Loading Loading @@ -1880,9 +1870,11 @@ public final class CachedAppOptimizer { case REPORT_UNFREEZE_MSG: int pid = msg.arg1; int frozenDuration = msg.arg2; String processName = (String) msg.obj; Pair<String, Integer> obj = (Pair<String, Integer>) msg.obj; String processName = obj.first; int reason = obj.second; reportUnfreeze(pid, frozenDuration, processName); reportUnfreeze(pid, frozenDuration, processName, reason); break; default: return; Loading @@ -1893,7 +1885,7 @@ public final class CachedAppOptimizer { private void rescheduleFreeze(final ProcessRecord proc, final String reason) { Slog.d(TAG_AM, "Reschedule freeze for process " + proc.getPid() + " " + proc.processName + " (" + reason + ")"); unfreezeAppLSP(proc); unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE); freezeAppAsyncLSP(proc); } Loading Loading @@ -1981,7 +1973,8 @@ public final class CachedAppOptimizer { FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__FREEZE_APP, pid, name, unfrozenDuration); unfrozenDuration, FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE); } try { Loading Loading @@ -2011,12 +2004,13 @@ public final class CachedAppOptimizer { } catch (Exception e) { Slog.e(TAG_AM, "Unable to check file locks for " + name + "(" + pid + "): " + e); synchronized (mProcLock) { unfreezeAppLSP(proc); unfreezeAppLSP(proc, OomAdjuster.OOM_ADJ_REASON_NONE); } } } private void reportUnfreeze(int pid, int frozenDuration, String processName) { private void reportUnfreeze(int pid, int frozenDuration, String processName, @OomAdjuster.OomAdjReason int reason) { EventLog.writeEvent(EventLogTags.AM_UNFREEZE, pid, processName); Loading @@ -2027,7 +2021,39 @@ public final class CachedAppOptimizer { FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__UNFREEZE_APP, pid, processName, frozenDuration); frozenDuration, getUnfreezeReasonCode(reason)); } } private int getUnfreezeReasonCode(@OomAdjuster.OomAdjReason int oomAdjReason) { switch (oomAdjReason) { case OomAdjuster.OOM_ADJ_REASON_ACTIVITY: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__ACTIVITY; case OomAdjuster.OOM_ADJ_REASON_FINISH_RECEIVER: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__FINISH_RECEIVER; case OomAdjuster.OOM_ADJ_REASON_START_RECEIVER: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__START_RECEIVER; case OomAdjuster.OOM_ADJ_REASON_BIND_SERVICE: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__BIND_SERVICE; case OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__UNBIND_SERVICE; case OomAdjuster.OOM_ADJ_REASON_START_SERVICE: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__START_SERVICE; case OomAdjuster.OOM_ADJ_REASON_GET_PROVIDER: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__GET_PROVIDER; case OomAdjuster.OOM_ADJ_REASON_REMOVE_PROVIDER: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__REMOVE_PROVIDER; case OomAdjuster.OOM_ADJ_REASON_UI_VISIBILITY: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__UI_VISIBILITY; case OomAdjuster.OOM_ADJ_REASON_ALLOWLIST: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__ALLOWLIST; case OomAdjuster.OOM_ADJ_REASON_PROCESS_BEGIN: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__PROCESS_BEGIN; case OomAdjuster.OOM_ADJ_REASON_PROCESS_END: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__PROCESS_END; default: return FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE; } } Loading @@ -2041,7 +2067,7 @@ public final class CachedAppOptimizer { ProcessRecord app = mFrozenProcesses.get(pid); if (app != null) { Slog.i(TAG_AM, app.processName + " (" + pid + ") holds blocking file lock"); unfreezeAppLSP(app); unfreezeAppLSP(app, OomAdjuster.OOM_ADJ_REASON_NONE); } } } Loading
services/core/java/com/android/server/am/OomAdjuster.java +13 −12 Original line number Diff line number Diff line Loading @@ -448,7 +448,7 @@ public class OomAdjuster { */ @GuardedBy({"mService", "mProcLock"}) private boolean performUpdateOomAdjLSP(ProcessRecord app, int cachedAdj, ProcessRecord topApp, long now) { ProcessRecord topApp, long now, @OomAdjReason int oomAdjReason) { if (app.getThread() == null) { return false; } Loading Loading @@ -492,7 +492,7 @@ public class OomAdjuster { } } return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime()); return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime(), oomAdjReason); } /** Loading Loading @@ -592,7 +592,7 @@ public class OomAdjuster { mPendingProcessSet.remove(app); app.mOptRecord.setLastOomAdjChangeReason(oomAdjReason); boolean success = performUpdateOomAdjLSP(app, cachedAdj, topApp, SystemClock.uptimeMillis()); SystemClock.uptimeMillis(), oomAdjReason); // The 'app' here itself might or might not be in the cycle, for example, // the case A <=> B vs. A -> B <=> C; anyway, if we spot a cycle here, re-compute them. if (!success || (wasCached == state.isCached() && oldAdj != ProcessList.INVALID_ADJ Loading Loading @@ -645,7 +645,7 @@ public class OomAdjuster { processes.add(app); assignCachedAdjIfNecessary(processes); applyOomAdjLSP(app, false, SystemClock.uptimeMillis(), SystemClock.elapsedRealtime()); SystemClock.elapsedRealtime(), oomAdjReason); } mTmpProcessList.clear(); mService.mOomAdjProfiler.oomAdjEnded(); Loading Loading @@ -941,7 +941,8 @@ public class OomAdjuster { mNumNonCachedProcs = 0; mNumCachedHiddenProcs = 0; boolean allChanged = updateAndTrimProcessLSP(now, nowElapsed, oldTime, activeUids); boolean allChanged = updateAndTrimProcessLSP(now, nowElapsed, oldTime, activeUids, oomAdjReason); mNumServiceProcs = mNewNumServiceProcs; if (mService.mAlwaysFinishActivities) { Loading Loading @@ -1119,7 +1120,7 @@ public class OomAdjuster { @GuardedBy({"mService", "mProcLock"}) private boolean updateAndTrimProcessLSP(final long now, final long nowElapsed, final long oldTime, final ActiveUids activeUids) { final long oldTime, final ActiveUids activeUids, @OomAdjReason int oomAdjReason) { ArrayList<ProcessRecord> lruList = mProcessList.getLruProcessesLOSP(); final int numLru = lruList.size(); Loading Loading @@ -1147,7 +1148,7 @@ public class OomAdjuster { if (!app.isKilledByAm() && app.getThread() != null) { // We don't need to apply the update for the process which didn't get computed if (state.getCompletedAdjSeq() == mAdjSeq) { applyOomAdjLSP(app, true, now, nowElapsed); applyOomAdjLSP(app, true, now, nowElapsed, oomAdjReason); } final ProcessServiceRecord psr = app.mServices; Loading Loading @@ -2640,7 +2641,7 @@ public class OomAdjuster { /** Applies the computed oomadj, procstate and sched group values and freezes them in set* */ @GuardedBy({"mService", "mProcLock"}) private boolean applyOomAdjLSP(ProcessRecord app, boolean doingAll, long now, long nowElapsed) { long nowElapsed, @OomAdjReason int oomAdjReson) { boolean success = true; final ProcessStateRecord state = app.mState; final UidRecord uidRec = app.getUidRecord(); Loading Loading @@ -2799,7 +2800,7 @@ public class OomAdjuster { changes |= ActivityManagerService.ProcessChangeItem.CHANGE_ACTIVITIES; } updateAppFreezeStateLSP(app); updateAppFreezeStateLSP(app, oomAdjReson); if (state.getReportedProcState() != state.getCurProcState()) { state.setReportedProcState(state.getCurProcState()); Loading Loading @@ -3160,7 +3161,7 @@ public class OomAdjuster { } @GuardedBy({"mService", "mProcLock"}) private void updateAppFreezeStateLSP(ProcessRecord app) { private void updateAppFreezeStateLSP(ProcessRecord app, @OomAdjReason int oomAdjReason) { if (!mCachedAppOptimizer.useFreezer()) { return; } Loading @@ -3172,7 +3173,7 @@ public class OomAdjuster { final ProcessCachedOptimizerRecord opt = app.mOptRecord; // if an app is already frozen and shouldNotFreeze becomes true, immediately unfreeze if (opt.isFrozen() && opt.shouldNotFreeze()) { mCachedAppOptimizer.unfreezeAppLSP(app); mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason); return; } Loading @@ -3182,7 +3183,7 @@ public class OomAdjuster { && !opt.shouldNotFreeze()) { mCachedAppOptimizer.freezeAppAsyncLSP(app); } else if (state.getSetAdj() < ProcessList.CACHED_APP_MIN_ADJ) { mCachedAppOptimizer.unfreezeAppLSP(app); mCachedAppOptimizer.unfreezeAppLSP(app, oomAdjReason); } } }