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

Commit e6b9f110 authored by Kweku Adams's avatar Kweku Adams
Browse files

Add shell commands to set flex policy.

Add shell commands to allow tests and developers to enable, disable, and
reset flex policy for testing and local development.

Bug: 244734471
Test: atest CtsJobSchedulerTestCases:FlexibilityConstraintTest
Change-Id: Id79d9b9ce93e4699d68ee76c1d1d7eba0b2c8815
parent 4410a6e2
Loading
Loading
Loading
Loading
+16 −6
Original line number Original line Diff line number Diff line
@@ -304,6 +304,8 @@ public class JobSchedulerService extends com.android.server.SystemService
    private final ConnectivityController mConnectivityController;
    private final ConnectivityController mConnectivityController;
    /** Need directly for sending uid state changes */
    /** Need directly for sending uid state changes */
    private final DeviceIdleJobsController mDeviceIdleJobsController;
    private final DeviceIdleJobsController mDeviceIdleJobsController;
    /** Need direct access to this for testing. */
    private final FlexibilityController mFlexibilityController;
    /** Needed to get next estimated launch time. */
    /** Needed to get next estimated launch time. */
    private final PrefetchController mPrefetchController;
    private final PrefetchController mPrefetchController;
    /** Needed to get remaining quota time. */
    /** Needed to get remaining quota time. */
@@ -2701,17 +2703,16 @@ public class JobSchedulerService extends com.android.server.SystemService
        mControllers = new ArrayList<StateController>();
        mControllers = new ArrayList<StateController>();
        mPrefetchController = new PrefetchController(this);
        mPrefetchController = new PrefetchController(this);
        mControllers.add(mPrefetchController);
        mControllers.add(mPrefetchController);
        final FlexibilityController flexibilityController =
        mFlexibilityController = new FlexibilityController(this, mPrefetchController);
                new FlexibilityController(this, mPrefetchController);
        mControllers.add(mFlexibilityController);
        mControllers.add(flexibilityController);
        mConnectivityController =
        mConnectivityController =
                new ConnectivityController(this, flexibilityController);
                new ConnectivityController(this, mFlexibilityController);
        mControllers.add(mConnectivityController);
        mControllers.add(mConnectivityController);
        mControllers.add(new TimeController(this));
        mControllers.add(new TimeController(this));
        final IdleController idleController = new IdleController(this, flexibilityController);
        final IdleController idleController = new IdleController(this, mFlexibilityController);
        mControllers.add(idleController);
        mControllers.add(idleController);
        final BatteryController batteryController =
        final BatteryController batteryController =
                new BatteryController(this, flexibilityController);
                new BatteryController(this, mFlexibilityController);
        mControllers.add(batteryController);
        mControllers.add(batteryController);
        mStorageController = new StorageController(this);
        mStorageController = new StorageController(this);
        mControllers.add(mStorageController);
        mControllers.add(mStorageController);
