Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bb81654f authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add follow up OomAdjuster updates" into main

parents c6dcb817 f9030081
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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,
@@ -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 {}
+28 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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}
     */
@@ -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.
     */
@@ -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;
@@ -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);
@@ -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);
+13 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
            }
        }
    }
@@ -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.
     */
+150 −15
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
        }
@@ -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";
        }
@@ -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;

@@ -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());
    }
@@ -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;
@@ -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();
@@ -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();
@@ -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();

@@ -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));
@@ -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());
@@ -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;
@@ -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);
@@ -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,
@@ -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
@@ -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");
@@ -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);
            }
        }

@@ -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
@@ -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;
@@ -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);
            }
        }

@@ -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) {
@@ -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 */);
    }
@@ -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 */);
    }
@@ -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);
    }
}
+9 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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(
@@ -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++;
@@ -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