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

Commit 5cb3d10f authored by Kweku Adams's avatar Kweku Adams
Browse files

Implementing TIP1.

Tare Improvement Proposal #1 (TIP1) separates supply from allocation.
By separating the two, apps are able to accrue credits regardless of the
balances of other apps, and the limited nature of the resource is
shifted to when apps try to perform actions (and thus consume
resources). We remove the "maximum circulation" that limited the total
number of credits that could be allocated across all apps at one time
and replace it with a "consumption limit" that limits the total number
of credits that can be consumed across all apps within a full discharge
cycle. The consumption limit continues to scale down with the battery
level. This change should help reduce concerns over misallocation.

Bug: 158300259
Test: Spot check dumpsys of tare, jobscheduler, and alarmmanager
Test: atest frameworks/base/services/tests/mockingservicestests/src/com/android/server/tare
Test: atest frameworks/base/services/tests/servicestests/src/com/android/server/tare
Change-Id: I104eef812889ffb543132ae46c7ac869b12c9882
parent 35a35495
Loading
Loading
Loading
Loading
+13 −5
Original line number Diff line number Diff line
@@ -39,7 +39,9 @@ public class EconomyManager {
    /** @hide */
    public static final String KEY_AM_MAX_SATIATED_BALANCE = "am_max_satiated_balance";
    /** @hide */
    public static final String KEY_AM_MAX_CIRCULATION = "am_max_circulation";
    public static final String KEY_AM_INITIAL_CONSUMPTION_LIMIT = "am_initial_consumption_limit";
    /** @hide */
    public static final String KEY_AM_HARD_CONSUMPTION_LIMIT = "am_hard_consumption_limit";
    // TODO: Add AlarmManager modifier keys
    /** @hide */
    public static final String KEY_AM_REWARD_TOP_ACTIVITY_INSTANT =
@@ -163,7 +165,9 @@ public class EconomyManager {
    public static final String KEY_JS_MAX_SATIATED_BALANCE =
            "js_max_satiated_balance";
    /** @hide */
    public static final String KEY_JS_MAX_CIRCULATION = "js_max_circulation";
    public static final String KEY_JS_INITIAL_CONSUMPTION_LIMIT = "js_initial_consumption_limit";
    /** @hide */
    public static final String KEY_JS_HARD_CONSUMPTION_LIMIT = "js_hard_consumption_limit";
    // TODO: Add JobScheduler modifier keys
    /** @hide */
    public static final String KEY_JS_REWARD_TOP_ACTIVITY_INSTANT =
@@ -280,7 +284,9 @@ public class EconomyManager {
    /** @hide */
    public static final int DEFAULT_AM_MAX_SATIATED_BALANCE = 1440;
    /** @hide */
    public static final int DEFAULT_AM_MAX_CIRCULATION = 52000;
    public static final int DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT = 28800;
    /** @hide */
    public static final int DEFAULT_AM_HARD_CONSUMPTION_LIMIT = 52000;
    // TODO: add AlarmManager modifier default values
    /** @hide */
    public static final int DEFAULT_AM_REWARD_TOP_ACTIVITY_INSTANT = 0;
@@ -359,7 +365,7 @@ public class EconomyManager {
    // Default values JobScheduler factors
    // TODO: add time_since_usage variable to min satiated balance factors
    /** @hide */
    public static final int DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED = 50000;
    public static final int DEFAULT_JS_MIN_SATIATED_BALANCE_EXEMPTED = 20000;
    /** @hide */
    public static final int DEFAULT_JS_MIN_SATIATED_BALANCE_HEADLESS_SYSTEM_APP = 10000;
    /** @hide */
@@ -367,7 +373,9 @@ public class EconomyManager {
    /** @hide */
    public static final int DEFAULT_JS_MAX_SATIATED_BALANCE = 60000;
    /** @hide */
    public static final int DEFAULT_JS_MAX_CIRCULATION = 691200;
    public static final int DEFAULT_JS_INITIAL_CONSUMPTION_LIMIT = 460_000;
    /** @hide */
    public static final int DEFAULT_JS_HARD_CONSUMPTION_LIMIT = 900_000;
    // TODO: add JobScheduler modifier default values
    /** @hide */
    public static final int DEFAULT_JS_REWARD_TOP_ACTIVITY_INSTANT = 0;
+1 −1
Original line number Diff line number Diff line
@@ -3007,7 +3007,7 @@ public class JobSchedulerService extends com.android.server.SystemService
                    }
                } else if (BatteryManager.ACTION_DISCHARGING.equals(action)) {
                    if (DEBUG) {
                        Slog.d(TAG, "Disconnected from power @ " + sElapsedRealtimeClock.millis());
                        Slog.d(TAG, "Battery discharging @ " + sElapsedRealtimeClock.millis());
                    }
                    if (mCharging) {
                        mCharging = false;
+163 −78

File changed.

Preview size limit exceeded, changes collapsed.

+23 −8
Original line number Diff line number Diff line
@@ -33,7 +33,8 @@ import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_NO
import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP;
import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE;
import static android.app.tare.EconomyManager.DEFAULT_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP;
import static android.app.tare.EconomyManager.DEFAULT_AM_MAX_CIRCULATION;
import static android.app.tare.EconomyManager.DEFAULT_AM_HARD_CONSUMPTION_LIMIT;
import static android.app.tare.EconomyManager.DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT;
import static android.app.tare.EconomyManager.DEFAULT_AM_MAX_SATIATED_BALANCE;
import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_EXEMPTED;
import static android.app.tare.EconomyManager.DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP;
@@ -70,7 +71,8 @@ import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_NONWAK
import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_NONWAKEUP_CTP;
import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_BASE_PRICE;
import static android.app.tare.EconomyManager.KEY_AM_ACTION_ALARM_INEXACT_WAKEUP_CTP;
import static android.app.tare.EconomyManager.KEY_AM_MAX_CIRCULATION;
import static android.app.tare.EconomyManager.KEY_AM_HARD_CONSUMPTION_LIMIT;
import static android.app.tare.EconomyManager.KEY_AM_INITIAL_CONSUMPTION_LIMIT;
import static android.app.tare.EconomyManager.KEY_AM_MAX_SATIATED_BALANCE;
import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_EXEMPTED;
import static android.app.tare.EconomyManager.KEY_AM_MIN_SATIATED_BALANCE_OTHER_APP;
@@ -143,7 +145,8 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
    private long mMinSatiatedBalanceExempted;
    private long mMinSatiatedBalanceOther;
    private long mMaxSatiatedBalance;
    private long mMaxSatiatedCirculation;
    private long mInitialSatiatedConsumptionLimit;
    private long mHardSatiatedConsumptionLimit;

    private final KeyValueListParser mParser = new KeyValueListParser(',');
    private final InternalResourceService mInternalResourceService;
@@ -179,8 +182,13 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
    }

    @Override
    long getMaxSatiatedCirculation() {
        return mMaxSatiatedCirculation;
    long getInitialSatiatedConsumptionLimit() {
        return mInitialSatiatedConsumptionLimit;
    }

    @Override
    long getHardSatiatedConsumptionLimit() {
        return mHardSatiatedConsumptionLimit;
    }

    @NonNull
@@ -217,8 +225,11 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
                DEFAULT_AM_MIN_SATIATED_BALANCE_OTHER_APP));
        mMaxSatiatedBalance = arcToNarc(mParser.getInt(KEY_AM_MAX_SATIATED_BALANCE,
                DEFAULT_AM_MAX_SATIATED_BALANCE));
        mMaxSatiatedCirculation = arcToNarc(mParser.getInt(KEY_AM_MAX_CIRCULATION,
                DEFAULT_AM_MAX_CIRCULATION));
        mInitialSatiatedConsumptionLimit = arcToNarc(mParser.getInt(
                KEY_AM_INITIAL_CONSUMPTION_LIMIT, DEFAULT_AM_INITIAL_CONSUMPTION_LIMIT));
        mHardSatiatedConsumptionLimit = Math.max(mInitialSatiatedConsumptionLimit,
                arcToNarc(mParser.getInt(
                        KEY_AM_HARD_CONSUMPTION_LIMIT, DEFAULT_AM_HARD_CONSUMPTION_LIMIT)));

        final long exactAllowWhileIdleWakeupBasePrice = arcToNarc(
                mParser.getInt(KEY_AM_ACTION_ALARM_ALLOW_WHILE_IDLE_EXACT_WAKEUP_BASE_PRICE,
@@ -357,7 +368,11 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy {
        pw.print("Other", narcToString(mMinSatiatedBalanceOther)).println();
        pw.decreaseIndent();
        pw.print("Max satiated balance", narcToString(mMaxSatiatedBalance)).println();
        pw.print("Max satiated circulation", narcToString(mMaxSatiatedCirculation)).println();
        pw.print("Consumption limits: [");
        pw.print(narcToString(mInitialSatiatedConsumptionLimit));
        pw.print(", ");
        pw.print(narcToString(mHardSatiatedConsumptionLimit));
        pw.println("]");

        pw.println();
        pw.println("Actions:");
+10 −5
Original line number Diff line number Diff line
@@ -34,7 +34,7 @@ public class CompleteEconomicPolicy extends EconomicPolicy {
    private final SparseArray<Reward> mRewards = new SparseArray<>();
    private final int[] mCostModifiers;
    private long mMaxSatiatedBalance;
    private long mMaxSatiatedCirculation;
    private long mConsumptionLimit;

    CompleteEconomicPolicy(@NonNull InternalResourceService irs) {
        super(irs);
@@ -74,9 +74,9 @@ public class CompleteEconomicPolicy extends EconomicPolicy {

        max = 0;
        for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) {
            max += mEnabledEconomicPolicies.valueAt(i).getMaxSatiatedCirculation();
            max += mEnabledEconomicPolicies.valueAt(i).getInitialSatiatedConsumptionLimit();
        }
        mMaxSatiatedCirculation = max;
        mConsumptionLimit = max;
    }

    @Override
@@ -94,8 +94,13 @@ public class CompleteEconomicPolicy extends EconomicPolicy {
    }

    @Override
     long getMaxSatiatedCirculation() {
        return mMaxSatiatedCirculation;
    long getInitialSatiatedConsumptionLimit() {
        return mConsumptionLimit;
    }

    @Override
    long getHardSatiatedConsumptionLimit() {
        return mConsumptionLimit;
    }

    @NonNull
Loading