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

Commit bef281e4 authored by Michael Wachenschwanz's avatar Michael Wachenschwanz Committed by Android (Google) Code Review
Browse files

Merge "Automatically trigger OomAdjuster updates for Backup" into main

parents c0f0f378 088649ae
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -14189,8 +14189,12 @@ public class ActivityManagerService extends IActivityManager.Stub
            proc.mProfile.addHostingComponentType(HOSTING_COMPONENT_TYPE_BACKUP);
            if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) {
                // Do nothing, ProcessStateController will handle the update in setBackupTarget.
            } else {
                // Try not to kill the process during backup
                updateOomAdjLocked(proc, OOM_ADJ_REASON_BACKUP);
            }
            // If the process is already attached, schedule the creation of the backup agent now.
            // If it is not yet live, this will be done when it attaches to the framework.
@@ -14316,9 +14320,15 @@ public class ActivityManagerService extends IActivityManager.Stub
                // Not backing this app up any more; reset its OOM adjustment
                final ProcessRecord proc = backupTarget.app;
                if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) {
                    // Do nothing.
                    // ProcessStateController will handle the update in stopBackupTarget.
                } else {
                    // TODO(b/369300367): Triggering the update before the state is actually set
                    //  seems wrong.
                    updateOomAdjLocked(proc, OOM_ADJ_REASON_BACKUP);
                }
                proc.setInFullBackup(false);
                proc.mProfile.clearHostingComponentType(HOSTING_COMPONENT_TYPE_BACKUP);
+17 −2
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_ACTIVITY;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_BACKUP;
import static android.app.ActivityManagerInternal.OOM_ADJ_REASON_SERVICE_BINDER_CALL;
import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_BROADCAST_RECEIVER;

@@ -108,7 +109,7 @@ public class ProcessStateController {
     * Add a process to evaluated the next time an update is run.
     */
    @GuardedBy("mLock")
    public void enqueueUpdateTarget(@NonNull ProcessRecord proc) {
    public void enqueueUpdateTarget(@Nullable ProcessRecord proc) {
        mOomAdjuster.enqueueOomAdjTargetLocked(proc);
    }

@@ -313,7 +314,15 @@ public class ProcessStateController {
     */
    @GuardedBy("mLock")
    public void setBackupTarget(@NonNull ProcessRecord proc, @UserIdInt int userId) {
        final ProcessRecord prev = mGlobalState.mBackupTargets.get(userId);
        if (prev == proc) return;
        mGlobalState.mBackupTargets.put(userId, proc);

        if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) {
            enqueueUpdateTarget(prev);
            enqueueUpdateTarget(proc);
            runPendingUpdate(OOM_ADJ_REASON_BACKUP);
        }
    }

    /**
@@ -321,7 +330,13 @@ public class ProcessStateController {
     */
    @GuardedBy("mLock")
    public void stopBackupTarget(@UserIdInt int userId) {
        mGlobalState.mBackupTargets.delete(userId);
        final ProcessRecord prev = mGlobalState.mBackupTargets.removeReturnOld(userId);
        if (prev == null) return;

        if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) {
            enqueueUpdateTarget(prev);
            runPendingUpdate(OOM_ADJ_REASON_BACKUP);
        }
    }

    /**
+34 −8
Original line number Diff line number Diff line
@@ -1575,14 +1575,28 @@ public class MockingOomAdjusterTests {
    public void testUpdateOomAdj_DoOne_Backup() {
        ProcessRecord app = makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME,
                MOCKAPP_PACKAGENAME, true);
        setBackupTarget(app);
        setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE);
        setBackupTarget(app);
        if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) {
            // Do not manually run the update.
        } else {
            updateOomAdj(app);
        doReturn(null).when(mService.mBackupTargets).get(anyInt());

        }
        assertProcStates(app, PROCESS_STATE_TRANSIENT_BACKGROUND, BACKUP_APP_ADJ,
                SCHED_GROUP_BACKGROUND);
        assertThatProcess(app).hasImplicitCpuTimeCapability();

        stopBackupTarget(app.userId);
        if (Flags.pushGlobalStateToOomadjuster() && Flags.autoTriggerOomadjUpdates()) {
            // Do not manually run the update.
        } else {
            updateOomAdj(app);
        }
        final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ
                ? sFirstUiCachedAdj : sFirstCachedAdj;
        assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj,
                SCHED_GROUP_BACKGROUND);
        assertThatProcess(app).notHasImplicitCpuTimeCapability();
    }

    @SuppressWarnings("GuardedBy")
@@ -4458,17 +4472,20 @@ public class MockingOomAdjusterTests {

    private ProcessRecord makeDefaultProcessRecord(int pid, int uid, String processName,
            String packageName, boolean hasShownUi) {
        return new ProcessRecordBuilder(pid, uid, processName, packageName).setHasShownUi(
                hasShownUi).build();
        final ProcessRecord proc = new ProcessRecordBuilder(pid, uid, processName,
                packageName).setHasShownUi(hasShownUi).build();
        updateProcessLru(proc);
        return proc;
    }

    private ProcessRecord makeSpiedProcessRecord(int pid, int uid, String processName,
            String packageName, boolean hasShownUi) {
        final ProcessRecord proc = spy(
                makeDefaultProcessRecord(pid, uid, processName, packageName, hasShownUi));
        final ProcessRecord proc = spy(new ProcessRecordBuilder(pid, uid, processName,
                packageName).setHasShownUi(hasShownUi).build());
        final WindowProcessController wpc = proc.getWindowProcessController();
        // Need to overwrite the WindowProcessController.mOwner with the new spy object
        setFieldValue(WindowProcessController.class, wpc, "mOwner", proc);
        updateProcessLru(proc);
        return proc;
    }

@@ -4628,6 +4645,15 @@ public class MockingOomAdjusterTests {
        }
    }

    @SuppressWarnings("GuardedBy")
    private void stopBackupTarget(int userId) {
        if (Flags.pushGlobalStateToOomadjuster()) {
            mProcessStateController.stopBackupTarget(userId);
        } else {
            doReturn(null).when(mService.mBackupTargets).get(anyInt());
        }
    }

    private void setHasActivity(WindowProcessController wpc, boolean hasActivity) {
        if (Flags.pushActivityStateToOomadjuster()) {
            mActivityStateAsyncUpdater.setHasActivityAsync(wpc, hasActivity);