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

Commit 52314935 authored by Michael Wachenschwanz's avatar Michael Wachenschwanz
Browse files

Update ServiceBindingOomAdjPolicy to support CPU_TIME

The introduction of the Cpu Time capabilities decouples freeze state
from the cached state. The ServiceBindingOomAdjPolicy is updated to
always evaluate the freezability of a process.

Flag: com.android.server.am.cpu_time_capability_based_freeze_policy
Bug: 403034947
Test: atest ServiceBindingOomAdjPolicyTest
Change-Id: I46b74bc498e87ccfe8c7253ad556e1963df028b8
parent 30f73993
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -6000,11 +6000,13 @@ public final class ActiveServices {
            if (clientApp == hostApp) {
                policy = DEFAULT_SERVICE_NO_BUMP_BIND_POLICY_FLAG;
            } else if (clientApp.isCached()) {
                if (!Flags.cpuTimeCapabilityBasedFreezePolicy()) {
                    policy = DEFAULT_SERVICE_NO_BUMP_BIND_POLICY_FLAG;
                    if (clientApp.isFreezable()) {
                        policy |= SERVICE_BIND_OOMADJ_POLICY_FREEZE_CALLER;
                    }
                }
            }
            if ((policy & SERVICE_BIND_OOMADJ_POLICY_SKIP_OOM_UPDATE_ON_CONNECT) == 0) {
                // Binding between two different processes.
                // Check if the caller has a better process state, oom adj score,
@@ -6014,6 +6016,12 @@ public final class ActiveServices {
                    policy = DEFAULT_SERVICE_NO_BUMP_BIND_POLICY_FLAG;
                }
            }
            if (Flags.cpuTimeCapabilityBasedFreezePolicy()) {
                // Non cached processes can possibly be frozen, always check their freezability.
                if (clientApp.isFreezable()) {
                    policy |= SERVICE_BIND_OOMADJ_POLICY_FREEZE_CALLER;
                }
            }
        }
        return policy;
    }
+195 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.am;