@@ -5556,6 +5557,15 @@ public class JobSchedulerService extends com.android.server.SystemService
        return 0;
        return 0;
    }
    }


    // Shell command infrastructure: set flex policy
    void setFlexPolicy(boolean override, int appliedConstraints) {
        if (DEBUG) {
            Slog.v(TAG, "setFlexPolicy(): " + override + "/" + appliedConstraints);
        }

        mFlexibilityController.setLocalPolicyForTesting(override, appliedConstraints);
    }

    void setMonitorBattery(boolean enabled) {
    void setMonitorBattery(boolean enabled) {
        synchronized (mLock) {
        synchronized (mLock) {
            mBatteryStateTracker.setMonitorBatteryLocked(enabled);
            mBatteryStateTracker.setMonitorBatteryLocked(enabled);
+88 −0
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ import android.os.Binder;
import android.os.UserHandle;
import android.os.UserHandle;


import com.android.modules.utils.BasicShellCommandHandler;
import com.android.modules.utils.BasicShellCommandHandler;
import com.android.server.job.controllers.JobStatus;


import java.io.PrintWriter;
import java.io.PrintWriter;


@@ -59,6 +60,10 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
                    return cancelJob(pw);
                    return cancelJob(pw);
                case "monitor-battery":
                case "monitor-battery":
                    return monitorBattery(pw);
                    return monitorBattery(pw);
                case "disable-flex-policy":
                    return disableFlexPolicy(pw);
                case "enable-flex-policy":
                    return enableFlexPolicy(pw);
                case "get-aconfig-flag-state":
                case "get-aconfig-flag-state":
                    return getAconfigFlagState(pw);
                    return getAconfigFlagState(pw);
                case "get-battery-seq":
                case "get-battery-seq":
@@ -91,6 +96,8 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
                    return resetExecutionQuota(pw);
                    return resetExecutionQuota(pw);
                case "reset-schedule-quota":
                case "reset-schedule-quota":
                    return resetScheduleQuota(pw);
                    return resetScheduleQuota(pw);
                case "reset-flex-policy":
                    return resetFlexPolicy(pw);
                case "stop":
                case "stop":
                    return stop(pw);
                    return stop(pw);
                case "trigger-dock-state":
                case "trigger-dock-state":
@@ -346,6 +353,65 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
        return 0;
        return 0;
    }
    }


    private int disableFlexPolicy(PrintWriter pw) throws Exception {
        checkPermission("disable flex policy");

        final long ident = Binder.clearCallingIdentity();
        try {
            mInternal.setFlexPolicy(true, 0);
            pw.println("Set flex policy to 0");
            return 0;
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
    }

    private int enableFlexPolicy(PrintWriter pw) throws Exception {
        checkPermission("enable flex policy");

        int enabled = 0;

        String opt;
        while ((opt = getNextOption()) != null) {
            switch (opt) {
                case "-o":
                case "--option":
                    final String constraint = getNextArgRequired();
                    switch (constraint) {
                        case "battery-not-low":
                            enabled |= JobStatus.CONSTRAINT_BATTERY_NOT_LOW;
                            break;
                        case "charging":
                            enabled |= JobStatus.CONSTRAINT_CHARGING;
                            break;
                        case "connectivity":
                            enabled |= JobStatus.CONSTRAINT_CONNECTIVITY;
                            break;
                        case "idle":
                            enabled |= JobStatus.CONSTRAINT_IDLE;
                            break;
                        default:
                            pw.println("Unsupported option: " + constraint);
                            return -1;
                    }
                    break;

                default:
                    pw.println("Error: unknown option '" + opt + "'");
                    return -1;
            }
        }

        final long ident = Binder.clearCallingIdentity();
        try {
            mInternal.setFlexPolicy(true, enabled);
            pw.println("Set flex policy to " + enabled);
            return 0;
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
    }

    private int getAconfigFlagState(PrintWriter pw) throws Exception {
    private int getAconfigFlagState(PrintWriter pw) throws Exception {
        checkPermission("get aconfig flag state", Manifest.permission.DUMP);
        checkPermission("get aconfig flag state", Manifest.permission.DUMP);


@@ -581,6 +647,19 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
        return 0;
        return 0;
    }
    }


    private int resetFlexPolicy(PrintWriter pw) throws Exception {
        checkPermission("reset flex policy");

        final long ident = Binder.clearCallingIdentity();
        try {
            mInternal.setFlexPolicy(false, 0);
            pw.println("Reset flex policy to its default state");
            return 0;
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
    }

    private int resetExecutionQuota(PrintWriter pw) throws Exception {
    private int resetExecutionQuota(PrintWriter pw) throws Exception {
        checkPermission("reset execution quota");
        checkPermission("reset execution quota");


@@ -773,6 +852,15 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
        pw.println("  monitor-battery [on|off]");
        pw.println("  monitor-battery [on|off]");
        pw.println("    Control monitoring of all battery changes.  Off by default.  Turning");
        pw.println("    Control monitoring of all battery changes.  Off by default.  Turning");
        pw.println("    on makes get-battery-seq useful.");
        pw.println("    on makes get-battery-seq useful.");
        pw.println("  enable-flex-policy --option <option>");
        pw.println("    Enable flex policy with the specified options. Supported options are");
        pw.println("    battery-not-low, charging, connectivity, idle.");
        pw.println("    Multiple enable options can be specified (e.g.");
        pw.println("    enable-flex-policy --option battery-not-low --option charging");
        pw.println("  disable-flex-policy");
        pw.println("    Turn off flex policy so that it does not affect job execution.");
        pw.println("  reset-flex-policy");
        pw.println("    Resets the flex policy to its default state.");
        pw.println("  get-aconfig-flag-state FULL_FLAG_NAME");
        pw.println("  get-aconfig-flag-state FULL_FLAG_NAME");
        pw.println("    Return the state of the specified aconfig flag, if known. The flag name");
        pw.println("    Return the state of the specified aconfig flag, if known. The flag name");
        pw.println("         must be fully qualified.");
        pw.println("         must be fully qualified.");
+30 −0
Original line number Original line Diff line number Diff line
@@ -328,6 +328,9 @@ public final class FlexibilityController extends StateController {
    @GuardedBy("mLock")
    @GuardedBy("mLock")
    private final ArraySet<String> mPackagesToCheck = new ArraySet<>();
    private final ArraySet<String> mPackagesToCheck = new ArraySet<>();


    @GuardedBy("mLock")
    private boolean mLocalOverride;

    public FlexibilityController(
    public FlexibilityController(
            JobSchedulerService service, PrefetchController prefetchController) {
            JobSchedulerService service, PrefetchController prefetchController) {
        super(service);
        super(service);
@@ -1923,6 +1926,27 @@ public final class FlexibilityController extends StateController {
        }
        }
    }
    }


    /**
     * If {@code override} is true, uses {@code appliedConstraints} for flex policy evaluation,
     * overriding anything else that was set. If {@code override} is false, any previous calls
     * will be discarded and the policy will be reset to the normal default policy.
     */
    public void setLocalPolicyForTesting(boolean override, int appliedConstraints) {
        synchronized (mLock) {
            final boolean recheckJobs = mLocalOverride != override
                    || mAppliedConstraints != appliedConstraints;
            mLocalOverride = override;
            if (mLocalOverride) {
                mAppliedConstraints = appliedConstraints;
            } else {
                mAppliedConstraints = mFcConfig.APPLIED_CONSTRAINTS;
            }
            if (recheckJobs) {
                mHandler.obtainMessage(MSG_CHECK_ALL_JOBS).sendToTarget();
            }
        }
    }

    @Override
    @Override
    @GuardedBy("mLock")
    @GuardedBy("mLock")
    public void dumpConstants(IndentingPrintWriter pw) {
    public void dumpConstants(IndentingPrintWriter pw) {
@@ -1932,6 +1956,12 @@ public final class FlexibilityController extends StateController {
    @Override
    @Override
    @GuardedBy("mLock")
    @GuardedBy("mLock")
    public void dumpControllerStateLocked(IndentingPrintWriter pw, Predicate<JobStatus> predicate) {
    public void dumpControllerStateLocked(IndentingPrintWriter pw, Predicate<JobStatus> predicate) {
        if (mLocalOverride) {
            pw.println("Local override active");
        }
        pw.print("Applied Flexible Constraints:");
        JobStatus.dumpConstraints(pw, mAppliedConstraints);
        pw.println();
        pw.print("Satisfied Flexible Constraints:");
        pw.print("Satisfied Flexible Constraints:");
        JobStatus.dumpConstraints(pw, mSatisfiedFlexibleConstraints);
        JobStatus.dumpConstraints(pw, mSatisfiedFlexibleConstraints);
        pw.println();
        pw.println();