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

Commit ce5b437d authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Avoid compacting when app has foreground activities" into tm-dev am:...

Merge "Avoid compacting when app has foreground activities" into tm-dev am: a2d26585 am: 5673c705 am: 53bcd092 am: 2a16f36d

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18127602



Change-Id: If03f48f960a18a607c6bfa17577158a6c0e8ee32
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 39d02f5e 2a16f36d
Loading
Loading
Loading
Loading
+55 −45
Original line number Diff line number Diff line
@@ -479,19 +479,33 @@ public final class CachedAppOptimizer {
    @GuardedBy("mProcLock")
    void compactAppSome(ProcessRecord app, boolean force) {
        app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_SOME);
        compactApp(app, force, "some");
    }

    // This method returns true only if requirements are met. Note, that requirements are different
    // from throttles applied at the time a compaction is trying to be executed in the sense that
    // these are not subject to change dependent on time or memory as throttles usually do.
    @GuardedBy("mProcLock")
    boolean meetsCompactionRequirements(ProcessRecord proc) {
        if (mAm.mInternal.isPendingTopUid(proc.uid)) {
            // In case the OOM Adjust has not yet been propagated we see if this is
            // pending on becoming top app in which case we should not compact.
            if (DEBUG_COMPACTION) {
            Slog.d(TAG_AM, " compactAppSome requested for " + app.processName + " force: " + force);
                Slog.d(TAG_AM, "Skip compaction since UID is active for  " + proc.processName);
            }
        if (force || !app.mOptRecord.hasPendingCompact()) {
            Trace.instantForTrack(Trace.TRACE_TAG_ACTIVITY_MANAGER, ATRACE_COMPACTION_TRACK,
                    "compactAppSome " + app.processName != null ? app.processName : "");
            app.mOptRecord.setHasPendingCompact(true);
            app.mOptRecord.setForceCompact(force);
            mPendingCompactionProcesses.add(app);
            mCompactionHandler.sendMessage(
                    mCompactionHandler.obtainMessage(
                    COMPACT_PROCESS_MSG, app.mState.getSetAdj(), app.mState.getSetProcState()));
            return false;
        }

        if (proc.mState.hasForegroundActivities()) {
            if (DEBUG_COMPACTION) {
                Slog.e(TAG_AM,
                        "Skip compaction as process " + proc.processName
                                + " has foreground activities");
            }
            return false;
        }

        return true;
    }

    @GuardedBy("mProcLock")
@@ -508,19 +522,7 @@ public final class CachedAppOptimizer {
        // Apply OOM adj score throttle for Full App Compaction.
        if (force || oomAdjEnteredCached) {
            app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_FULL);
            if (!app.mOptRecord.hasPendingCompact()) {
                Trace.instantForTrack(Trace.TRACE_TAG_ACTIVITY_MANAGER, ATRACE_COMPACTION_TRACK,
                        "compactAppFull " + app.processName != null ? app.processName : "");
                app.mOptRecord.setHasPendingCompact(true);
                app.mOptRecord.setForceCompact(force);
                mPendingCompactionProcesses.add(app);
                mCompactionHandler.sendMessage(mCompactionHandler.obtainMessage(
                        COMPACT_PROCESS_MSG, app.mState.getSetAdj(), app.mState.getSetProcState()));
            } else if (DEBUG_COMPACTION) {
                Slog.d(TAG_AM,
                        " compactAppFull Skipped for " + app.processName
                                + " since it has a pending compact");
            }
            compactApp(app, force, "Full");
        } else {
            if (DEBUG_COMPACTION) {
                Slog.d(TAG_AM, "Skipping full compaction for " + app.processName
@@ -533,15 +535,34 @@ public final class CachedAppOptimizer {
    @GuardedBy("mProcLock")
    void compactAppPersistent(ProcessRecord app) {
        app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_PERSISTENT);
        if (!app.mOptRecord.hasPendingCompact()) {
        compactApp(app, false, "Persistent");
    }

    @GuardedBy("mProcLock")
    boolean compactApp(ProcessRecord app, boolean force, String compactRequestType) {
        if (!app.mOptRecord.hasPendingCompact() && meetsCompactionRequirements(app)) {
            final String processName = (app.processName != null ? app.processName : "");
            if (DEBUG_COMPACTION) {
                Slog.d(TAG_AM, "compactApp " + compactRequestType + " " + processName);
            }
            Trace.instantForTrack(Trace.TRACE_TAG_ACTIVITY_MANAGER, ATRACE_COMPACTION_TRACK,
                    "compactAppPersistent " + app.processName != null ? app.processName : "");
                    "compactApp " + compactRequestType + " " + processName);
            app.mOptRecord.setHasPendingCompact(true);
            app.mOptRecord.setForceCompact(force);
            mPendingCompactionProcesses.add(app);
            mCompactionHandler.sendMessage(
                    mCompactionHandler.obtainMessage(
            mCompactionHandler.sendMessage(mCompactionHandler.obtainMessage(
                    COMPACT_PROCESS_MSG, app.mState.getCurAdj(), app.mState.getSetProcState()));
            return true;
        }

        if (DEBUG_COMPACTION) {
            Slog.d(TAG_AM,
                    " compactApp Skipped for " + app.processName
                            + " pendingCompact= " + app.mOptRecord.hasPendingCompact()
                            + " meetsCompactionRequirements=" + meetsCompactionRequirements(app)
                            + ". Requested compact: " + app.mOptRecord.getReqCompactAction());
        }
        return false;
    }

    @GuardedBy("mProcLock")
@@ -553,15 +574,7 @@ public final class CachedAppOptimizer {
    @GuardedBy("mProcLock")
    void compactAppBfgs(ProcessRecord app) {
        app.mOptRecord.setReqCompactAction(COMPACT_PROCESS_BFGS);
        if (!app.mOptRecord.hasPendingCompact()) {
            Trace.instantForTrack(Trace.TRACE_TAG_ACTIVITY_MANAGER, ATRACE_COMPACTION_TRACK,
                    "compactAppBfgs " + app.processName != null ? app.processName : "");
            app.mOptRecord.setHasPendingCompact(true);
            mPendingCompactionProcesses.add(app);
            mCompactionHandler.sendMessage(
                    mCompactionHandler.obtainMessage(
                    COMPACT_PROCESS_MSG, app.mState.getCurAdj(), app.mState.getSetProcState()));
        }
        compactApp(app, false, " Bfgs");
    }

    @GuardedBy("mProcLock")
@@ -572,6 +585,9 @@ public final class CachedAppOptimizer {

    void compactAllSystem() {
        if (useCompaction()) {
            if (DEBUG_COMPACTION) {
                Slog.d(TAG_AM, "compactAllSystem");
            }
            Trace.instantForTrack(
                    Trace.TRACE_TAG_ACTIVITY_MANAGER, ATRACE_COMPACTION_TRACK, "compactAllSystem");
            mCompactionHandler.sendMessage(mCompactionHandler.obtainMessage(
@@ -1175,13 +1191,13 @@ public final class CachedAppOptimizer {
            cancelCompaction();
        }

        // Perform a minor compaction when a perceptible app becomes the prev/home app
        // Perform a major compaction when any app enters cached
        if (oldAdj <= ProcessList.PERCEPTIBLE_APP_ADJ
                && (newAdj == ProcessList.PREVIOUS_APP_ADJ || newAdj == ProcessList.HOME_APP_ADJ)) {
            // Perform a minor compaction when a perceptible app becomes the prev/home app
            compactAppSome(app, false);
        } else if (newAdj >= ProcessList.CACHED_APP_MIN_ADJ
                && newAdj <= ProcessList.CACHED_APP_MAX_ADJ) {
            // Perform a major compaction when any app enters cached
            compactAppFull(app, false);
        }
    }
@@ -1241,12 +1257,6 @@ public final class CachedAppOptimizer {

        private boolean shouldOomAdjThrottleCompaction(ProcessRecord proc, int action) {
            final String name = proc.processName;
            if (mAm.mInternal.isPendingTopUid(proc.uid)) {
                // In case the OOM Adjust has not yet been propagated we see if this is
                // pending on becoming top app in which case we should not compact.
                Slog.e(TAG_AM, "Skip compaction since UID is active for  " + name);
                return true;
            }

            // don't compact if the process has returned to perceptible
            // and this is only a cached/home/prev compaction
+15 −14
Original line number Diff line number Diff line
@@ -2556,8 +2556,9 @@ public class OomAdjuster {
            // reminder: here, setAdj is previous state, curAdj is upcoming state
            if (state.getCurAdj() != state.getSetAdj()) {
                mCachedAppOptimizer.onOomAdjustChanged(state.getSetAdj(), state.getCurAdj(), app);
            } else if (mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE
                    && state.getSetAdj() < ProcessList.FOREGROUND_APP_ADJ
            } else if (mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE) {
                // See if we can compact persistent and bfgs services now that screen is off
                if (state.getSetAdj() < ProcessList.FOREGROUND_APP_ADJ
                        && !state.isRunningRemoteAnimation()
                        // Because these can fire independent of oom_adj/procstate changes, we need
                        // to throttle the actual dispatch of these requests in addition to the
@@ -2565,13 +2566,13 @@ public class OomAdjuster {
                        // and in CachedAppOptimizer.
                        && mCachedAppOptimizer.shouldCompactPersistent(app, now)) {
                    mCachedAppOptimizer.compactAppPersistent(app);
            } else if (mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE
                    && state.getCurProcState()
                } else if (state.getCurProcState()
                                == ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
                        && mCachedAppOptimizer.shouldCompactBFGS(app, now)) {
                    mCachedAppOptimizer.compactAppBfgs(app);
                }
            }
        }

        if (state.getCurAdj() != state.getSetAdj()) {
            ProcessList.setOomAdj(app.getPid(), app.uid, state.getCurAdj());