Loading apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java +17 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ package com.android.server.tare; import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING; import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE; import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE; import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE; import static com.android.server.tare.TareUtils.arcToNarc; import android.annotation.NonNull; Loading @@ -41,6 +45,13 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy { public static final String ACTION_ALARM_NONWAKEUP_INEXACT = "ALARM_NONWAKEUP_INEXACT"; public static final String ACTION_ALARM_CLOCK = "ALARM_CLOCK"; private static final int[] COST_MODIFIERS = new int[]{ COST_MODIFIER_CHARGING, COST_MODIFIER_DEVICE_IDLE, COST_MODIFIER_POWER_SAVE_MODE, COST_MODIFIER_PROCESS_STATE }; private final ArrayMap<String, Action> mActions = new ArrayMap<>(); private final ArrayMap<String, Reward> mRewards = new ArrayMap<>(); Loading @@ -67,6 +78,12 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy { return arcToNarc(52000); } @NonNull @Override int[] getCostModifiers() { return COST_MODIFIERS; } @Nullable @Override Action getAction(@NonNull String actionName) { Loading apex/jobscheduler/service/java/com/android/server/tare/ChargingMultiplier.java→apex/jobscheduler/service/java/com/android/server/tare/ChargingModifier.java +17 −7 Original line number Diff line number Diff line Loading @@ -27,27 +27,37 @@ import android.util.IndentingPrintWriter; import android.util.Log; import android.util.Slog; /** Multiplier that makes things free when the device is charging. */ class ChargingMultiplier extends Multiplier { private static final String TAG = "TARE-" + ChargingMultiplier.class.getSimpleName(); /** Modifier that makes things free when the device is charging. */ class ChargingModifier extends Modifier { private static final String TAG = "TARE-" + ChargingModifier.class.getSimpleName(); private static final boolean DEBUG = InternalResourceService.DEBUG || Log.isLoggable(TAG, Log.DEBUG); private final InternalResourceService mIrs; private final ChargingTracker mChargingTracker; ChargingMultiplier(@NonNull InternalResourceService irs) { super(true, true); ChargingModifier(@NonNull InternalResourceService irs) { super(); mIrs = irs; mChargingTracker = new ChargingTracker(); mChargingTracker.startTracking(irs.getContext()); } double getCurrentMultiplier() { @Override long getModifiedCostToProduce(long ctp) { return modifyValue(ctp); } @Override long getModifiedPrice(long price) { return modifyValue(price); } private long modifyValue(long val) { if (mChargingTracker.mCharging) { return 0; } return 1; return val; } @Override Loading apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java +27 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,9 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.util.ArrayMap; import android.util.ArraySet; import android.util.IndentingPrintWriter; import libcore.util.EmptyArray; /** Combines all enabled policies into one. */ Loading @@ -29,6 +32,7 @@ public class CompleteEconomicPolicy extends EconomicPolicy { private final ArrayMap<String, Action> mActions = new ArrayMap<>(); /** Lazily populated set of rewards covered by this policy. */ private final ArrayMap<String, Reward> mRewards = new ArrayMap<>(); private final int[] mCostModifiers; private final long mMaxSatiatedBalance; private final long mMaxSatiatedCirculation; Loading @@ -37,6 +41,18 @@ public class CompleteEconomicPolicy extends EconomicPolicy { mEnabledEconomicPolicies.add(new AlarmManagerEconomicPolicy(irs)); mEnabledEconomicPolicies.add(new JobSchedulerEconomicPolicy(irs)); ArraySet<Integer> costModifiers = new ArraySet<>(); for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) { final int[] sm = mEnabledEconomicPolicies.valueAt(i).getCostModifiers(); for (int s : sm) { costModifiers.add(s); } } mCostModifiers = new int[costModifiers.size()]; for (int i = 0; i < costModifiers.size(); ++i) { mCostModifiers[i] = costModifiers.valueAt(i); } long max = 0; for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) { max += mEnabledEconomicPolicies.valueAt(i).getMaxSatiatedBalance(); Loading Loading @@ -69,6 +85,12 @@ public class CompleteEconomicPolicy extends EconomicPolicy { return mMaxSatiatedCirculation; } @NonNull @Override public int[] getCostModifiers() { return mCostModifiers == null ? EmptyArray.INT : mCostModifiers; } @Nullable @Override public Action getAction(@NonNull String actionName) { Loading Loading @@ -114,4 +136,9 @@ public class CompleteEconomicPolicy extends EconomicPolicy { mRewards.put(rewardName, reward); return reward; } @Override void dump(IndentingPrintWriter pw) { dumpActiveModifiers(pw); } } apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleMultiplier.java→apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleModifier.java +10 −9 Original line number Diff line number Diff line Loading @@ -25,9 +25,9 @@ import android.os.PowerManager; import android.util.IndentingPrintWriter; import android.util.Log; /** Multiplier that makes things more expensive in light and deep doze. */ class DeviceIdleMultiplier extends Multiplier { private static final String TAG = "TARE-" + DeviceIdleMultiplier.class.getSimpleName(); /** Modifier that makes things more expensive in light and deep doze. */ class DeviceIdleModifier extends Modifier { private static final String TAG = "TARE-" + DeviceIdleModifier.class.getSimpleName(); private static final boolean DEBUG = InternalResourceService.DEBUG || Log.isLoggable(TAG, Log.DEBUG); Loading @@ -35,22 +35,23 @@ class DeviceIdleMultiplier extends Multiplier { private final PowerManager mPowerManager; private final DeviceIdleTracker mDeviceIdleTracker; DeviceIdleMultiplier(@NonNull InternalResourceService irs) { super(true, false); DeviceIdleModifier(@NonNull InternalResourceService irs) { super(); mIrs = irs; mPowerManager = irs.getContext().getSystemService(PowerManager.class); mDeviceIdleTracker = new DeviceIdleTracker(); mDeviceIdleTracker.startTracking(irs.getContext()); } double getCurrentMultiplier() { @Override long getModifiedCostToProduce(long ctp) { if (mDeviceIdleTracker.mDeviceIdle) { return 1.2; return (long) (1.2 * ctp); } if (mDeviceIdleTracker.mDeviceLightIdle) { return 1.1; return (long) (1.1 * ctp); } return 1; return ctp; } @Override Loading apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java +106 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,12 @@ package com.android.server.tare; import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING; import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE; import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE; import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE; import static com.android.server.tare.Modifier.NUM_COST_MODIFIERS; import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -62,7 +68,7 @@ public abstract class EconomicPolicy { /** * The base price to perform this action. If this is * less than the {@link #costToProduce}, then the system should not perform * the action unless a multiplier lowers the cost to produce. * the action unless a modifier lowers the cost to produce. */ public final long basePrice; Loading Loading @@ -91,11 +97,22 @@ public abstract class EconomicPolicy { } } private static final Modifier[] COST_MODIFIER_BY_INDEX = new Modifier[NUM_COST_MODIFIERS]; EconomicPolicy(@NonNull InternalResourceService irs) { for (int mId : getCostModifiers()) { initModifier(mId, irs); } } @CallSuper void onSystemServicesReady() { for (int i = 0; i < NUM_COST_MODIFIERS; ++i) { final Modifier modifier = COST_MODIFIER_BY_INDEX[i]; if (modifier != null) { modifier.onSystemServicesReady(); } } } /** Loading @@ -117,6 +134,10 @@ public abstract class EconomicPolicy { */ abstract long getMaxSatiatedCirculation(); /** Return the set of modifiers that should apply to this policy's costs. */ @NonNull abstract int[] getCostModifiers(); @Nullable abstract Action getAction(@NonNull String actionName); Loading @@ -125,4 +146,88 @@ public abstract class EconomicPolicy { void dump(IndentingPrintWriter pw) { } final long getCostOfAction(@NonNull String actionName, int userId, @NonNull String pkgName) { final Action action = getAction(actionName); if (action == null) { return 0; } long ctp = action.costToProduce; long price = action.basePrice; final int[] costModifiers = getCostModifiers(); boolean useProcessStatePriceDeterminant = false; for (int costModifier : costModifiers) { if (costModifier == COST_MODIFIER_PROCESS_STATE) { useProcessStatePriceDeterminant = true; } else { final Modifier modifier = getModifier(costModifier); ctp = modifier.getModifiedCostToProduce(ctp); price = modifier.getModifiedPrice(price); } } // ProcessStateModifier needs to be done last. if (useProcessStatePriceDeterminant) { ProcessStateModifier processStateModifier = (ProcessStateModifier) getModifier(COST_MODIFIER_PROCESS_STATE); price = processStateModifier.getModifiedPrice(userId, pkgName, ctp, price); } return price; } private static void initModifier(@Modifier.CostModifier final int modifierId, @NonNull InternalResourceService irs) { if (modifierId < 0 || modifierId >= COST_MODIFIER_BY_INDEX.length) { throw new IllegalArgumentException("Invalid modifier id " + modifierId); } Modifier modifier = COST_MODIFIER_BY_INDEX[modifierId]; if (modifier == null) { switch (modifierId) { case COST_MODIFIER_CHARGING: modifier = new ChargingModifier(irs); break; case COST_MODIFIER_DEVICE_IDLE: modifier = new DeviceIdleModifier(irs); break; case COST_MODIFIER_POWER_SAVE_MODE: modifier = new PowerSaveModeModifier(irs); break; case COST_MODIFIER_PROCESS_STATE: modifier = new ProcessStateModifier(irs); break; default: throw new IllegalArgumentException("Invalid modifier id " + modifierId); } COST_MODIFIER_BY_INDEX[modifierId] = modifier; } } @NonNull private static Modifier getModifier(@Modifier.CostModifier final int modifierId) { if (modifierId < 0 || modifierId >= COST_MODIFIER_BY_INDEX.length) { throw new IllegalArgumentException("Invalid modifier id " + modifierId); } final Modifier modifier = COST_MODIFIER_BY_INDEX[modifierId]; if (modifier == null) { throw new IllegalStateException( "Modifier #" + modifierId + " was never initialized"); } return modifier; } protected static void dumpActiveModifiers(IndentingPrintWriter pw) { for (int i = 0; i < NUM_COST_MODIFIERS; ++i) { pw.print("Modifier "); pw.println(i); pw.increaseIndent(); Modifier modifier = COST_MODIFIER_BY_INDEX[i]; if (modifier != null) { modifier.dump(pw); } else { pw.println("NOT ACTIVE"); } pw.decreaseIndent(); } } } Loading
apex/jobscheduler/service/java/com/android/server/tare/AlarmManagerEconomicPolicy.java +17 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ package com.android.server.tare; import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING; import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE; import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE; import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE; import static com.android.server.tare.TareUtils.arcToNarc; import android.annotation.NonNull; Loading @@ -41,6 +45,13 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy { public static final String ACTION_ALARM_NONWAKEUP_INEXACT = "ALARM_NONWAKEUP_INEXACT"; public static final String ACTION_ALARM_CLOCK = "ALARM_CLOCK"; private static final int[] COST_MODIFIERS = new int[]{ COST_MODIFIER_CHARGING, COST_MODIFIER_DEVICE_IDLE, COST_MODIFIER_POWER_SAVE_MODE, COST_MODIFIER_PROCESS_STATE }; private final ArrayMap<String, Action> mActions = new ArrayMap<>(); private final ArrayMap<String, Reward> mRewards = new ArrayMap<>(); Loading @@ -67,6 +78,12 @@ public class AlarmManagerEconomicPolicy extends EconomicPolicy { return arcToNarc(52000); } @NonNull @Override int[] getCostModifiers() { return COST_MODIFIERS; } @Nullable @Override Action getAction(@NonNull String actionName) { Loading
apex/jobscheduler/service/java/com/android/server/tare/ChargingMultiplier.java→apex/jobscheduler/service/java/com/android/server/tare/ChargingModifier.java +17 −7 Original line number Diff line number Diff line Loading @@ -27,27 +27,37 @@ import android.util.IndentingPrintWriter; import android.util.Log; import android.util.Slog; /** Multiplier that makes things free when the device is charging. */ class ChargingMultiplier extends Multiplier { private static final String TAG = "TARE-" + ChargingMultiplier.class.getSimpleName(); /** Modifier that makes things free when the device is charging. */ class ChargingModifier extends Modifier { private static final String TAG = "TARE-" + ChargingModifier.class.getSimpleName(); private static final boolean DEBUG = InternalResourceService.DEBUG || Log.isLoggable(TAG, Log.DEBUG); private final InternalResourceService mIrs; private final ChargingTracker mChargingTracker; ChargingMultiplier(@NonNull InternalResourceService irs) { super(true, true); ChargingModifier(@NonNull InternalResourceService irs) { super(); mIrs = irs; mChargingTracker = new ChargingTracker(); mChargingTracker.startTracking(irs.getContext()); } double getCurrentMultiplier() { @Override long getModifiedCostToProduce(long ctp) { return modifyValue(ctp); } @Override long getModifiedPrice(long price) { return modifyValue(price); } private long modifyValue(long val) { if (mChargingTracker.mCharging) { return 0; } return 1; return val; } @Override Loading
apex/jobscheduler/service/java/com/android/server/tare/CompleteEconomicPolicy.java +27 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,9 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.util.ArrayMap; import android.util.ArraySet; import android.util.IndentingPrintWriter; import libcore.util.EmptyArray; /** Combines all enabled policies into one. */ Loading @@ -29,6 +32,7 @@ public class CompleteEconomicPolicy extends EconomicPolicy { private final ArrayMap<String, Action> mActions = new ArrayMap<>(); /** Lazily populated set of rewards covered by this policy. */ private final ArrayMap<String, Reward> mRewards = new ArrayMap<>(); private final int[] mCostModifiers; private final long mMaxSatiatedBalance; private final long mMaxSatiatedCirculation; Loading @@ -37,6 +41,18 @@ public class CompleteEconomicPolicy extends EconomicPolicy { mEnabledEconomicPolicies.add(new AlarmManagerEconomicPolicy(irs)); mEnabledEconomicPolicies.add(new JobSchedulerEconomicPolicy(irs)); ArraySet<Integer> costModifiers = new ArraySet<>(); for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) { final int[] sm = mEnabledEconomicPolicies.valueAt(i).getCostModifiers(); for (int s : sm) { costModifiers.add(s); } } mCostModifiers = new int[costModifiers.size()]; for (int i = 0; i < costModifiers.size(); ++i) { mCostModifiers[i] = costModifiers.valueAt(i); } long max = 0; for (int i = 0; i < mEnabledEconomicPolicies.size(); ++i) { max += mEnabledEconomicPolicies.valueAt(i).getMaxSatiatedBalance(); Loading Loading @@ -69,6 +85,12 @@ public class CompleteEconomicPolicy extends EconomicPolicy { return mMaxSatiatedCirculation; } @NonNull @Override public int[] getCostModifiers() { return mCostModifiers == null ? EmptyArray.INT : mCostModifiers; } @Nullable @Override public Action getAction(@NonNull String actionName) { Loading Loading @@ -114,4 +136,9 @@ public class CompleteEconomicPolicy extends EconomicPolicy { mRewards.put(rewardName, reward); return reward; } @Override void dump(IndentingPrintWriter pw) { dumpActiveModifiers(pw); } }
apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleMultiplier.java→apex/jobscheduler/service/java/com/android/server/tare/DeviceIdleModifier.java +10 −9 Original line number Diff line number Diff line Loading @@ -25,9 +25,9 @@ import android.os.PowerManager; import android.util.IndentingPrintWriter; import android.util.Log; /** Multiplier that makes things more expensive in light and deep doze. */ class DeviceIdleMultiplier extends Multiplier { private static final String TAG = "TARE-" + DeviceIdleMultiplier.class.getSimpleName(); /** Modifier that makes things more expensive in light and deep doze. */ class DeviceIdleModifier extends Modifier { private static final String TAG = "TARE-" + DeviceIdleModifier.class.getSimpleName(); private static final boolean DEBUG = InternalResourceService.DEBUG || Log.isLoggable(TAG, Log.DEBUG); Loading @@ -35,22 +35,23 @@ class DeviceIdleMultiplier extends Multiplier { private final PowerManager mPowerManager; private final DeviceIdleTracker mDeviceIdleTracker; DeviceIdleMultiplier(@NonNull InternalResourceService irs) { super(true, false); DeviceIdleModifier(@NonNull InternalResourceService irs) { super(); mIrs = irs; mPowerManager = irs.getContext().getSystemService(PowerManager.class); mDeviceIdleTracker = new DeviceIdleTracker(); mDeviceIdleTracker.startTracking(irs.getContext()); } double getCurrentMultiplier() { @Override long getModifiedCostToProduce(long ctp) { if (mDeviceIdleTracker.mDeviceIdle) { return 1.2; return (long) (1.2 * ctp); } if (mDeviceIdleTracker.mDeviceLightIdle) { return 1.1; return (long) (1.1 * ctp); } return 1; return ctp; } @Override Loading
apex/jobscheduler/service/java/com/android/server/tare/EconomicPolicy.java +106 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,12 @@ package com.android.server.tare; import static com.android.server.tare.Modifier.COST_MODIFIER_CHARGING; import static com.android.server.tare.Modifier.COST_MODIFIER_DEVICE_IDLE; import static com.android.server.tare.Modifier.COST_MODIFIER_POWER_SAVE_MODE; import static com.android.server.tare.Modifier.COST_MODIFIER_PROCESS_STATE; import static com.android.server.tare.Modifier.NUM_COST_MODIFIERS; import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; Loading Loading @@ -62,7 +68,7 @@ public abstract class EconomicPolicy { /** * The base price to perform this action. If this is * less than the {@link #costToProduce}, then the system should not perform * the action unless a multiplier lowers the cost to produce. * the action unless a modifier lowers the cost to produce. */ public final long basePrice; Loading Loading @@ -91,11 +97,22 @@ public abstract class EconomicPolicy { } } private static final Modifier[] COST_MODIFIER_BY_INDEX = new Modifier[NUM_COST_MODIFIERS]; EconomicPolicy(@NonNull InternalResourceService irs) { for (int mId : getCostModifiers()) { initModifier(mId, irs); } } @CallSuper void onSystemServicesReady() { for (int i = 0; i < NUM_COST_MODIFIERS; ++i) { final Modifier modifier = COST_MODIFIER_BY_INDEX[i]; if (modifier != null) { modifier.onSystemServicesReady(); } } } /** Loading @@ -117,6 +134,10 @@ public abstract class EconomicPolicy { */ abstract long getMaxSatiatedCirculation(); /** Return the set of modifiers that should apply to this policy's costs. */ @NonNull abstract int[] getCostModifiers(); @Nullable abstract Action getAction(@NonNull String actionName); Loading @@ -125,4 +146,88 @@ public abstract class EconomicPolicy { void dump(IndentingPrintWriter pw) { } final long getCostOfAction(@NonNull String actionName, int userId, @NonNull String pkgName) { final Action action = getAction(actionName); if (action == null) { return 0; } long ctp = action.costToProduce; long price = action.basePrice; final int[] costModifiers = getCostModifiers(); boolean useProcessStatePriceDeterminant = false; for (int costModifier : costModifiers) { if (costModifier == COST_MODIFIER_PROCESS_STATE) { useProcessStatePriceDeterminant = true; } else { final Modifier modifier = getModifier(costModifier); ctp = modifier.getModifiedCostToProduce(ctp); price = modifier.getModifiedPrice(price); } } // ProcessStateModifier needs to be done last. if (useProcessStatePriceDeterminant) { ProcessStateModifier processStateModifier = (ProcessStateModifier) getModifier(COST_MODIFIER_PROCESS_STATE); price = processStateModifier.getModifiedPrice(userId, pkgName, ctp, price); } return price; } private static void initModifier(@Modifier.CostModifier final int modifierId, @NonNull InternalResourceService irs) { if (modifierId < 0 || modifierId >= COST_MODIFIER_BY_INDEX.length) { throw new IllegalArgumentException("Invalid modifier id " + modifierId); } Modifier modifier = COST_MODIFIER_BY_INDEX[modifierId]; if (modifier == null) { switch (modifierId) { case COST_MODIFIER_CHARGING: modifier = new ChargingModifier(irs); break; case COST_MODIFIER_DEVICE_IDLE: modifier = new DeviceIdleModifier(irs); break; case COST_MODIFIER_POWER_SAVE_MODE: modifier = new PowerSaveModeModifier(irs); break; case COST_MODIFIER_PROCESS_STATE: modifier = new ProcessStateModifier(irs); break; default: throw new IllegalArgumentException("Invalid modifier id " + modifierId); } COST_MODIFIER_BY_INDEX[modifierId] = modifier; } } @NonNull private static Modifier getModifier(@Modifier.CostModifier final int modifierId) { if (modifierId < 0 || modifierId >= COST_MODIFIER_BY_INDEX.length) { throw new IllegalArgumentException("Invalid modifier id " + modifierId); } final Modifier modifier = COST_MODIFIER_BY_INDEX[modifierId]; if (modifier == null) { throw new IllegalStateException( "Modifier #" + modifierId + " was never initialized"); } return modifier; } protected static void dumpActiveModifiers(IndentingPrintWriter pw) { for (int i = 0; i < NUM_COST_MODIFIERS; ++i) { pw.print("Modifier "); pw.println(i); pw.increaseIndent(); Modifier modifier = COST_MODIFIER_BY_INDEX[i]; if (modifier != null) { modifier.dump(pw); } else { pw.println("NOT ACTIVE"); } pw.decreaseIndent(); } } }