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

Commit f50babe9 authored by Tim Murray's avatar Tim Murray Committed by Automerger Merge Worker
Browse files

Merge "Add support for modern trim memory dispatch." into udc-dev am: 1a6fb928

parents 7b15357c 1a6fb928
Loading
Loading
Loading
Loading
+16 −0
Original line number Original line Diff line number Diff line
@@ -151,6 +151,7 @@ final class ActivityManagerConstants extends ContentObserver {


    static final String KEY_USE_TIERED_CACHED_ADJ = "use_tiered_cached_adj";
    static final String KEY_USE_TIERED_CACHED_ADJ = "use_tiered_cached_adj";
    static final String KEY_TIERED_CACHED_ADJ_DECAY_TIME = "tiered_cached_adj_decay_time";
    static final String KEY_TIERED_CACHED_ADJ_DECAY_TIME = "tiered_cached_adj_decay_time";
    static final String KEY_USE_MODERN_TRIM = "use_modern_trim";


    private static final int DEFAULT_MAX_CACHED_PROCESSES = 1024;
    private static final int DEFAULT_MAX_CACHED_PROCESSES = 1024;
    private static final boolean DEFAULT_PRIORITIZE_ALARM_BROADCASTS = true;
    private static final boolean DEFAULT_PRIORITIZE_ALARM_BROADCASTS = true;
@@ -212,6 +213,8 @@ final class ActivityManagerConstants extends ContentObserver {
    private static final boolean DEFAULT_USE_TIERED_CACHED_ADJ = false;
    private static final boolean DEFAULT_USE_TIERED_CACHED_ADJ = false;
    private static final long DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME = 60 * 1000;
    private static final long DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME = 60 * 1000;


    private static final boolean DEFAULT_USE_MODERN_TRIM = false;

    /**
    /**
     * Same as {@link TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_NOT_ALLOWED}
     * Same as {@link TEMPORARY_ALLOW_LIST_TYPE_FOREGROUND_SERVICE_NOT_ALLOWED}
     */
     */
@@ -1052,6 +1055,9 @@ final class ActivityManagerConstants extends ContentObserver {
    /** @see #KEY_TIERED_CACHED_ADJ_DECAY_TIME */
    /** @see #KEY_TIERED_CACHED_ADJ_DECAY_TIME */
    public long TIERED_CACHED_ADJ_DECAY_TIME = DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME;
    public long TIERED_CACHED_ADJ_DECAY_TIME = DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME;


    /** @see #KEY_USE_MODERN_TRIM */
    public boolean USE_MODERN_TRIM = DEFAULT_USE_MODERN_TRIM;

    private final OnPropertiesChangedListener mOnDeviceConfigChangedListener =
    private final OnPropertiesChangedListener mOnDeviceConfigChangedListener =
            new OnPropertiesChangedListener() {
            new OnPropertiesChangedListener() {
                @Override
                @Override
@@ -1227,6 +1233,9 @@ final class ActivityManagerConstants extends ContentObserver {
                            case KEY_TIERED_CACHED_ADJ_DECAY_TIME:
                            case KEY_TIERED_CACHED_ADJ_DECAY_TIME:
                                updateUseTieredCachedAdj();
                                updateUseTieredCachedAdj();
                                break;
                                break;
                            case KEY_USE_MODERN_TRIM:
                                updateUseModernTrim();
                                break;
                            default:
                            default:
                                updateFGSPermissionEnforcementFlagsIfNecessary(name);
                                updateFGSPermissionEnforcementFlagsIfNecessary(name);
                                break;
                                break;
@@ -1997,6 +2006,13 @@ final class ActivityManagerConstants extends ContentObserver {
            DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME);
            DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME);
    }
    }


    private void updateUseModernTrim() {
        USE_MODERN_TRIM = DeviceConfig.getBoolean(
            DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
            KEY_USE_MODERN_TRIM,
            DEFAULT_USE_MODERN_TRIM);
    }

    private void updateFGSPermissionEnforcementFlagsIfNecessary(@NonNull String name) {
    private void updateFGSPermissionEnforcementFlagsIfNecessary(@NonNull String name) {
        ForegroundServiceTypePolicy.getDefaultPolicy()
        ForegroundServiceTypePolicy.getDefaultPolicy()
                .updatePermissionEnforcementFlagIfNecessary(name);
                .updatePermissionEnforcementFlagIfNecessary(name);
+31 −0
Original line number Original line Diff line number Diff line
@@ -1005,6 +1005,37 @@ public class AppProfiler {
            mBgHandler.obtainMessage(BgHandler.MEMORY_PRESSURE_CHANGED, mLastMemoryLevel, memFactor)
            mBgHandler.obtainMessage(BgHandler.MEMORY_PRESSURE_CHANGED, mLastMemoryLevel, memFactor)
                    .sendToTarget();
                    .sendToTarget();
        }
        }

        if (mService.mConstants.USE_MODERN_TRIM) {
            // Modern trim is not sent based on lowmem state
            // Dispatch UI_HIDDEN to processes that need it
            mService.mProcessList.forEachLruProcessesLOSP(true, app -> {
                final ProcessProfileRecord profile = app.mProfile;
                final IApplicationThread thread;
                final ProcessStateRecord state = app.mState;
                if (state.hasProcStateChanged()) {
                    state.setProcStateChanged(false);
                }
                int procState = app.mState.getCurProcState();
                if (((procState >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
                        && procState < ActivityManager.PROCESS_STATE_CACHED_ACTIVITY)
                        || app.mState.isSystemNoUi()) && app.mProfile.hasPendingUiClean()) {
                    // If this application is now in the background and it
                    // had done UI, then give it the special trim level to
                    // have it free UI resources.
                    if ((thread = app.getThread()) != null) {
                        try {
                            thread.scheduleTrimMemory(ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN);
                            app.mProfile.setPendingUiClean(false);
                        } catch (RemoteException e) {

                        }
                    }
                }
            });
            return false;
        }

        mLastMemoryLevel = memFactor;
        mLastMemoryLevel = memFactor;
        mLastNumProcesses = mService.mProcessList.getLruSizeLOSP();
        mLastNumProcesses = mService.mProcessList.getLruSizeLOSP();
        boolean allChanged;
        boolean allChanged;
+14 −0
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.am;


import static android.app.ActivityManager.UidFrozenStateChangedCallback.UID_FROZEN_STATE_FROZEN;
import static android.app.ActivityManager.UidFrozenStateChangedCallback.UID_FROZEN_STATE_FROZEN;
import static android.app.ActivityManager.UidFrozenStateChangedCallback.UID_FROZEN_STATE_UNFROZEN;
import static android.app.ActivityManager.UidFrozenStateChangedCallback.UID_FROZEN_STATE_UNFROZEN;
import static android.content.ComponentCallbacks2.TRIM_MEMORY_BACKGROUND;


import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_COMPACTION;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_COMPACTION;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FREEZER;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FREEZER;
@@ -27,12 +28,14 @@ import android.annotation.IntDef;
import android.app.ActivityManager;
import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.ActivityThread;
import android.app.ApplicationExitInfo;
import android.app.ApplicationExitInfo;
import android.app.IApplicationThread;
import android.database.ContentObserver;
import android.database.ContentObserver;
import android.net.Uri;
import android.net.Uri;
import android.os.Handler;
import android.os.Handler;
import android.os.Message;
import android.os.Message;
import android.os.PowerManagerInternal;
import android.os.PowerManagerInternal;
import android.os.Process;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.SystemClock;
import android.os.Trace;
import android.os.Trace;
import android.provider.DeviceConfig;
import android.provider.DeviceConfig;
@@ -1231,6 +1234,17 @@ public final class CachedAppOptimizer {
            return;
            return;
        }
        }


        if (mAm.mConstants.USE_MODERN_TRIM
                && app.mState.getSetAdj() >= ProcessList.CACHED_APP_MIN_ADJ) {
            final IApplicationThread thread = app.getThread();
            if (thread != null) {
                try {
                    thread.scheduleTrimMemory(TRIM_MEMORY_BACKGROUND);
                } catch (RemoteException e) {
                    // do nothing
                }
            }
        }
        mFreezeHandler.sendMessageDelayed(
        mFreezeHandler.sendMessageDelayed(
                mFreezeHandler.obtainMessage(
                mFreezeHandler.obtainMessage(
                    SET_FROZEN_PROCESS_MSG, DO_FREEZE, 0, app),
                    SET_FROZEN_PROCESS_MSG, DO_FREEZE, 0, app),