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

Commit 4fa18de5 authored by Suprabh Shukla's avatar Suprabh Shukla Committed by Android (Google) Code Review
Browse files

Merge "Make FREEZER_CUTOFF_OOMADJ configurable" into main

parents 31b8de43 93c16d3f
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -485,6 +485,11 @@ public abstract class ActivityManagerInternal {
     */
    public static final int OOM_ADJ_REASON_FOLLOW_UP = 23;

    /**
     * Oom Adj Reason: Update after oom adjuster configuration has changed.
     */
    public static final int OOM_ADJ_REASON_RECONFIGURATION = 24;

    @IntDef(prefix = {"OOM_ADJ_REASON_"}, value = {
        OOM_ADJ_REASON_NONE,
        OOM_ADJ_REASON_ACTIVITY,
@@ -510,6 +515,7 @@ public abstract class ActivityManagerInternal {
        OOM_ADJ_REASON_RESTRICTION_CHANGE,
        OOM_ADJ_REASON_COMPONENT_DISABLED,
        OOM_ADJ_REASON_FOLLOW_UP,
        OOM_ADJ_REASON_RECONFIGURATION,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface OomAdjReason {}
+36 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server.am;

import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_RECONFIGURATION;
import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_CONNECTED_DEVICE;
import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_HEALTH;
import static android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION;
@@ -31,6 +32,7 @@ import static com.android.server.am.BroadcastConstants.DEFER_BOOT_COMPLETED_BROA
import static com.android.server.am.BroadcastConstants.getDeviceConfigBoolean;

import android.annotation.NonNull;
import android.app.ActivityManagerInternal;
import android.app.ActivityThread;
import android.app.ForegroundServiceTypePolicy;
import android.content.ComponentName;
@@ -55,6 +57,7 @@ import android.util.SparseBooleanArray;

import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
import com.android.server.LocalServices;

import dalvik.annotation.optimization.NeverCompile;

@@ -181,6 +184,12 @@ final class ActivityManagerConstants extends ContentObserver {
    static final String KEY_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION =
            "follow_up_oomadj_update_wait_duration";

    /*
     * Oom score cutoff beyond which any process that does not have the CPU_TIME capability will be
     * frozen.
     */
    static final String KEY_FREEZER_CUTOFF_ADJ = "freezer_cutoff_adj";

    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;
@@ -267,6 +276,9 @@ final class ActivityManagerConstants extends ContentObserver {
     */
    private static final long DEFAULT_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION = 1000L;

    /** The default value to {@link #KEY_FREEZER_CUTOFF_ADJ} */
    private static final int DEFAULT_FREEZER_CUTOFF_ADJ = ProcessList.CACHED_APP_MIN_ADJ;

    /**
     * Same as {@link TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_NOT_ALLOWED}
     */
@@ -1170,6 +1182,14 @@ final class ActivityManagerConstants extends ContentObserver {
    public long FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION =
            DEFAULT_FOLLOW_UP_OOMADJ_UPDATE_WAIT_DURATION;

    /**
     * The cutoff adj for the freezer, app processes with adj greater than this value will be
     * eligible for the freezer.
     *
     * @see #KEY_FREEZER_CUTOFF_ADJ
     */
    public int FREEZER_CUTOFF_ADJ = DEFAULT_FREEZER_CUTOFF_ADJ;

    /**
     * Indicates whether PSS profiling in AppProfiler is disabled or not.
     */
@@ -1194,6 +1214,7 @@ final class ActivityManagerConstants extends ContentObserver {
            new OnPropertiesChangedListener() {
                @Override
                public void onPropertiesChanged(Properties properties) {
                    boolean oomAdjusterConfigUpdated = false;
                    for (String name : properties.getKeyset()) {
                        if (name == null) {
                            return;
@@ -1372,6 +1393,11 @@ final class ActivityManagerConstants extends ContentObserver {
                            case KEY_TIERED_CACHED_ADJ_UI_TIER_SIZE:
                                updateUseTieredCachedAdj();
                                break;
                            case KEY_FREEZER_CUTOFF_ADJ:
                                FREEZER_CUTOFF_ADJ = properties.getInt(KEY_FREEZER_CUTOFF_ADJ,
                                        DEFAULT_FREEZER_CUTOFF_ADJ);
                                oomAdjusterConfigUpdated = true;
                                break;
                            case KEY_DISABLE_APP_PROFILER_PSS_PROFILING:
                                updateDisableAppProfilerPssProfiling();
                                break;
@@ -1389,6 +1415,13 @@ final class ActivityManagerConstants extends ContentObserver {
                                break;
                        }
                    }
                    if (oomAdjusterConfigUpdated) {
                        final ActivityManagerInternal ami = LocalServices.getService(
                                ActivityManagerInternal.class);
                        if (ami != null) {
                            ami.updateOomAdj(OOM_ADJ_REASON_RECONFIGURATION);
                        }
                    }
                }
            };

@@ -2534,6 +2567,9 @@ final class ActivityManagerConstants extends ContentObserver {
        pw.print("  "); pw.print(KEY_ENABLE_NEW_OOMADJ);
        pw.print("="); pw.println(ENABLE_NEW_OOMADJ);

        pw.print("  "); pw.print(KEY_FREEZER_CUTOFF_ADJ);
        pw.print("="); pw.println(FREEZER_CUTOFF_ADJ);

        pw.print("  "); pw.print(KEY_DISABLE_APP_PROFILER_PSS_PROFILING);
        pw.print("="); pw.println(APP_PROFILER_PSS_PROFILING_DISABLED);

+14 −2
Original line number Diff line number Diff line
@@ -25,9 +25,11 @@ 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_PROCESS_BEGIN;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_PROCESS_END;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_RECONFIGURATION;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_REMOVE_PROVIDER;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_REMOVE_TASK;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_RESTRICTION_CHANGE;
@@ -203,6 +205,10 @@ public class CachedAppOptimizer {
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_RESTRICTION_CHANGE;
    static final int UNFREEZE_REASON_COMPONENT_DISABLED =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_COMPONENT_DISABLED;
    static final int UNFREEZE_REASON_OOM_ADJ_FOLLOW_UP =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_OOM_ADJ_FOLLOW_UP;
    static final int UNFREEZE_REASON_OOM_ADJ_RECONFIGURATION =
            FrameworkStatsLog.APP_FREEZE_CHANGED__UNFREEZE_REASON_V2__UFR_OOM_ADJ_RECONFIGURATION;

    @IntDef(prefix = {"UNFREEZE_REASON_"}, value = {
        UNFREEZE_REASON_NONE,
@@ -234,6 +240,8 @@ public class CachedAppOptimizer {
        UNFREEZE_REASON_EXECUTING_SERVICE,
        UNFREEZE_REASON_RESTRICTION_CHANGE,
        UNFREEZE_REASON_COMPONENT_DISABLED,
        UNFREEZE_REASON_OOM_ADJ_FOLLOW_UP,
        UNFREEZE_REASON_OOM_ADJ_RECONFIGURATION,
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface UnfreezeReason {}
@@ -2451,8 +2459,8 @@ public class CachedAppOptimizer {
                            synchronized (mAm.mPidsSelfLocked) {
                                pr = mAm.mPidsSelfLocked.get(blocked);
                            }
                            if (pr != null
                                    && pr.mState.getCurAdj() < ProcessList.FREEZER_CUTOFF_ADJ) {
                            if (pr != null && pr.mState.getCurAdj()
                                    < mAm.mConstants.FREEZER_CUTOFF_ADJ) {
                                Slog.d(TAG_AM, app.processName + " (" + pid + ") blocks "
                                        + pr.processName + " (" + blocked + ")");
                                // Found at least one blocked non-cached process
@@ -2539,6 +2547,10 @@ public class CachedAppOptimizer {
                return UNFREEZE_REASON_RESTRICTION_CHANGE;
            case OOM_ADJ_REASON_COMPONENT_DISABLED:
                return UNFREEZE_REASON_COMPONENT_DISABLED;
            case OOM_ADJ_REASON_FOLLOW_UP:
                return UNFREEZE_REASON_OOM_ADJ_FOLLOW_UP;
            case OOM_ADJ_REASON_RECONFIGURATION:
                return UNFREEZE_REASON_OOM_ADJ_RECONFIGURATION;
            default:
                return UNFREEZE_REASON_NONE;
        }
+8 −5
Original line number Diff line number Diff line
@@ -55,6 +55,7 @@ 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;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_PROCESS_END;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_RECONFIGURATION;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_REMOVE_PROVIDER;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_REMOVE_TASK;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_RESTRICTION_CHANGE;
@@ -105,7 +106,6 @@ import static com.android.server.am.ProcessList.CACHED_APP_IMPORTANCE_LEVELS;
import static com.android.server.am.ProcessList.CACHED_APP_MAX_ADJ;
import static com.android.server.am.ProcessList.CACHED_APP_MIN_ADJ;
import static com.android.server.am.ProcessList.FOREGROUND_APP_ADJ;
import static com.android.server.am.ProcessList.FREEZER_CUTOFF_ADJ;
import static com.android.server.am.ProcessList.HEAVY_WEIGHT_APP_ADJ;
import static com.android.server.am.ProcessList.HOME_APP_ADJ;
import static com.android.server.am.ProcessList.INVALID_ADJ;
@@ -232,6 +232,8 @@ public class OomAdjuster {
                return AppProtoEnums.OOM_ADJ_REASON_COMPONENT_DISABLED;
            case OOM_ADJ_REASON_FOLLOW_UP:
                return AppProtoEnums.OOM_ADJ_REASON_FOLLOW_UP;
            case OOM_ADJ_REASON_RECONFIGURATION:
                return AppProtoEnums.OOM_ADJ_REASON_RECONFIGURATION;
            default:
                return AppProtoEnums.OOM_ADJ_REASON_UNKNOWN_TO_PROTO;
        }
@@ -288,6 +290,8 @@ public class OomAdjuster {
                return OOM_ADJ_REASON_METHOD + "_componentDisabled";
            case OOM_ADJ_REASON_FOLLOW_UP:
                return OOM_ADJ_REASON_METHOD + "_followUp";
            case OOM_ADJ_REASON_RECONFIGURATION:
                return OOM_ADJ_REASON_METHOD + "_reconfiguration";
            default:
                return "_unknown";
        }
@@ -4079,7 +4083,7 @@ public class OomAdjuster {
        }

        // Reasons to freeze:
        if (proc.mState.getCurAdj() >= FREEZER_CUTOFF_ADJ) {
        if (proc.mState.getCurAdj() >= mConstants.FREEZER_CUTOFF_ADJ) {
            // Oomscore is in a high enough state, it is safe to freeze.
            return true;
        }
@@ -4098,9 +4102,8 @@ public class OomAdjuster {
        final ProcessCachedOptimizerRecord opt = app.mOptRecord;
        final ProcessStateRecord state = app.mState;
        if (Flags.traceUpdateAppFreezeStateLsp()) {
            final boolean oomAdjChanged =
                    (state.getCurAdj() >= FREEZER_CUTOFF_ADJ ^ oldOomAdj >= FREEZER_CUTOFF_ADJ)
                    || oldOomAdj == UNKNOWN_ADJ;
            final boolean oomAdjChanged = (state.getCurAdj() >= mConstants.FREEZER_CUTOFF_ADJ
                    ^ oldOomAdj >= mConstants.FREEZER_CUTOFF_ADJ) || oldOomAdj == UNKNOWN_ADJ;
            final boolean shouldNotFreezeChanged = opt.shouldNotFreezeAdjSeq() == mAdjSeq;
            final boolean hasCpuCapability =
                    (PROCESS_CAPABILITY_CPU_TIME & app.mState.getCurCapability())
+0 −6
Original line number Diff line number Diff line
@@ -382,12 +382,6 @@ public final class ProcessList {
    // lmkd reconnect delay in msecs
    private static final long LMKD_RECONNECT_DELAY_MS = 1000;

    /**
     * The cuttoff adj for the freezer, app processes with adj greater than this value will be
     * eligible for the freezer.
     */
    static final int FREEZER_CUTOFF_ADJ = CACHED_APP_MIN_ADJ;

    /**
     * Apps have no access to the private data directories of any other app, even if the other
     * app has made them world-readable.
Loading