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

Commit e4c74a83 authored by Chih-Yu Huang's avatar Chih-Yu Huang
Browse files

am: Make unfreezeTemporarily() use ProcessRecordInternal

This change refactors the app freezer state management by moving
attributes such as `isFrozen()`, `isFreezeExempt()`, and
`shouldNotFreeze()` from `ProcessCachedOptimizerRecord` directly
into `ProcessRecordInternal`.

Additionally, the `processName` field is elevated from `ProcessRecord`
to `ProcessRecordInternal`.

Bug: 425766486
Test: m services.core
Test: atest MockingOomAdjusterTests OomAdjusterTests
Test: atest FrameworksServicesTestsRavenwood_ProcessStateController
Flag: EXEMPT pure refactor

Change-Id: Id9da2f66ff4a991112376ef926e3b53b0f8acf03
parent 17c9d8b9
Loading
Loading
Loading
Loading
+25 −28
Original line number Diff line number Diff line
@@ -971,7 +971,6 @@ public abstract class OomAdjuster {
            for (int i = numLru - 1; i >= 0; i--) {
                ProcessRecord app = lruList.get(i);
                final ProcessRecordInternal state = app;
                final ProcessCachedOptimizerRecord opt = app.mOptRecord;
                final int curAdj = state.getCurAdj();
                if (VISIBLE_APP_ADJ <= curAdj && curAdj <= VISIBLE_APP_MAX_ADJ) {
                    state.setCurAdj(nextVisibleAppAdj);
@@ -984,7 +983,7 @@ public abstract class OomAdjuster {
                    final ProcessServiceRecord psr = app.mServices;
                    int targetAdj = CACHED_APP_MIN_ADJ;

                    if (opt != null && opt.isFreezeExempt()) {
                    if (app.isFreezeExempt()) {
                        // BIND_WAIVE_PRIORITY and the like get oom_adj 900
                        targetAdj += 0;
                    } else if (state.getHasShownUi() && uiTargetAdj < uiTierMaxAdj) {
@@ -2645,7 +2644,7 @@ public abstract class OomAdjuster {
    /**
     * Return whether or not a process should be frozen.
     */
    static boolean getFreezePolicy(ProcessRecord proc) {
    static boolean getFreezePolicy(ProcessRecordInternal proc) {
        if (Flags.cpuTimeCapabilityBasedFreezePolicy()) {
            if ((proc.getCurCapability() & ALL_CPU_TIME_CAPABILITIES) != 0) {
                /// App is important enough (see {@link #getCpuCapability} and
@@ -2654,7 +2653,7 @@ public abstract class OomAdjuster {
                return false;
            }

            if (proc.mOptRecord.isFreezeExempt()) {
            if (proc.isFreezeExempt()) {
                return false;
            }

@@ -2663,11 +2662,11 @@ public abstract class OomAdjuster {
        } else {
            // The CPU capability handling covers all setShouldNotFreeze paths. Must check
            // shouldNotFreeze, if the CPU capability is not being used.
            if (proc.mOptRecord.shouldNotFreeze()) {
            if (proc.shouldNotFreeze()) {
                return false;
            }

            if (proc.mOptRecord.isFreezeExempt()) {
            if (proc.isFreezeExempt()) {
                return false;
            }

@@ -2683,19 +2682,17 @@ public abstract class OomAdjuster {
    }

    @GuardedBy({"mService", "mProcLock"})
    void updateAppFreezeStateLSP(ProcessRecord app, @OomAdjReason int oomAdjReason,
    void updateAppFreezeStateLSP(ProcessRecordInternal app, @OomAdjReason int oomAdjReason,
            boolean immediate, int oldOomAdj) {
        if (!mCachedAppOptimizer.useFreezer()) {
            return;
        }

        final boolean freezePolicy = getFreezePolicy(app);
        final ProcessCachedOptimizerRecord opt = app.mOptRecord;
        final ProcessRecordInternal state = app;
        if (Flags.traceUpdateAppFreezeStateLsp()) {
            final boolean oomAdjChanged = (state.getCurAdj() >= mConstants.FREEZER_CUTOFF_ADJ
            final boolean oomAdjChanged = (app.getCurAdj() >= mConstants.FREEZER_CUTOFF_ADJ
                    ^ oldOomAdj >= mConstants.FREEZER_CUTOFF_ADJ) || oldOomAdj == UNKNOWN_ADJ;
            final boolean shouldNotFreezeChanged = opt.shouldNotFreezeAdjSeq() == mAdjSeq;
            final boolean shouldNotFreezeChanged = app.shouldNotFreezeAdjSeq() == mAdjSeq;
            final boolean hasCpuCapability =
                    (PROCESS_CAPABILITY_CPU_TIME & app.getCurCapability())
                            == PROCESS_CAPABILITY_CPU_TIME;
@@ -2718,10 +2715,10 @@ public abstract class OomAdjuster {
                    && Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
                Trace.instantForTrack(Trace.TRACE_TAG_ACTIVITY_MANAGER,
                        "FreezeLite",
                        (opt.isFrozen() ? "F" : "-")
                        + (opt.isPendingFreeze() ? "P" : "-")
                        + (opt.isFreezeExempt() ? "E" : "-")
                        + (opt.shouldNotFreeze() ? "N" : "-")
                        (app.isFrozen() ? "F" : "-")
                        + (app.isPendingFreeze() ? "P" : "-")
                        + (app.isFreezeExempt() ? "E" : "-")
                        + (app.shouldNotFreeze() ? "N" : "-")
                        + (hasCpuCapability ? "T" : "-")
                        + (hasImplicitCpuCapability ? "X" : "-")
                        + (immediate ? "I" : "-")
@@ -2729,7 +2726,7 @@ public abstract class OomAdjuster {
                        + (Flags.cpuTimeCapabilityBasedFreezePolicy() ? "t" : "-")
                        + (Flags.prototypeAggressiveFreezing() ? "a" : "-")
                        + "/" + app.getPid()
                        + "/" + state.getCurAdj()
                        + "/" + app.getCurAdj()
                        + "/" + oldOomAdj
                        + "/" + app.shouldNotFreezeReason()
                        + "/" + cpuTimeReasons
@@ -2738,11 +2735,11 @@ public abstract class OomAdjuster {
                        CachedAppOptimizer.ATRACE_FREEZER_TRACK,
                        "updateAppFreezeStateLSP " + app.processName
                        + " pid: " + app.getPid()
                        + " isFreezeExempt: " + opt.isFreezeExempt()
                        + " isFrozen: " + opt.isFrozen()
                        + " isFreezeExempt: " + app.isFreezeExempt()
                        + " isFrozen: " + app.isFrozen()
                        + " shouldNotFreeze: " + app.shouldNotFreeze()
                        + " shouldNotFreezeReason: " + app.shouldNotFreezeReason()
                        + " curAdj: " + state.getCurAdj()
                        + " curAdj: " + app.getCurAdj()
                        + " oldOomAdj: " + oldOomAdj
                        + " immediate: " + immediate
                        + " cpuCapability: " + hasCpuCapability
@@ -2753,31 +2750,31 @@ public abstract class OomAdjuster {
            }
        }

        // TODO: b/425766486 - Consider how to pass ProcessRecordInternal to CachedAppOptimizer.
        if (freezePolicy) {
            // This process should be frozen.
            if (immediate && !opt.isFrozen()) {
            if (immediate && !app.isFrozen()) {
                // And it will be frozen immediately.
                mCachedAppOptimizer.freezeAppAsyncAtEarliestLSP(app);
            } else if (!opt.isFrozen() && !opt.isPendingFreeze()) {
                mCachedAppOptimizer.freezeAppAsyncLSP(app);
                mCachedAppOptimizer.freezeAppAsyncAtEarliestLSP((ProcessRecord) app);
            } else if (!app.isFrozen() && !app.isPendingFreeze()) {
                mCachedAppOptimizer.freezeAppAsyncLSP((ProcessRecord) app);
            }
        } else {
            // This process should not be frozen.
            if (opt.isFrozen() || opt.isPendingFreeze()) {
                mCachedAppOptimizer.unfreezeAppLSP(app,
            if (app.isFrozen() || app.isPendingFreeze()) {
                mCachedAppOptimizer.unfreezeAppLSP((ProcessRecord) app,
                        CachedAppOptimizer.getUnfreezeReasonCodeFromOomAdjReason(oomAdjReason));
            }
        }
    }

    @GuardedBy("mService")
    void unfreezeTemporarily(ProcessRecord app, @OomAdjReason int reason) {
    void unfreezeTemporarily(ProcessRecordInternal app, @OomAdjReason int reason) {
        if (!mCachedAppOptimizer.useFreezer()) {
            return;
        }

        final ProcessCachedOptimizerRecord opt = app.mOptRecord;
        if (!opt.isFrozen() && !opt.isPendingFreeze()) {
        if (!app.isFrozen() && !app.isPendingFreeze()) {
            return;
        }

+20 −2
Original line number Diff line number Diff line
@@ -95,7 +95,6 @@ class ProcessRecord extends ProcessRecordInternal implements WindowProcessListen
    volatile ApplicationInfo info; // all about the first app in the process
    final ProcessInfo processInfo; // if non-null, process-specific manifest info
    final boolean appZygote;    // true if this is forked from the app zygote
    final String processName;   // name of the process
    final String sdkSandboxClientAppPackage; // if this is an sdk sandbox process, name of the
                                             // app package for which it is running
    final String sdkSandboxClientAppVolumeUuid; // uuid of the app for which the sandbox is running
@@ -580,7 +579,6 @@ class ProcessRecord extends ProcessRecordInternal implements WindowProcessListen
        processInfo = procInfo;
        appZygote = (UserHandle.getAppId(_uid) >= Process.FIRST_APP_ZYGOTE_ISOLATED_UID
                && UserHandle.getAppId(_uid) <= Process.LAST_APP_ZYGOTE_ISOLATED_UID);
        processName = _processName;
        sdkSandboxClientAppPackage = _sdkSandboxClientAppPackage;
        if (isSdkSandbox) {
            final ApplicationInfo clientInfo = getClientInfoForSdkSandbox();
@@ -1156,6 +1154,21 @@ class ProcessRecord extends ProcessRecordInternal implements WindowProcessListen
        return mReceivers;
    }

    @Override
    public boolean isFrozen() {
        return mOptRecord.isFrozen();
    }

    @Override
    public boolean isPendingFreeze() {
        return mOptRecord.isPendingFreeze();
    }

    @Override
    public boolean isFreezeExempt() {
        return mOptRecord.isFreezeExempt();
    }

    @Override
    public boolean shouldNotFreeze() {
        return mOptRecord.shouldNotFreeze();
@@ -1172,6 +1185,11 @@ class ProcessRecord extends ProcessRecordInternal implements WindowProcessListen
        return mOptRecord.shouldNotFreezeReason();
    }

    @Override
    public int shouldNotFreezeAdjSeq() {
        return mOptRecord.shouldNotFreezeAdjSeq();
    }

    @Override
    public int getApplicationUid() {
        return info.uid;
+18 −3
Original line number Diff line number Diff line
@@ -194,6 +194,21 @@ public abstract class ProcessRecordInternal {
    /** Returns true if there is an active instrumentation running in this process. */
    public abstract boolean hasActiveInstrumentation();

    /** Returns whether this process is frozen. */
    public abstract boolean isFrozen();

    /** Returns whether this process has been scheduled for freezing. */
    public abstract boolean isPendingFreeze();

    /** Returns whether this process is exempt from being frozen by the system's app freezer. */
    public abstract boolean isFreezeExempt();

    /**
     * Returns the OOM adjustment sequence number when this process's
     * {@link #shouldNotFreeze()} state was last updated.
     */
    public abstract int shouldNotFreezeAdjSeq();

    /** Returns whether this process should be exempt from freezing. */
    public abstract boolean shouldNotFreeze();

@@ -237,7 +252,7 @@ public abstract class ProcessRecordInternal {
    // Enable this to trace all OomAdjuster state transitions
    private static final boolean TRACE_OOM_ADJ = false;

    private final String mProcessName;
    public final String processName;
    private String mTrackName;

    /**
@@ -699,7 +714,7 @@ public abstract class ProcessRecordInternal {
            new OomAdjusterImpl.ProcessRecordNode[NUM_NODE_TYPE];

    public ProcessRecordInternal(String processName, int uid, Object serviceLock, Object procLock) {
        mProcessName = processName;
        this.processName = processName;
        this.uid = uid;
        userId = UserHandle.getUserId(uid);
        isSdkSandbox = Process.isSdkSandboxUid(this.uid);
@@ -1703,7 +1718,7 @@ public abstract class ProcessRecordInternal {
     */
    private String getTrackName() {
        if (mTrackName == null) {
            mTrackName = "oom:" + mProcessName + "/u" + uid;
            mTrackName = "oom:" + processName + "/u" + uid;
        }
        return mTrackName;
    }