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

Commit af61ad5d authored by Hui Yu's avatar Hui Yu
Browse files

Set unfreeze_reason to statsd atom AppFreezeChanged.

Bug: 243074242
Test: statsd_testdrive 254
Change-Id: Id10b034c85d8c02cec43caef29d73c9185b628d4
Merged-In: Id10b034c85d8c02cec43caef29d73c9185b628d4
parent 9d16d9da
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -17385,7 +17385,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
+8 −5
Original line number Diff line number Diff line
@@ -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;
@@ -347,7 +349,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);
@@ -960,10 +962,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 {
@@ -1244,7 +1247,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
@@ -1326,7 +1329,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) {
+54 −28
Original line number Diff line number Diff line
@@ -38,6 +38,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;

@@ -719,7 +720,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);
@@ -1030,11 +1031,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, String reason) {
        if (mUseFreezer) {
            synchronized (mProcLock) {
                if (app.mOptRecord.isFrozen() || app.mOptRecord.isPendingFreeze()) {
                    unfreezeAppLSP(app);
                    unfreezeAppLSP(app, reason);
                    freezeAppAsyncLSP(app);
                }
            }
@@ -1060,7 +1061,7 @@ public final class CachedAppOptimizer {
    }

    @GuardedBy({"mAm", "mProcLock", "mFreezerLock"})
    void unfreezeAppInternalLSP(ProcessRecord app) {
    void unfreezeAppInternalLSP(ProcessRecord app, String reason) {
        final int pid = app.getPid();
        final ProcessCachedOptimizerRecord opt = app.mOptRecord;
        if (opt.isPendingFreeze()) {
@@ -1141,14 +1142,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, String>(app.processName, reason)));
        }
    }

    @GuardedBy({"mAm", "mProcLock"})
    void unfreezeAppLSP(ProcessRecord app) {
    void unfreezeAppLSP(ProcessRecord app, String reason) {
        synchronized (mFreezerLock) {
            unfreezeAppInternalLSP(app);
            unfreezeAppInternalLSP(app, reason);
        }
    }

@@ -1159,25 +1160,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, String 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);
        }
    }

@@ -1628,9 +1618,11 @@ public final class CachedAppOptimizer {
                case REPORT_UNFREEZE_MSG:
                    int pid = msg.arg1;
                    int frozenDuration = msg.arg2;
                    String processName = (String) msg.obj;
                    Pair<String, String> obj = (Pair<String, String>) msg.obj;
                    String processName = obj.first;
                    String reason = obj.second;

                    reportUnfreeze(pid, frozenDuration, processName);
                    reportUnfreeze(pid, frozenDuration, processName, reason);
                    break;
                default:
                    return;
@@ -1641,7 +1633,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);
        }

@@ -1729,7 +1721,8 @@ public final class CachedAppOptimizer {
                        FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__FREEZE_APP,
                        pid,
                        name,
                        unfrozenDuration);
                        unfrozenDuration,
                        FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON__NONE);
            }

            try {
@@ -1759,12 +1752,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,
                String reason) {

            EventLog.writeEvent(EventLogTags.AM_UNFREEZE, pid, processName);

@@ -1775,7 +1769,39 @@ public final class CachedAppOptimizer {
                        FrameworkStatsLog.APP_FREEZE_CHANGED__ACTION__UNFREEZE_APP,
                        pid,
                        processName,
                        frozenDuration);
                        frozenDuration,
                        getUnfreezeReasonCode(reason));
            }
        }

        private int getUnfreezeReasonCode(String 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;
            }
        }

@@ -1789,7 +1815,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);
                }
            }
        }
+13 −12
Original line number Diff line number Diff line
@@ -367,7 +367,7 @@ public class OomAdjuster {
     */
    @GuardedBy({"mService", "mProcLock"})
    private boolean performUpdateOomAdjLSP(ProcessRecord app, int cachedAdj,
            ProcessRecord topApp, long now) {
            ProcessRecord topApp, long now, String oomAdjReason) {
        if (app.getThread() == null) {
            return false;
        }
@@ -411,7 +411,7 @@ public class OomAdjuster {
            }
        }

        return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime());
        return applyOomAdjLSP(app, false, now, SystemClock.elapsedRealtime(), oomAdjReason);
    }

    /**
@@ -510,7 +510,7 @@ public class OomAdjuster {
        // Check if this process is in the pending list too, remove from pending list if so.
        mPendingProcessSet.remove(app);
        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
@@ -563,7 +563,7 @@ public class OomAdjuster {
            processes.add(app);
            assignCachedAdjIfNecessary(processes);
            applyOomAdjLSP(app, false, SystemClock.uptimeMillis(),
                    SystemClock.elapsedRealtime());
                    SystemClock.elapsedRealtime(), oomAdjReason);
        }
        mTmpProcessList.clear();
        mService.mOomAdjProfiler.oomAdjEnded();
@@ -857,7 +857,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) {
@@ -1035,7 +1036,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, String oomAdjReason) {
        ArrayList<ProcessRecord> lruList = mProcessList.getLruProcessesLOSP();
        final int numLru = lruList.size();

@@ -1063,7 +1064,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;
@@ -2556,7 +2557,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, String oomAdjReson) {
        boolean success = true;
        final ProcessStateRecord state = app.mState;
        final UidRecord uidRec = app.getUidRecord();
@@ -2713,7 +2714,7 @@ public class OomAdjuster {
            changes |= ActivityManagerService.ProcessChangeItem.CHANGE_ACTIVITIES;
        }

        updateAppFreezeStateLSP(app);
        updateAppFreezeStateLSP(app, oomAdjReson);

        if (state.getReportedProcState() != state.getCurProcState()) {
            state.setReportedProcState(state.getCurProcState());
@@ -3074,7 +3075,7 @@ public class OomAdjuster {
    }

    @GuardedBy({"mService", "mProcLock"})
    private void updateAppFreezeStateLSP(ProcessRecord app) {
    private void updateAppFreezeStateLSP(ProcessRecord app, String oomAdjReason) {
        if (!mCachedAppOptimizer.useFreezer()) {
            return;
        }
@@ -3086,7 +3087,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;
        }

@@ -3096,7 +3097,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);
        }
    }
}