import static android.app.ActivityManager.PROCESS_CAPABILITY_CPU_TIME;
import static android.app.ActivityManager.PROCESS_CAPABILITY_FOREGROUND_MICROPHONE;
import static android.app.ActivityManager.PROCESS_CAPABILITY_IMPLICIT_CPU_TIME;
import static android.app.ActivityManager.PROCESS_CAPABILITY_NONE;
import static android.app.ActivityManager.PROCESS_STATE_CACHED_EMPTY;
import static android.app.ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
@@ -764,6 +765,200 @@ public final class ServiceBindingOomAdjPolicyTest {
                atLeastOnce(), atLeastOnce());
    }

    @Test
    @EnableFlags(Flags.FLAG_CPU_TIME_CAPABILITY_BASED_FREEZE_POLICY)
    public void testServiceDistinctBindingOomAdjCpuTime() throws Exception {
        // Enable the flags.
        mSetFlagsRule.enableFlags(Flags.FLAG_SERVICE_BINDING_OOM_ADJ_POLICY);

        // Verify the CPU_TIME capability triggers an update.
        performTestServiceDistinctBindingOomAdj(TEST_APP1_PID, TEST_APP1_UID,
                PROCESS_STATE_CACHED_EMPTY, CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_CPU_TIME,
                TEST_APP1_NAME, null,
                TEST_APP2_PID, TEST_APP2_UID, PROCESS_STATE_CACHED_EMPTY,
                CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_NONE, TEST_APP2_NAME, TEST_SERVICE2_NAME,
                null,
                BIND_AUTO_CREATE,
                atLeastOnce(), atLeastOnce());

        // Disable the flags.
        mSetFlagsRule.disableFlags(Flags.FLAG_SERVICE_BINDING_OOM_ADJ_POLICY);

        // Verify that there should be at least 1 oom adj update
        performTestServiceDistinctBindingOomAdj(TEST_APP1_PID, TEST_APP1_UID,
                PROCESS_STATE_CACHED_EMPTY, CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_CPU_TIME,
                TEST_APP1_NAME, null,
                TEST_APP2_PID, TEST_APP2_UID, PROCESS_STATE_CACHED_EMPTY,
                CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_NONE, TEST_APP2_NAME, TEST_SERVICE2_NAME,
                null,
                BIND_AUTO_CREATE,
                atLeastOnce(), atLeastOnce());
    }

    @Test
    @EnableFlags(Flags.FLAG_CPU_TIME_CAPABILITY_BASED_FREEZE_POLICY)
    public void testServiceDistinctBindingOomAdjCpuTime_hostHasCpuTime() throws Exception {
        // Enable the flags.
        mSetFlagsRule.enableFlags(Flags.FLAG_SERVICE_BINDING_OOM_ADJ_POLICY);

        // Verify the CPU_TIME capability does not trigger an update if the host has already it.
        performTestServiceDistinctBindingOomAdj(TEST_APP1_PID, TEST_APP1_UID,
                PROCESS_STATE_CACHED_EMPTY, CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_CPU_TIME,
                TEST_APP1_NAME, null,
                TEST_APP2_PID, TEST_APP2_UID, PROCESS_STATE_CACHED_EMPTY,
                CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_CPU_TIME, TEST_APP2_NAME, TEST_SERVICE2_NAME,
                null,
                BIND_AUTO_CREATE,
                never(), atLeastOnce());

        // Disable the flags.
        mSetFlagsRule.disableFlags(Flags.FLAG_SERVICE_BINDING_OOM_ADJ_POLICY);

        // Verify that there should be at least 1 oom adj update
        performTestServiceDistinctBindingOomAdj(TEST_APP1_PID, TEST_APP1_UID,
                PROCESS_STATE_CACHED_EMPTY, CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_CPU_TIME,
                TEST_APP1_NAME, null,
                TEST_APP2_PID, TEST_APP2_UID, PROCESS_STATE_CACHED_EMPTY,
                CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_CPU_TIME, TEST_APP2_NAME, TEST_SERVICE2_NAME,
                null,
                BIND_AUTO_CREATE,
                atLeastOnce(), atLeastOnce());
    }

    @Test
    @EnableFlags(Flags.FLAG_CPU_TIME_CAPABILITY_BASED_FREEZE_POLICY)
    public void testServiceDistinctBindingOomAdjCpuTime_hostHasImplicitCpuTime() throws Exception {
        // Enable the flags.
        mSetFlagsRule.enableFlags(Flags.FLAG_SERVICE_BINDING_OOM_ADJ_POLICY);

        // Verify the CPU_TIME capability still triggers an update even if the host has the
        // IMPLICIT_CPU_TIME.
        performTestServiceDistinctBindingOomAdj(TEST_APP1_PID, TEST_APP1_UID,
                PROCESS_STATE_CACHED_EMPTY, CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_CPU_TIME,
                TEST_APP1_NAME, null,
                TEST_APP2_PID, TEST_APP2_UID, PROCESS_STATE_CACHED_EMPTY,
                CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_IMPLICIT_CPU_TIME, TEST_APP2_NAME,
                TEST_SERVICE2_NAME,
                null,
                BIND_AUTO_CREATE,
                atLeastOnce(), atLeastOnce());

        // Disable the flags.
        mSetFlagsRule.disableFlags(Flags.FLAG_SERVICE_BINDING_OOM_ADJ_POLICY);

        // Verify that there should be at least 1 oom adj update
        performTestServiceDistinctBindingOomAdj(TEST_APP1_PID, TEST_APP1_UID,
                PROCESS_STATE_CACHED_EMPTY, CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_CPU_TIME,
                TEST_APP1_NAME, null,
                TEST_APP2_PID, TEST_APP2_UID, PROCESS_STATE_CACHED_EMPTY,
                CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_IMPLICIT_CPU_TIME, TEST_APP2_NAME,
                TEST_SERVICE2_NAME,
                null,
                BIND_AUTO_CREATE,
                atLeastOnce(), atLeastOnce());
    }

    @Test
    @EnableFlags(Flags.FLAG_CPU_TIME_CAPABILITY_BASED_FREEZE_POLICY)
    public void testServiceDistinctBindingOomAdjImplicitCpuTime() throws Exception {
        // Enable the flags.
        mSetFlagsRule.enableFlags(Flags.FLAG_SERVICE_BINDING_OOM_ADJ_POLICY);

        // Verify the IMPLICIT_CPU_TIME capability triggers an update.
        performTestServiceDistinctBindingOomAdj(TEST_APP1_PID, TEST_APP1_UID,
                PROCESS_STATE_CACHED_EMPTY, CACHED_APP_MIN_ADJ,
                PROCESS_CAPABILITY_IMPLICIT_CPU_TIME,
                TEST_APP1_NAME, null,
                TEST_APP2_PID, TEST_APP2_UID, PROCESS_STATE_CACHED_EMPTY,
                CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_NONE, TEST_APP2_NAME, TEST_SERVICE2_NAME,
                null,
                BIND_AUTO_CREATE,
                atLeastOnce(), atLeastOnce());

        // Disable the flags.
        mSetFlagsRule.disableFlags(Flags.FLAG_SERVICE_BINDING_OOM_ADJ_POLICY);

        // Verify that there should be at least 1 oom adj update
        performTestServiceDistinctBindingOomAdj(TEST_APP1_PID, TEST_APP1_UID,
                PROCESS_STATE_CACHED_EMPTY, CACHED_APP_MIN_ADJ,
                PROCESS_CAPABILITY_IMPLICIT_CPU_TIME,
                TEST_APP1_NAME, null,
                TEST_APP2_PID, TEST_APP2_UID, PROCESS_STATE_CACHED_EMPTY,
                CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_NONE, TEST_APP2_NAME, TEST_SERVICE2_NAME,
                null,
                BIND_AUTO_CREATE,
                atLeastOnce(), atLeastOnce());
    }

    @Test
    @EnableFlags(Flags.FLAG_CPU_TIME_CAPABILITY_BASED_FREEZE_POLICY)
    public void testServiceDistinctBindingOomAdjImplicitCpuTime_hostHasCpuTime() throws Exception {
        // Enable the flags.
        mSetFlagsRule.enableFlags(Flags.FLAG_SERVICE_BINDING_OOM_ADJ_POLICY);

        // Verify the IMPLICIT_CPU_TIME capability still triggers an update even if the host has the
        // CPU_TIME.
        performTestServiceDistinctBindingOomAdj(TEST_APP1_PID, TEST_APP1_UID,
                PROCESS_STATE_CACHED_EMPTY, CACHED_APP_MIN_ADJ,
                PROCESS_CAPABILITY_IMPLICIT_CPU_TIME,
                TEST_APP1_NAME, null,
                TEST_APP2_PID, TEST_APP2_UID, PROCESS_STATE_CACHED_EMPTY,
                CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_CPU_TIME, TEST_APP2_NAME, TEST_SERVICE2_NAME,
                null,
                BIND_AUTO_CREATE,
                atLeastOnce(), atLeastOnce());

        // Disable the flags.
        mSetFlagsRule.disableFlags(Flags.FLAG_SERVICE_BINDING_OOM_ADJ_POLICY);

        // Verify that there should be at least 1 oom adj update
        performTestServiceDistinctBindingOomAdj(TEST_APP1_PID, TEST_APP1_UID,
                PROCESS_STATE_CACHED_EMPTY, CACHED_APP_MIN_ADJ,
                PROCESS_CAPABILITY_IMPLICIT_CPU_TIME,
                TEST_APP1_NAME, null,
                TEST_APP2_PID, TEST_APP2_UID, PROCESS_STATE_CACHED_EMPTY,
                CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_CPU_TIME, TEST_APP2_NAME, TEST_SERVICE2_NAME,
                null,
                BIND_AUTO_CREATE,
                atLeastOnce(), atLeastOnce());
    }

    @Test
    @EnableFlags(Flags.FLAG_CPU_TIME_CAPABILITY_BASED_FREEZE_POLICY)
    public void testServiceDistinctBindingOomAdjImplicitCpuTime_hostHasImplicitCpuTime()
            throws Exception {
        // Enable the flags.
        mSetFlagsRule.enableFlags(Flags.FLAG_SERVICE_BINDING_OOM_ADJ_POLICY);

        // Verify the IMPLICIT_CPU_TIME capability does not trigger an update if the host has
        // already it.
        performTestServiceDistinctBindingOomAdj(TEST_APP1_PID, TEST_APP1_UID,
                PROCESS_STATE_CACHED_EMPTY, CACHED_APP_MIN_ADJ,
                PROCESS_CAPABILITY_IMPLICIT_CPU_TIME,
                TEST_APP1_NAME, null,
                TEST_APP2_PID, TEST_APP2_UID, PROCESS_STATE_CACHED_EMPTY,
                CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_IMPLICIT_CPU_TIME, TEST_APP2_NAME,
                TEST_SERVICE2_NAME,
                null,
                BIND_AUTO_CREATE,
                never(), atLeastOnce());

        // Disable the flags.
        mSetFlagsRule.disableFlags(Flags.FLAG_SERVICE_BINDING_OOM_ADJ_POLICY);

        // Verify that there should be at least 1 oom adj update
        performTestServiceDistinctBindingOomAdj(TEST_APP1_PID, TEST_APP1_UID,
                PROCESS_STATE_CACHED_EMPTY, CACHED_APP_MIN_ADJ,
                PROCESS_CAPABILITY_IMPLICIT_CPU_TIME,
                TEST_APP1_NAME, null,
                TEST_APP2_PID, TEST_APP2_UID, PROCESS_STATE_CACHED_EMPTY,
                CACHED_APP_MIN_ADJ, PROCESS_CAPABILITY_IMPLICIT_CPU_TIME, TEST_APP2_NAME,
                TEST_SERVICE2_NAME,
                null,
                BIND_AUTO_CREATE,
                atLeastOnce(), atLeastOnce());
    }

    @SuppressWarnings("GuardedBy")
    private void performTestServiceDistinctBindingOomAdj(int clientPid, int clientUid,
            int clientProcState, int clientAdj, int clientCap, String clientPackageName,