Loading core/java/android/app/ActivityManagerInternal.java +6 −0 Original line number Diff line number Diff line Loading @@ -477,6 +477,11 @@ public abstract class ActivityManagerInternal { */ public static final int OOM_ADJ_REASON_COMPONENT_DISABLED = 22; /** * Oom Adj Reason: Follow up update for time sensitive state evaluations. */ public static final int OOM_ADJ_REASON_FOLLOW_UP = 23; @IntDef(prefix = {"OOM_ADJ_REASON_"}, value = { OOM_ADJ_REASON_NONE, OOM_ADJ_REASON_ACTIVITY, Loading @@ -501,6 +506,7 @@ public abstract class ActivityManagerInternal { OOM_ADJ_REASON_EXECUTING_SERVICE, OOM_ADJ_REASON_RESTRICTION_CHANGE, OOM_ADJ_REASON_COMPONENT_DISABLED, OOM_ADJ_REASON_FOLLOW_UP, }) @Retention(RetentionPolicy.SOURCE) public @interface OomAdjReason {} Loading services/core/java/com/android/server/am/ActivityManagerConstants.java +28 −0 Original line number Diff line number Diff line Loading @@ -174,6 +174,12 @@ final class ActivityManagerConstants extends ContentObserver { */ static final String KEY_ENABLE_BATCHING_OOM_ADJ = "enable_batching_oom_adj"; /** * How long to wait before scheduling another follow-up oomAdjuster update for time based state. */ static final String KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION = "follow_up_oomadj_update_wait_duration"; private static final int DEFAULT_MAX_CACHED_PROCESSES = 1024; private static final boolean DEFAULT_PRIORITIZE_ALARM_BROADCASTS = true; private static final long DEFAULT_FGSERVICE_MIN_SHOWN_TIME = 2*1000; Loading Loading @@ -253,6 +259,11 @@ final class ActivityManagerConstants extends ContentObserver { */ private static final boolean DEFAULT_ENABLE_BATCHING_OOM_ADJ = Flags.batchingOomAdj(); /** * The default value to {@link #KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION}. */ private static final long DEFAULT_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION = 1000L; /** * Same as {@link TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_NOT_ALLOWED} */ Loading Loading @@ -1149,6 +1160,10 @@ final class ActivityManagerConstants extends ContentObserver { /** @see #KEY_ENABLE_BATCHING_OOM_ADJ */ public boolean ENABLE_BATCHING_OOM_ADJ = DEFAULT_ENABLE_BATCHING_OOM_ADJ; /** @see #KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION */ public long FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION = DEFAULT_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION; /** * Indicates whether PSS profiling in AppProfiler is disabled or not. */ Loading Loading @@ -1359,6 +1374,9 @@ final class ActivityManagerConstants extends ContentObserver { case KEY_PROC_STATE_DEBUG_UIDS: updateProcStateDebugUids(); break; case KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION: updateFollowUpOomAdjUpdateWaitDuration(); break; default: updateFGSPermissionEnforcementFlagsIfNecessary(name); break; Loading Loading @@ -2246,6 +2264,13 @@ final class ActivityManagerConstants extends ContentObserver { DEFAULT_ENABLE_NEW_OOM_ADJ); } private void updateFollowUpOomAdjUpdateWaitDuration() { FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION = DeviceConfig.getLong( DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION, DEFAULT_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION); } private void updateFGSPermissionEnforcementFlagsIfNecessary(@NonNull String name) { ForegroundServiceTypePolicy.getDefaultPolicy() .updatePermissionEnforcementFlagIfNecessary(name); Loading Loading @@ -2514,6 +2539,9 @@ final class ActivityManagerConstants extends ContentObserver { pw.print(" ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION="); pw.println(mEnableWaitForFinishAttachApplication); pw.print(" "); pw.print(KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION); pw.print("="); pw.println(FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION); synchronized (mProcStateDebugUids) { pw.print(" "); pw.print(KEY_PROC_STATE_DEBUG_UIDS); pw.print("="); pw.println(mProcStateDebugUids); Loading services/core/java/com/android/server/am/ActivityManagerService.java +13 −0 Original line number Diff line number Diff line Loading @@ -1663,6 +1663,7 @@ public class ActivityManagerService extends IActivityManager.Stub static final int BIND_APPLICATION_TIMEOUT_HARD_MSG = 83; static final int SERVICE_FGS_TIMEOUT_MSG = 84; static final int SERVICE_FGS_CRASH_TIMEOUT_MSG = 85; static final int FOLLOW_UP_OOMADJUSTER_UPDATE_MSG = 86; static final int FIRST_BROADCAST_QUEUE_MSG = 200; Loading Loading @@ -2036,6 +2037,9 @@ public class ActivityManagerService extends IActivityManager.Stub case SERVICE_FGS_CRASH_TIMEOUT_MSG: { mServices.onFgsCrashTimeout((ServiceRecord) msg.obj); } break; case FOLLOW_UP_OOMADJUSTER_UPDATE_MSG: { handleFollowUpOomAdjusterUpdate(); } break; } } } Loading Loading @@ -5103,6 +5107,15 @@ public class ActivityManagerService extends IActivityManager.Stub mAnrHelper.appNotResponding(app, TimeoutRecord.forAppStart(anrMessage)); } private void handleFollowUpOomAdjusterUpdate() { // Remove any existing duplicate messages on the handler here while no lock is being held. // If another follow up update is needed, it will be scheduled by OomAdjuster. mHandler.removeMessages(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG); synchronized (this) { mOomAdjuster.updateOomAdjFollowUpTargetsLocked(); } } /** * @return The last part of the string of an intent's action. */ Loading services/core/java/com/android/server/am/OomAdjuster.java +150 −15 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_BIND_SERVICE; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_COMPONENT_DISABLED; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_EXECUTING_SERVICE; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_FINISH_RECEIVER; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_FOLLOW_UP; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_GET_PROVIDER; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_NONE; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_PROCESS_BEGIN; Loading Loading @@ -91,6 +92,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PSS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_UID_OBSERVERS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_USAGE_STATS; import static com.android.server.am.ActivityManagerService.DISPATCH_OOM_ADJ_OBSERVER_MSG; import static com.android.server.am.ActivityManagerService.FOLLOW_UP_OOMADJUSTER_UPDATE_MSG; import static com.android.server.am.ActivityManagerService.IDLE_UIDS_MSG; import static com.android.server.am.ActivityManagerService.TAG_BACKUP; import static com.android.server.am.ActivityManagerService.TAG_LRU; Loading Loading @@ -226,6 +228,8 @@ public class OomAdjuster { return AppProtoEnums.OOM_ADJ_REASON_RESTRICTION_CHANGE; case OOM_ADJ_REASON_COMPONENT_DISABLED: return AppProtoEnums.OOM_ADJ_REASON_COMPONENT_DISABLED; case OOM_ADJ_REASON_FOLLOW_UP: return AppProtoEnums.OOM_ADJ_REASON_FOLLOW_UP; default: return AppProtoEnums.OOM_ADJ_REASON_UNKNOWN_TO_PROTO; } Loading Loading @@ -280,6 +284,8 @@ public class OomAdjuster { return OOM_ADJ_REASON_METHOD + "_restrictionChange"; case OOM_ADJ_REASON_COMPONENT_DISABLED: return OOM_ADJ_REASON_METHOD + "_componentDisabled"; case OOM_ADJ_REASON_FOLLOW_UP: return OOM_ADJ_REASON_METHOD + "_followUp"; default: return "_unknown"; } Loading Loading @@ -370,6 +376,7 @@ public class OomAdjuster { protected final int[] mTmpSchedGroup = new int[1]; final ActivityManagerService mService; final Injector mInjector; final ProcessList mProcessList; final ActivityManagerGlobalLock mProcLock; Loading Loading @@ -420,14 +427,35 @@ public class OomAdjuster { @GuardedBy("mService") protected int mProcessStateCurTop = PROCESS_STATE_TOP; /** Overrideable by a test */ @GuardedBy("mService") private final ArraySet<ProcessRecord> mFollowUpUpdateSet = new ArraySet<>(); private static final long NO_FOLLOW_UP_TIME = Long.MAX_VALUE; @GuardedBy("mService") private long mNextFollowUpUpdateUptimeMs = NO_FOLLOW_UP_TIME; @VisibleForTesting protected boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId, public static class Injector { boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId, ApplicationInfo app, boolean defaultValue) { return PlatformCompatCache.getInstance() .isChangeEnabled(cachedCompatChangeId, app, defaultValue); } long getUptimeMillis() { return SystemClock.uptimeMillis(); } long getElapsedRealtimeMillis() { return SystemClock.elapsedRealtime(); } } boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId, ApplicationInfo app, boolean defaultValue) { return mInjector.isChangeEnabled(cachedCompatChangeId, app, defaultValue); } OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids) { this(service, processList, activeUids, createAdjusterThread()); } Loading @@ -443,7 +471,18 @@ public class OomAdjuster { OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids, ServiceThread adjusterThread) { this(service, processList, activeUids, adjusterThread, new Injector()); } OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids, Injector injector) { this(service, processList, activeUids, createAdjusterThread(), injector); } OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids, ServiceThread adjusterThread, Injector injector) { mService = service; mInjector = injector; mProcessList = processList; mProcLock = service.mProcLock; mActiveUids = activeUids; Loading Loading @@ -631,8 +670,8 @@ public class OomAdjuster { // processes, its adj could be still unknown as of now, assign one. processes.add(app); assignCachedAdjIfNecessary(processes); applyOomAdjLSP(app, false, SystemClock.uptimeMillis(), SystemClock.elapsedRealtime(), oomAdjReason); applyOomAdjLSP(app, false, mInjector.getUptimeMillis(), mInjector.getElapsedRealtimeMillis(), oomAdjReason); } mTmpProcessList.clear(); mService.clearPendingTopAppLocked(); Loading Loading @@ -848,6 +887,40 @@ public class OomAdjuster { } } @GuardedBy("mService") void updateOomAdjFollowUpTargetsLocked() { final long now = mInjector.getUptimeMillis(); long nextFollowUpUptimeMs = Long.MAX_VALUE; mNextFollowUpUpdateUptimeMs = NO_FOLLOW_UP_TIME; for (int i = mFollowUpUpdateSet.size() - 1; i >= 0; i--) { final ProcessRecord proc = mFollowUpUpdateSet.valueAtUnchecked(i); final long followUpUptimeMs = proc.mState.getFollowupUpdateUptimeMs(); if (proc.isKilled()) { // Process is dead, just remove from follow up set. mFollowUpUpdateSet.removeAt(i); } else if (followUpUptimeMs <= now) { // Add processes that need a follow up update. mPendingProcessSet.add(proc); proc.mState.setFollowupUpdateUptimeMs(NO_FOLLOW_UP_TIME); mFollowUpUpdateSet.removeAt(i); } else if (followUpUptimeMs < nextFollowUpUptimeMs) { // Figure out when to schedule the next follow up update. nextFollowUpUptimeMs = followUpUptimeMs; } else if (followUpUptimeMs == NO_FOLLOW_UP_TIME) { // The follow up is no longer needed for this process. mFollowUpUpdateSet.removeAt(i); } } if (nextFollowUpUptimeMs != Long.MAX_VALUE) { // There is still at least one process that needs a follow up. scheduleFollowUpOomAdjusterUpdateLocked(nextFollowUpUptimeMs, now); } updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_FOLLOW_UP); } @GuardedBy("mService") protected void performUpdateOomAdjPendingTargetsLocked(@OomAdjReason int oomAdjReason) { final ProcessRecord topApp = mService.getTopApp(); Loading Loading @@ -899,8 +972,8 @@ public class OomAdjuster { if (startProfiling) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason)); } final long now = SystemClock.uptimeMillis(); final long nowElapsed = SystemClock.elapsedRealtime(); final long now = mInjector.getUptimeMillis(); final long nowElapsed = mInjector.getElapsedRealtimeMillis(); final long oldTime = now - mConstants.mMaxEmptyTimeMillis; final int numProc = activeProcesses.size(); Loading Loading @@ -1026,7 +1099,7 @@ public class OomAdjuster { updateUidsLSP(activeUids, nowElapsed); synchronized (mService.mProcessStats.mLock) { final long nowUptime = SystemClock.uptimeMillis(); final long nowUptime = mInjector.getUptimeMillis(); if (mService.mProcessStats.shouldWriteNowLocked(nowUptime)) { mService.mHandler.post(new ActivityManagerService.ProcStatsRunnable(mService, mService.mProcessStats)); Loading @@ -1037,7 +1110,7 @@ public class OomAdjuster { } if (DEBUG_OOM_ADJ) { final long duration = SystemClock.uptimeMillis() - now; final long duration = mInjector.getUptimeMillis() - now; if (false) { Slog.d(TAG_OOM_ADJ, "Did OOM ADJ in " + duration + "ms", new RuntimeException("here").fillInStackTrace()); Loading @@ -1051,7 +1124,7 @@ public class OomAdjuster { protected void assignCachedAdjIfNecessary(ArrayList<ProcessRecord> lruList) { final int numLru = lruList.size(); if (mConstants.USE_TIERED_CACHED_ADJ) { final long now = SystemClock.uptimeMillis(); final long now = mInjector.getUptimeMillis(); for (int i = numLru - 1; i >= 0; i--) { ProcessRecord app = lruList.get(i); final ProcessStateRecord state = app.mState; Loading Loading @@ -1734,6 +1807,10 @@ public class OomAdjuster { int prevProcState = getInitialProcState(app); int prevCapability = getInitialCapability(app); // Remove any follow up update this process might have. It will be rescheduled if still // needed. app.mState.setFollowupUpdateUptimeMs(NO_FOLLOW_UP_TIME); if (app.getThread() == null) { state.setAdjSeq(mAdjSeq); state.setCurrentSchedulingGroup(SCHED_GROUP_BACKGROUND); Loading Loading @@ -2001,6 +2078,8 @@ public class OomAdjuster { if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to recent fg: " + app); } maybeSetProcessFollowUpUpdateLocked(app, state.getLastTopTime() + mConstants.TOP_TO_FGS_GRACE_DURATION, now); } // If the app was recently in the foreground and has expedited jobs running, Loading @@ -2021,6 +2100,9 @@ public class OomAdjuster { if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to recent fg for EJ: " + app); } maybeSetProcessFollowUpUpdateLocked(app, state.getLastTopTime() + mConstants.TOP_TO_ALMOST_PERCEPTIBLE_GRACE_DURATION, now); } if (adj > PERCEPTIBLE_APP_ADJ Loading Loading @@ -2086,7 +2168,7 @@ public class OomAdjuster { // app to be demoted to cached. if (procState >= PROCESS_STATE_LAST_ACTIVITY && state.getSetProcState() == PROCESS_STATE_LAST_ACTIVITY && (state.getLastStateTime() + mConstants.MAX_PREVIOUS_TIME) < now) { && (state.getLastStateTime() + mConstants.MAX_PREVIOUS_TIME) <= now) { procState = PROCESS_STATE_LAST_ACTIVITY; schedGroup = SCHED_GROUP_BACKGROUND; state.setAdjType("previous-expired"); Loading @@ -2110,6 +2192,14 @@ public class OomAdjuster { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to prev: " + app); } } final long lastStateTime; if (state.getSetProcState() == PROCESS_STATE_LAST_ACTIVITY) { lastStateTime = state.getLastStateTime(); } else { lastStateTime = now; } maybeSetProcessFollowUpUpdateLocked(app, lastStateTime + mConstants.MAX_PREVIOUS_TIME, now); } } Loading Loading @@ -2198,6 +2288,8 @@ public class OomAdjuster { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to started service: " + app); } maybeSetProcessFollowUpUpdateLocked(app, s.lastActivity + mConstants.MAX_SERVICE_INACTIVITY, now); } } // If we have let the service slide into the background Loading Loading @@ -2352,6 +2444,8 @@ public class OomAdjuster { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to recent provider: " + app); } maybeSetProcessFollowUpUpdateLocked(app, ppr.getLastProviderTime() + mConstants.CONTENT_PROVIDER_RETAIN_TIME, now); } if (procState > PROCESS_STATE_LAST_ACTIVITY) { procState = PROCESS_STATE_LAST_ACTIVITY; Loading @@ -2360,6 +2454,8 @@ public class OomAdjuster { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to recent provider: " + app); } maybeSetProcessFollowUpUpdateLocked(app, ppr.getLastProviderTime() + mConstants.CONTENT_PROVIDER_RETAIN_TIME, now); } } Loading Loading @@ -3672,7 +3768,7 @@ public class OomAdjuster { if (N <= 0) { return; } final long nowElapsed = SystemClock.elapsedRealtime(); final long nowElapsed = mInjector.getElapsedRealtimeMillis(); final long maxBgTime = nowElapsed - mConstants.BACKGROUND_SETTLE_TIME; long nextTime = 0; if (mService.mLocalPowerManager != null) { Loading Loading @@ -3907,7 +4003,7 @@ public class OomAdjuster { } // Take a dry run of the computeServiceHostOomAdjLSP, this would't be expensive // since it's only evaluating one service connection. return computeServiceHostOomAdjLSP(cr, app, client, SystemClock.uptimeMillis(), return computeServiceHostOomAdjLSP(cr, app, client, mInjector.getUptimeMillis(), mService.getTopApp(), false, false, false, OOM_ADJ_REASON_NONE, CACHED_APP_MIN_ADJ, false, true /* dryRun */); } Loading Loading @@ -3942,7 +4038,7 @@ public class OomAdjuster { // The provider host process has better states than the client, so no change. return false; } return computeProviderHostOomAdjLSP(null, app, client, SystemClock.uptimeMillis(), return computeProviderHostOomAdjLSP(null, app, client, mInjector.getUptimeMillis(), mService.getTopApp(), false, false, false, OOM_ADJ_REASON_NONE, CACHED_APP_MIN_ADJ, false, true /* dryRun */); } Loading Loading @@ -3970,4 +4066,43 @@ public class OomAdjuster { } return false; } @GuardedBy("mService") private void maybeSetProcessFollowUpUpdateLocked(ProcessRecord proc, long updateUptimeMs, long now) { if (!Flags.followUpOomadjUpdates()) { return; } if (updateUptimeMs <= now) { // Time sensitive period has already passed. No need to schedule a follow up. return; } mFollowUpUpdateSet.add(proc); proc.mState.setFollowupUpdateUptimeMs(updateUptimeMs); scheduleFollowUpOomAdjusterUpdateLocked(updateUptimeMs, now); } @GuardedBy("mService") private void scheduleFollowUpOomAdjusterUpdateLocked(long updateUptimeMs, long now) { if (updateUptimeMs + mConstants.FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION >= mNextFollowUpUpdateUptimeMs) { // Update time is too close or later than the next follow up update. return; } if (updateUptimeMs < now + mConstants.FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION) { // Use a minimum delay for the follow up to possibly batch multiple process // evaluations and avoid rapid updates. updateUptimeMs = now + mConstants.FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION; } // Schedulate a follow up update. Don't bother deleting existing handler messages, they // will be cleared during the message while no locks are being held. mNextFollowUpUpdateUptimeMs = updateUptimeMs; mService.mHandler.sendEmptyMessageAtTime(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG, mNextFollowUpUpdateUptimeMs); } } services/core/java/com/android/server/am/OomAdjusterModernImpl.java +9 −5 Original line number Diff line number Diff line Loading @@ -68,7 +68,6 @@ import android.app.ActivityManager; import android.app.ActivityManagerInternal.OomAdjReason; import android.content.pm.ServiceInfo; import android.os.IBinder; import android.os.SystemClock; import android.os.Trace; import android.util.ArrayMap; import android.util.ArraySet; Loading Loading @@ -764,6 +763,11 @@ public class OomAdjusterModernImpl extends OomAdjuster { super(service, processList, activeUids, adjusterThread); } OomAdjusterModernImpl(ActivityManagerService service, ProcessList processList, ActiveUids activeUids, Injector injector) { super(service, processList, activeUids, injector); } private final ProcessRecordNodes mProcessRecordProcStateNodes = new ProcessRecordNodes( ProcessRecordNode.NODE_TYPE_PROC_STATE, PROC_STATE_SLOTS.length); private final ProcessRecordNodes mProcessRecordAdjNodes = new ProcessRecordNodes( Loading Loading @@ -924,8 +928,8 @@ public class OomAdjusterModernImpl extends OomAdjuster { @GuardedBy({"mService", "mProcLock"}) private void fullUpdateLSP(@OomAdjReason int oomAdjReason) { final ProcessRecord topApp = mService.getTopApp(); final long now = SystemClock.uptimeMillis(); final long nowElapsed = SystemClock.elapsedRealtime(); final long now = mInjector.getUptimeMillis(); final long nowElapsed = mInjector.getElapsedRealtimeMillis(); final long oldTime = now - mConstants.mMaxEmptyTimeMillis; mAdjSeq++; Loading Loading @@ -1015,8 +1019,8 @@ public class OomAdjusterModernImpl extends OomAdjuster { @GuardedBy({"mService", "mProcLock"}) private void partialUpdateLSP(@OomAdjReason int oomAdjReason, ArraySet<ProcessRecord> targets) { final ProcessRecord topApp = mService.getTopApp(); final long now = SystemClock.uptimeMillis(); final long nowElapsed = SystemClock.elapsedRealtime(); final long now = mInjector.getUptimeMillis(); final long nowElapsed = mInjector.getElapsedRealtimeMillis(); final long oldTime = now - mConstants.mMaxEmptyTimeMillis; ActiveUids activeUids = mTmpUidRecords; Loading Loading
core/java/android/app/ActivityManagerInternal.java +6 −0 Original line number Diff line number Diff line Loading @@ -477,6 +477,11 @@ public abstract class ActivityManagerInternal { */ public static final int OOM_ADJ_REASON_COMPONENT_DISABLED = 22; /** * Oom Adj Reason: Follow up update for time sensitive state evaluations. */ public static final int OOM_ADJ_REASON_FOLLOW_UP = 23; @IntDef(prefix = {"OOM_ADJ_REASON_"}, value = { OOM_ADJ_REASON_NONE, OOM_ADJ_REASON_ACTIVITY, Loading @@ -501,6 +506,7 @@ public abstract class ActivityManagerInternal { OOM_ADJ_REASON_EXECUTING_SERVICE, OOM_ADJ_REASON_RESTRICTION_CHANGE, OOM_ADJ_REASON_COMPONENT_DISABLED, OOM_ADJ_REASON_FOLLOW_UP, }) @Retention(RetentionPolicy.SOURCE) public @interface OomAdjReason {} Loading
services/core/java/com/android/server/am/ActivityManagerConstants.java +28 −0 Original line number Diff line number Diff line Loading @@ -174,6 +174,12 @@ final class ActivityManagerConstants extends ContentObserver { */ static final String KEY_ENABLE_BATCHING_OOM_ADJ = "enable_batching_oom_adj"; /** * How long to wait before scheduling another follow-up oomAdjuster update for time based state. */ static final String KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION = "follow_up_oomadj_update_wait_duration"; private static final int DEFAULT_MAX_CACHED_PROCESSES = 1024; private static final boolean DEFAULT_PRIORITIZE_ALARM_BROADCASTS = true; private static final long DEFAULT_FGSERVICE_MIN_SHOWN_TIME = 2*1000; Loading Loading @@ -253,6 +259,11 @@ final class ActivityManagerConstants extends ContentObserver { */ private static final boolean DEFAULT_ENABLE_BATCHING_OOM_ADJ = Flags.batchingOomAdj(); /** * The default value to {@link #KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION}. */ private static final long DEFAULT_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION = 1000L; /** * Same as {@link TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_NOT_ALLOWED} */ Loading Loading @@ -1149,6 +1160,10 @@ final class ActivityManagerConstants extends ContentObserver { /** @see #KEY_ENABLE_BATCHING_OOM_ADJ */ public boolean ENABLE_BATCHING_OOM_ADJ = DEFAULT_ENABLE_BATCHING_OOM_ADJ; /** @see #KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION */ public long FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION = DEFAULT_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION; /** * Indicates whether PSS profiling in AppProfiler is disabled or not. */ Loading Loading @@ -1359,6 +1374,9 @@ final class ActivityManagerConstants extends ContentObserver { case KEY_PROC_STATE_DEBUG_UIDS: updateProcStateDebugUids(); break; case KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION: updateFollowUpOomAdjUpdateWaitDuration(); break; default: updateFGSPermissionEnforcementFlagsIfNecessary(name); break; Loading Loading @@ -2246,6 +2264,13 @@ final class ActivityManagerConstants extends ContentObserver { DEFAULT_ENABLE_NEW_OOM_ADJ); } private void updateFollowUpOomAdjUpdateWaitDuration() { FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION = DeviceConfig.getLong( DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION, DEFAULT_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION); } private void updateFGSPermissionEnforcementFlagsIfNecessary(@NonNull String name) { ForegroundServiceTypePolicy.getDefaultPolicy() .updatePermissionEnforcementFlagIfNecessary(name); Loading Loading @@ -2514,6 +2539,9 @@ final class ActivityManagerConstants extends ContentObserver { pw.print(" ENABLE_WAIT_FOR_FINISH_ATTACH_APPLICATION="); pw.println(mEnableWaitForFinishAttachApplication); pw.print(" "); pw.print(KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION); pw.print("="); pw.println(FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION); synchronized (mProcStateDebugUids) { pw.print(" "); pw.print(KEY_PROC_STATE_DEBUG_UIDS); pw.print("="); pw.println(mProcStateDebugUids); Loading
services/core/java/com/android/server/am/ActivityManagerService.java +13 −0 Original line number Diff line number Diff line Loading @@ -1663,6 +1663,7 @@ public class ActivityManagerService extends IActivityManager.Stub static final int BIND_APPLICATION_TIMEOUT_HARD_MSG = 83; static final int SERVICE_FGS_TIMEOUT_MSG = 84; static final int SERVICE_FGS_CRASH_TIMEOUT_MSG = 85; static final int FOLLOW_UP_OOMADJUSTER_UPDATE_MSG = 86; static final int FIRST_BROADCAST_QUEUE_MSG = 200; Loading Loading @@ -2036,6 +2037,9 @@ public class ActivityManagerService extends IActivityManager.Stub case SERVICE_FGS_CRASH_TIMEOUT_MSG: { mServices.onFgsCrashTimeout((ServiceRecord) msg.obj); } break; case FOLLOW_UP_OOMADJUSTER_UPDATE_MSG: { handleFollowUpOomAdjusterUpdate(); } break; } } } Loading Loading @@ -5103,6 +5107,15 @@ public class ActivityManagerService extends IActivityManager.Stub mAnrHelper.appNotResponding(app, TimeoutRecord.forAppStart(anrMessage)); } private void handleFollowUpOomAdjusterUpdate() { // Remove any existing duplicate messages on the handler here while no lock is being held. // If another follow up update is needed, it will be scheduled by OomAdjuster. mHandler.removeMessages(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG); synchronized (this) { mOomAdjuster.updateOomAdjFollowUpTargetsLocked(); } } /** * @return The last part of the string of an intent's action. */ Loading
services/core/java/com/android/server/am/OomAdjuster.java +150 −15 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_BIND_SERVICE; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_COMPONENT_DISABLED; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_EXECUTING_SERVICE; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_FINISH_RECEIVER; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_FOLLOW_UP; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_GET_PROVIDER; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_NONE; import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_PROCESS_BEGIN; Loading Loading @@ -91,6 +92,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PSS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_UID_OBSERVERS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_USAGE_STATS; import static com.android.server.am.ActivityManagerService.DISPATCH_OOM_ADJ_OBSERVER_MSG; import static com.android.server.am.ActivityManagerService.FOLLOW_UP_OOMADJUSTER_UPDATE_MSG; import static com.android.server.am.ActivityManagerService.IDLE_UIDS_MSG; import static com.android.server.am.ActivityManagerService.TAG_BACKUP; import static com.android.server.am.ActivityManagerService.TAG_LRU; Loading Loading @@ -226,6 +228,8 @@ public class OomAdjuster { return AppProtoEnums.OOM_ADJ_REASON_RESTRICTION_CHANGE; case OOM_ADJ_REASON_COMPONENT_DISABLED: return AppProtoEnums.OOM_ADJ_REASON_COMPONENT_DISABLED; case OOM_ADJ_REASON_FOLLOW_UP: return AppProtoEnums.OOM_ADJ_REASON_FOLLOW_UP; default: return AppProtoEnums.OOM_ADJ_REASON_UNKNOWN_TO_PROTO; } Loading Loading @@ -280,6 +284,8 @@ public class OomAdjuster { return OOM_ADJ_REASON_METHOD + "_restrictionChange"; case OOM_ADJ_REASON_COMPONENT_DISABLED: return OOM_ADJ_REASON_METHOD + "_componentDisabled"; case OOM_ADJ_REASON_FOLLOW_UP: return OOM_ADJ_REASON_METHOD + "_followUp"; default: return "_unknown"; } Loading Loading @@ -370,6 +376,7 @@ public class OomAdjuster { protected final int[] mTmpSchedGroup = new int[1]; final ActivityManagerService mService; final Injector mInjector; final ProcessList mProcessList; final ActivityManagerGlobalLock mProcLock; Loading Loading @@ -420,14 +427,35 @@ public class OomAdjuster { @GuardedBy("mService") protected int mProcessStateCurTop = PROCESS_STATE_TOP; /** Overrideable by a test */ @GuardedBy("mService") private final ArraySet<ProcessRecord> mFollowUpUpdateSet = new ArraySet<>(); private static final long NO_FOLLOW_UP_TIME = Long.MAX_VALUE; @GuardedBy("mService") private long mNextFollowUpUpdateUptimeMs = NO_FOLLOW_UP_TIME; @VisibleForTesting protected boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId, public static class Injector { boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId, ApplicationInfo app, boolean defaultValue) { return PlatformCompatCache.getInstance() .isChangeEnabled(cachedCompatChangeId, app, defaultValue); } long getUptimeMillis() { return SystemClock.uptimeMillis(); } long getElapsedRealtimeMillis() { return SystemClock.elapsedRealtime(); } } boolean isChangeEnabled(@CachedCompatChangeId int cachedCompatChangeId, ApplicationInfo app, boolean defaultValue) { return mInjector.isChangeEnabled(cachedCompatChangeId, app, defaultValue); } OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids) { this(service, processList, activeUids, createAdjusterThread()); } Loading @@ -443,7 +471,18 @@ public class OomAdjuster { OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids, ServiceThread adjusterThread) { this(service, processList, activeUids, adjusterThread, new Injector()); } OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids, Injector injector) { this(service, processList, activeUids, createAdjusterThread(), injector); } OomAdjuster(ActivityManagerService service, ProcessList processList, ActiveUids activeUids, ServiceThread adjusterThread, Injector injector) { mService = service; mInjector = injector; mProcessList = processList; mProcLock = service.mProcLock; mActiveUids = activeUids; Loading Loading @@ -631,8 +670,8 @@ public class OomAdjuster { // processes, its adj could be still unknown as of now, assign one. processes.add(app); assignCachedAdjIfNecessary(processes); applyOomAdjLSP(app, false, SystemClock.uptimeMillis(), SystemClock.elapsedRealtime(), oomAdjReason); applyOomAdjLSP(app, false, mInjector.getUptimeMillis(), mInjector.getElapsedRealtimeMillis(), oomAdjReason); } mTmpProcessList.clear(); mService.clearPendingTopAppLocked(); Loading Loading @@ -848,6 +887,40 @@ public class OomAdjuster { } } @GuardedBy("mService") void updateOomAdjFollowUpTargetsLocked() { final long now = mInjector.getUptimeMillis(); long nextFollowUpUptimeMs = Long.MAX_VALUE; mNextFollowUpUpdateUptimeMs = NO_FOLLOW_UP_TIME; for (int i = mFollowUpUpdateSet.size() - 1; i >= 0; i--) { final ProcessRecord proc = mFollowUpUpdateSet.valueAtUnchecked(i); final long followUpUptimeMs = proc.mState.getFollowupUpdateUptimeMs(); if (proc.isKilled()) { // Process is dead, just remove from follow up set. mFollowUpUpdateSet.removeAt(i); } else if (followUpUptimeMs <= now) { // Add processes that need a follow up update. mPendingProcessSet.add(proc); proc.mState.setFollowupUpdateUptimeMs(NO_FOLLOW_UP_TIME); mFollowUpUpdateSet.removeAt(i); } else if (followUpUptimeMs < nextFollowUpUptimeMs) { // Figure out when to schedule the next follow up update. nextFollowUpUptimeMs = followUpUptimeMs; } else if (followUpUptimeMs == NO_FOLLOW_UP_TIME) { // The follow up is no longer needed for this process. mFollowUpUpdateSet.removeAt(i); } } if (nextFollowUpUptimeMs != Long.MAX_VALUE) { // There is still at least one process that needs a follow up. scheduleFollowUpOomAdjusterUpdateLocked(nextFollowUpUptimeMs, now); } updateOomAdjPendingTargetsLocked(OOM_ADJ_REASON_FOLLOW_UP); } @GuardedBy("mService") protected void performUpdateOomAdjPendingTargetsLocked(@OomAdjReason int oomAdjReason) { final ProcessRecord topApp = mService.getTopApp(); Loading Loading @@ -899,8 +972,8 @@ public class OomAdjuster { if (startProfiling) { Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, oomAdjReasonToString(oomAdjReason)); } final long now = SystemClock.uptimeMillis(); final long nowElapsed = SystemClock.elapsedRealtime(); final long now = mInjector.getUptimeMillis(); final long nowElapsed = mInjector.getElapsedRealtimeMillis(); final long oldTime = now - mConstants.mMaxEmptyTimeMillis; final int numProc = activeProcesses.size(); Loading Loading @@ -1026,7 +1099,7 @@ public class OomAdjuster { updateUidsLSP(activeUids, nowElapsed); synchronized (mService.mProcessStats.mLock) { final long nowUptime = SystemClock.uptimeMillis(); final long nowUptime = mInjector.getUptimeMillis(); if (mService.mProcessStats.shouldWriteNowLocked(nowUptime)) { mService.mHandler.post(new ActivityManagerService.ProcStatsRunnable(mService, mService.mProcessStats)); Loading @@ -1037,7 +1110,7 @@ public class OomAdjuster { } if (DEBUG_OOM_ADJ) { final long duration = SystemClock.uptimeMillis() - now; final long duration = mInjector.getUptimeMillis() - now; if (false) { Slog.d(TAG_OOM_ADJ, "Did OOM ADJ in " + duration + "ms", new RuntimeException("here").fillInStackTrace()); Loading @@ -1051,7 +1124,7 @@ public class OomAdjuster { protected void assignCachedAdjIfNecessary(ArrayList<ProcessRecord> lruList) { final int numLru = lruList.size(); if (mConstants.USE_TIERED_CACHED_ADJ) { final long now = SystemClock.uptimeMillis(); final long now = mInjector.getUptimeMillis(); for (int i = numLru - 1; i >= 0; i--) { ProcessRecord app = lruList.get(i); final ProcessStateRecord state = app.mState; Loading Loading @@ -1734,6 +1807,10 @@ public class OomAdjuster { int prevProcState = getInitialProcState(app); int prevCapability = getInitialCapability(app); // Remove any follow up update this process might have. It will be rescheduled if still // needed. app.mState.setFollowupUpdateUptimeMs(NO_FOLLOW_UP_TIME); if (app.getThread() == null) { state.setAdjSeq(mAdjSeq); state.setCurrentSchedulingGroup(SCHED_GROUP_BACKGROUND); Loading Loading @@ -2001,6 +2078,8 @@ public class OomAdjuster { if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to recent fg: " + app); } maybeSetProcessFollowUpUpdateLocked(app, state.getLastTopTime() + mConstants.TOP_TO_FGS_GRACE_DURATION, now); } // If the app was recently in the foreground and has expedited jobs running, Loading @@ -2021,6 +2100,9 @@ public class OomAdjuster { if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to recent fg for EJ: " + app); } maybeSetProcessFollowUpUpdateLocked(app, state.getLastTopTime() + mConstants.TOP_TO_ALMOST_PERCEPTIBLE_GRACE_DURATION, now); } if (adj > PERCEPTIBLE_APP_ADJ Loading Loading @@ -2086,7 +2168,7 @@ public class OomAdjuster { // app to be demoted to cached. if (procState >= PROCESS_STATE_LAST_ACTIVITY && state.getSetProcState() == PROCESS_STATE_LAST_ACTIVITY && (state.getLastStateTime() + mConstants.MAX_PREVIOUS_TIME) < now) { && (state.getLastStateTime() + mConstants.MAX_PREVIOUS_TIME) <= now) { procState = PROCESS_STATE_LAST_ACTIVITY; schedGroup = SCHED_GROUP_BACKGROUND; state.setAdjType("previous-expired"); Loading @@ -2110,6 +2192,14 @@ public class OomAdjuster { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to prev: " + app); } } final long lastStateTime; if (state.getSetProcState() == PROCESS_STATE_LAST_ACTIVITY) { lastStateTime = state.getLastStateTime(); } else { lastStateTime = now; } maybeSetProcessFollowUpUpdateLocked(app, lastStateTime + mConstants.MAX_PREVIOUS_TIME, now); } } Loading Loading @@ -2198,6 +2288,8 @@ public class OomAdjuster { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to started service: " + app); } maybeSetProcessFollowUpUpdateLocked(app, s.lastActivity + mConstants.MAX_SERVICE_INACTIVITY, now); } } // If we have let the service slide into the background Loading Loading @@ -2352,6 +2444,8 @@ public class OomAdjuster { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise adj to recent provider: " + app); } maybeSetProcessFollowUpUpdateLocked(app, ppr.getLastProviderTime() + mConstants.CONTENT_PROVIDER_RETAIN_TIME, now); } if (procState > PROCESS_STATE_LAST_ACTIVITY) { procState = PROCESS_STATE_LAST_ACTIVITY; Loading @@ -2360,6 +2454,8 @@ public class OomAdjuster { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise procstate to recent provider: " + app); } maybeSetProcessFollowUpUpdateLocked(app, ppr.getLastProviderTime() + mConstants.CONTENT_PROVIDER_RETAIN_TIME, now); } } Loading Loading @@ -3672,7 +3768,7 @@ public class OomAdjuster { if (N <= 0) { return; } final long nowElapsed = SystemClock.elapsedRealtime(); final long nowElapsed = mInjector.getElapsedRealtimeMillis(); final long maxBgTime = nowElapsed - mConstants.BACKGROUND_SETTLE_TIME; long nextTime = 0; if (mService.mLocalPowerManager != null) { Loading Loading @@ -3907,7 +4003,7 @@ public class OomAdjuster { } // Take a dry run of the computeServiceHostOomAdjLSP, this would't be expensive // since it's only evaluating one service connection. return computeServiceHostOomAdjLSP(cr, app, client, SystemClock.uptimeMillis(), return computeServiceHostOomAdjLSP(cr, app, client, mInjector.getUptimeMillis(), mService.getTopApp(), false, false, false, OOM_ADJ_REASON_NONE, CACHED_APP_MIN_ADJ, false, true /* dryRun */); } Loading Loading @@ -3942,7 +4038,7 @@ public class OomAdjuster { // The provider host process has better states than the client, so no change. return false; } return computeProviderHostOomAdjLSP(null, app, client, SystemClock.uptimeMillis(), return computeProviderHostOomAdjLSP(null, app, client, mInjector.getUptimeMillis(), mService.getTopApp(), false, false, false, OOM_ADJ_REASON_NONE, CACHED_APP_MIN_ADJ, false, true /* dryRun */); } Loading Loading @@ -3970,4 +4066,43 @@ public class OomAdjuster { } return false; } @GuardedBy("mService") private void maybeSetProcessFollowUpUpdateLocked(ProcessRecord proc, long updateUptimeMs, long now) { if (!Flags.followUpOomadjUpdates()) { return; } if (updateUptimeMs <= now) { // Time sensitive period has already passed. No need to schedule a follow up. return; } mFollowUpUpdateSet.add(proc); proc.mState.setFollowupUpdateUptimeMs(updateUptimeMs); scheduleFollowUpOomAdjusterUpdateLocked(updateUptimeMs, now); } @GuardedBy("mService") private void scheduleFollowUpOomAdjusterUpdateLocked(long updateUptimeMs, long now) { if (updateUptimeMs + mConstants.FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION >= mNextFollowUpUpdateUptimeMs) { // Update time is too close or later than the next follow up update. return; } if (updateUptimeMs < now + mConstants.FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION) { // Use a minimum delay for the follow up to possibly batch multiple process // evaluations and avoid rapid updates. updateUptimeMs = now + mConstants.FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION; } // Schedulate a follow up update. Don't bother deleting existing handler messages, they // will be cleared during the message while no locks are being held. mNextFollowUpUpdateUptimeMs = updateUptimeMs; mService.mHandler.sendEmptyMessageAtTime(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG, mNextFollowUpUpdateUptimeMs); } }
services/core/java/com/android/server/am/OomAdjusterModernImpl.java +9 −5 Original line number Diff line number Diff line Loading @@ -68,7 +68,6 @@ import android.app.ActivityManager; import android.app.ActivityManagerInternal.OomAdjReason; import android.content.pm.ServiceInfo; import android.os.IBinder; import android.os.SystemClock; import android.os.Trace; import android.util.ArrayMap; import android.util.ArraySet; Loading Loading @@ -764,6 +763,11 @@ public class OomAdjusterModernImpl extends OomAdjuster { super(service, processList, activeUids, adjusterThread); } OomAdjusterModernImpl(ActivityManagerService service, ProcessList processList, ActiveUids activeUids, Injector injector) { super(service, processList, activeUids, injector); } private final ProcessRecordNodes mProcessRecordProcStateNodes = new ProcessRecordNodes( ProcessRecordNode.NODE_TYPE_PROC_STATE, PROC_STATE_SLOTS.length); private final ProcessRecordNodes mProcessRecordAdjNodes = new ProcessRecordNodes( Loading Loading @@ -924,8 +928,8 @@ public class OomAdjusterModernImpl extends OomAdjuster { @GuardedBy({"mService", "mProcLock"}) private void fullUpdateLSP(@OomAdjReason int oomAdjReason) { final ProcessRecord topApp = mService.getTopApp(); final long now = SystemClock.uptimeMillis(); final long nowElapsed = SystemClock.elapsedRealtime(); final long now = mInjector.getUptimeMillis(); final long nowElapsed = mInjector.getElapsedRealtimeMillis(); final long oldTime = now - mConstants.mMaxEmptyTimeMillis; mAdjSeq++; Loading Loading @@ -1015,8 +1019,8 @@ public class OomAdjusterModernImpl extends OomAdjuster { @GuardedBy({"mService", "mProcLock"}) private void partialUpdateLSP(@OomAdjReason int oomAdjReason, ArraySet<ProcessRecord> targets) { final ProcessRecord topApp = mService.getTopApp(); final long now = SystemClock.uptimeMillis(); final long nowElapsed = SystemClock.elapsedRealtime(); final long now = mInjector.getUptimeMillis(); final long nowElapsed = mInjector.getElapsedRealtimeMillis(); final long oldTime = now - mConstants.mMaxEmptyTimeMillis; ActiveUids activeUids = mTmpUidRecords; Loading