Loading core/java/android/os/BatteryConsumer.java +1 −0 Original line number Diff line number Diff line Loading @@ -191,6 +191,7 @@ public abstract class BatteryConsumer { private static final int[] SUPPORTED_POWER_COMPONENTS_PER_PROCESS_STATE = { POWER_COMPONENT_CPU, POWER_COMPONENT_MOBILE_RADIO, POWER_COMPONENT_WIFI, }; static final int COLUMN_INDEX_BATTERY_CONSUMER_TYPE = 0; Loading core/java/android/os/BatteryStats.java +17 −0 Original line number Diff line number Diff line Loading @@ -460,6 +460,12 @@ public abstract class BatteryStats implements Parcelable { */ public abstract long getCountLocked(int which); /** * Returns the count accumulated by this Counter for the specified process state. * If the counter does not support per-procstate tracking, returns 0. */ public abstract long getCountForProcessState(@BatteryConsumer.ProcessState int procState); /** * Temporary for debugging. */ Loading Loading @@ -1095,6 +1101,17 @@ public abstract class BatteryStats implements Parcelable { */ public abstract long getWifiMeasuredBatteryConsumptionUC(); /** * Returns the battery consumption (in microcoulombs) of the uid's wifi usage when in the * specified process state. * Will return {@link #POWER_DATA_UNAVAILABLE} if data is unavailable. * * {@hide} */ public abstract long getWifiMeasuredBatteryConsumptionUC( @BatteryConsumer.ProcessState int processState); /** * Returns the battery consumption (in microcoulombs) used by this uid for each * {@link android.hardware.power.stats.EnergyConsumer.ordinal} of (custom) energy consumer Loading core/java/com/android/internal/os/BatteryStatsImpl.java +280 −116 File changed.Preview size limit exceeded, changes collapsed. Show changes core/java/com/android/internal/os/WifiPowerCalculator.java +73 −8 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.os.UserHandle; import android.util.Log; import android.util.SparseArray; import java.util.Arrays; import java.util.List; /** Loading @@ -34,6 +35,9 @@ import java.util.List; public class WifiPowerCalculator extends PowerCalculator { private static final boolean DEBUG = BatteryStatsHelper.DEBUG; private static final String TAG = "WifiPowerCalculator"; private static final BatteryConsumer.Key[] UNINITIALIZED_KEYS = new BatteryConsumer.Key[0]; private final UsageBasedPowerEstimator mIdlePowerEstimator; private final UsageBasedPowerEstimator mTxPowerEstimator; private final UsageBasedPowerEstimator mRxPowerEstimator; Loading @@ -51,6 +55,9 @@ public class WifiPowerCalculator extends PowerCalculator { public long wifiTxPackets; public long wifiRxBytes; public long wifiTxBytes; public BatteryConsumer.Key[] keys; public double[] powerPerKeyMah; } public WifiPowerCalculator(PowerProfile profile) { Loading @@ -77,7 +84,7 @@ public class WifiPowerCalculator extends PowerCalculator { @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { BatteryConsumer.Key[] keys = UNINITIALIZED_KEYS; long totalAppDurationMs = 0; double totalAppPowerMah = 0; final PowerDurationAndTraffic powerDurationAndTraffic = new PowerDurationAndTraffic(); Loading @@ -85,9 +92,20 @@ public class WifiPowerCalculator extends PowerCalculator { builder.getUidBatteryConsumerBuilders(); for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); if (keys == UNINITIALIZED_KEYS) { if (query.isProcessStateDataNeeded()) { keys = app.getKeys(BatteryConsumer.POWER_COMPONENT_WIFI); powerDurationAndTraffic.keys = keys; powerDurationAndTraffic.powerPerKeyMah = new double[keys.length]; } else { keys = null; } } final long consumptionUC = app.getBatteryStatsUid().getWifiMeasuredBatteryConsumptionUC(); final int powerModel = getPowerModel(consumptionUC, query); calculateApp(powerDurationAndTraffic, app.getBatteryStatsUid(), powerModel, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED, batteryStats.hasWifiActivityReporting(), consumptionUC); Loading @@ -99,6 +117,20 @@ public class WifiPowerCalculator extends PowerCalculator { powerDurationAndTraffic.durationMs); app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI, powerDurationAndTraffic.powerMah, powerModel); if (query.isProcessStateDataNeeded() && keys != null) { for (int j = 0; j < keys.length; j++) { BatteryConsumer.Key key = keys[j]; final int processState = key.processState; if (processState == BatteryConsumer.PROCESS_STATE_UNSPECIFIED) { // Already populated with the total across all process states continue; } app.setConsumedPower(key, powerDurationAndTraffic.powerPerKeyMah[j], powerModel); } } } final long consumptionUC = batteryStats.getWifiMeasuredBatteryConsumptionUC(); Loading Loading @@ -193,21 +225,23 @@ public class WifiPowerCalculator extends PowerCalculator { BatteryStats.NETWORK_WIFI_TX_DATA, statsType); if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { powerDurationAndTraffic.powerMah = uCtoMah(consumptionUC); } if (hasWifiActivityReporting && mHasWifiPowerController) { final BatteryStats.ControllerActivityCounter counter = u.getWifiControllerActivity(); if (counter != null) { final long idleTime = counter.getIdleTimeCounter().getCountLocked(statsType); final long txTime = counter.getTxTimeCounters()[0].getCountLocked(statsType); final long rxTime = counter.getRxTimeCounter().getCountLocked(statsType); final BatteryStats.LongCounter rxTimeCounter = counter.getRxTimeCounter(); final BatteryStats.LongCounter txTimeCounter = counter.getTxTimeCounters()[0]; final BatteryStats.LongCounter idleTimeCounter = counter.getIdleTimeCounter(); final long rxTime = rxTimeCounter.getCountLocked(statsType); final long txTime = txTimeCounter.getCountLocked(statsType); final long idleTime = idleTimeCounter.getCountLocked(statsType); powerDurationAndTraffic.durationMs = idleTime + rxTime + txTime; if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) { powerDurationAndTraffic.powerMah = calcPowerFromControllerDataMah(rxTime, txTime, idleTime); } else { powerDurationAndTraffic.powerMah = uCtoMah(consumptionUC); } if (DEBUG && powerDurationAndTraffic.powerMah != 0) { Loading @@ -215,9 +249,32 @@ public class WifiPowerCalculator extends PowerCalculator { + "ms tx=" + txTime + "ms power=" + formatCharge( powerDurationAndTraffic.powerMah)); } if (powerDurationAndTraffic.keys != null) { for (int i = 0; i < powerDurationAndTraffic.keys.length; i++) { final int processState = powerDurationAndTraffic.keys[i].processState; if (processState == BatteryConsumer.PROCESS_STATE_UNSPECIFIED) { continue; } if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) { powerDurationAndTraffic.powerPerKeyMah[i] = calcPowerFromControllerDataMah( rxTimeCounter.getCountForProcessState(processState), txTimeCounter.getCountForProcessState(processState), idleTimeCounter.getCountForProcessState(processState)); } else { powerDurationAndTraffic.powerPerKeyMah[i] = uCtoMah(u.getWifiMeasuredBatteryConsumptionUC(processState)); } } } } else { powerDurationAndTraffic.durationMs = 0; powerDurationAndTraffic.powerMah = 0; if (powerDurationAndTraffic.powerPerKeyMah != null) { Arrays.fill(powerDurationAndTraffic.powerPerKeyMah, 0); } } } else { final long wifiRunningTime = u.getWifiRunningTime(rawRealtimeUs, statsType) / 1000; Loading @@ -233,6 +290,14 @@ public class WifiPowerCalculator extends PowerCalculator { powerDurationAndTraffic.wifiRxPackets, powerDurationAndTraffic.wifiTxPackets, wifiRunningTime, wifiScanTimeMs, batchTimeMs); } else { powerDurationAndTraffic.powerMah = uCtoMah(consumptionUC); } if (powerDurationAndTraffic.powerPerKeyMah != null) { // Per-process state attribution is not supported in the absence of WiFi // activity reporting Arrays.fill(powerDurationAndTraffic.powerPerKeyMah, 0); } if (DEBUG && powerDurationAndTraffic.powerMah != 0) { Loading core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml +1 −2 Original line number Diff line number Diff line Loading @@ -16,8 +16,7 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.frameworks.core.batterystatsviewer" android:sharedUserId="android.uid.system"> package="com.android.frameworks.core.batterystatsviewer"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.BATTERY_STATS"/> Loading Loading
core/java/android/os/BatteryConsumer.java +1 −0 Original line number Diff line number Diff line Loading @@ -191,6 +191,7 @@ public abstract class BatteryConsumer { private static final int[] SUPPORTED_POWER_COMPONENTS_PER_PROCESS_STATE = { POWER_COMPONENT_CPU, POWER_COMPONENT_MOBILE_RADIO, POWER_COMPONENT_WIFI, }; static final int COLUMN_INDEX_BATTERY_CONSUMER_TYPE = 0; Loading
core/java/android/os/BatteryStats.java +17 −0 Original line number Diff line number Diff line Loading @@ -460,6 +460,12 @@ public abstract class BatteryStats implements Parcelable { */ public abstract long getCountLocked(int which); /** * Returns the count accumulated by this Counter for the specified process state. * If the counter does not support per-procstate tracking, returns 0. */ public abstract long getCountForProcessState(@BatteryConsumer.ProcessState int procState); /** * Temporary for debugging. */ Loading Loading @@ -1095,6 +1101,17 @@ public abstract class BatteryStats implements Parcelable { */ public abstract long getWifiMeasuredBatteryConsumptionUC(); /** * Returns the battery consumption (in microcoulombs) of the uid's wifi usage when in the * specified process state. * Will return {@link #POWER_DATA_UNAVAILABLE} if data is unavailable. * * {@hide} */ public abstract long getWifiMeasuredBatteryConsumptionUC( @BatteryConsumer.ProcessState int processState); /** * Returns the battery consumption (in microcoulombs) used by this uid for each * {@link android.hardware.power.stats.EnergyConsumer.ordinal} of (custom) energy consumer Loading
core/java/com/android/internal/os/BatteryStatsImpl.java +280 −116 File changed.Preview size limit exceeded, changes collapsed. Show changes
core/java/com/android/internal/os/WifiPowerCalculator.java +73 −8 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.os.UserHandle; import android.util.Log; import android.util.SparseArray; import java.util.Arrays; import java.util.List; /** Loading @@ -34,6 +35,9 @@ import java.util.List; public class WifiPowerCalculator extends PowerCalculator { private static final boolean DEBUG = BatteryStatsHelper.DEBUG; private static final String TAG = "WifiPowerCalculator"; private static final BatteryConsumer.Key[] UNINITIALIZED_KEYS = new BatteryConsumer.Key[0]; private final UsageBasedPowerEstimator mIdlePowerEstimator; private final UsageBasedPowerEstimator mTxPowerEstimator; private final UsageBasedPowerEstimator mRxPowerEstimator; Loading @@ -51,6 +55,9 @@ public class WifiPowerCalculator extends PowerCalculator { public long wifiTxPackets; public long wifiRxBytes; public long wifiTxBytes; public BatteryConsumer.Key[] keys; public double[] powerPerKeyMah; } public WifiPowerCalculator(PowerProfile profile) { Loading @@ -77,7 +84,7 @@ public class WifiPowerCalculator extends PowerCalculator { @Override public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { BatteryConsumer.Key[] keys = UNINITIALIZED_KEYS; long totalAppDurationMs = 0; double totalAppPowerMah = 0; final PowerDurationAndTraffic powerDurationAndTraffic = new PowerDurationAndTraffic(); Loading @@ -85,9 +92,20 @@ public class WifiPowerCalculator extends PowerCalculator { builder.getUidBatteryConsumerBuilders(); for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) { final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i); if (keys == UNINITIALIZED_KEYS) { if (query.isProcessStateDataNeeded()) { keys = app.getKeys(BatteryConsumer.POWER_COMPONENT_WIFI); powerDurationAndTraffic.keys = keys; powerDurationAndTraffic.powerPerKeyMah = new double[keys.length]; } else { keys = null; } } final long consumptionUC = app.getBatteryStatsUid().getWifiMeasuredBatteryConsumptionUC(); final int powerModel = getPowerModel(consumptionUC, query); calculateApp(powerDurationAndTraffic, app.getBatteryStatsUid(), powerModel, rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED, batteryStats.hasWifiActivityReporting(), consumptionUC); Loading @@ -99,6 +117,20 @@ public class WifiPowerCalculator extends PowerCalculator { powerDurationAndTraffic.durationMs); app.setConsumedPower(BatteryConsumer.POWER_COMPONENT_WIFI, powerDurationAndTraffic.powerMah, powerModel); if (query.isProcessStateDataNeeded() && keys != null) { for (int j = 0; j < keys.length; j++) { BatteryConsumer.Key key = keys[j]; final int processState = key.processState; if (processState == BatteryConsumer.PROCESS_STATE_UNSPECIFIED) { // Already populated with the total across all process states continue; } app.setConsumedPower(key, powerDurationAndTraffic.powerPerKeyMah[j], powerModel); } } } final long consumptionUC = batteryStats.getWifiMeasuredBatteryConsumptionUC(); Loading Loading @@ -193,21 +225,23 @@ public class WifiPowerCalculator extends PowerCalculator { BatteryStats.NETWORK_WIFI_TX_DATA, statsType); if (powerModel == BatteryConsumer.POWER_MODEL_MEASURED_ENERGY) { powerDurationAndTraffic.powerMah = uCtoMah(consumptionUC); } if (hasWifiActivityReporting && mHasWifiPowerController) { final BatteryStats.ControllerActivityCounter counter = u.getWifiControllerActivity(); if (counter != null) { final long idleTime = counter.getIdleTimeCounter().getCountLocked(statsType); final long txTime = counter.getTxTimeCounters()[0].getCountLocked(statsType); final long rxTime = counter.getRxTimeCounter().getCountLocked(statsType); final BatteryStats.LongCounter rxTimeCounter = counter.getRxTimeCounter(); final BatteryStats.LongCounter txTimeCounter = counter.getTxTimeCounters()[0]; final BatteryStats.LongCounter idleTimeCounter = counter.getIdleTimeCounter(); final long rxTime = rxTimeCounter.getCountLocked(statsType); final long txTime = txTimeCounter.getCountLocked(statsType); final long idleTime = idleTimeCounter.getCountLocked(statsType); powerDurationAndTraffic.durationMs = idleTime + rxTime + txTime; if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) { powerDurationAndTraffic.powerMah = calcPowerFromControllerDataMah(rxTime, txTime, idleTime); } else { powerDurationAndTraffic.powerMah = uCtoMah(consumptionUC); } if (DEBUG && powerDurationAndTraffic.powerMah != 0) { Loading @@ -215,9 +249,32 @@ public class WifiPowerCalculator extends PowerCalculator { + "ms tx=" + txTime + "ms power=" + formatCharge( powerDurationAndTraffic.powerMah)); } if (powerDurationAndTraffic.keys != null) { for (int i = 0; i < powerDurationAndTraffic.keys.length; i++) { final int processState = powerDurationAndTraffic.keys[i].processState; if (processState == BatteryConsumer.PROCESS_STATE_UNSPECIFIED) { continue; } if (powerModel == BatteryConsumer.POWER_MODEL_POWER_PROFILE) { powerDurationAndTraffic.powerPerKeyMah[i] = calcPowerFromControllerDataMah( rxTimeCounter.getCountForProcessState(processState), txTimeCounter.getCountForProcessState(processState), idleTimeCounter.getCountForProcessState(processState)); } else { powerDurationAndTraffic.powerPerKeyMah[i] = uCtoMah(u.getWifiMeasuredBatteryConsumptionUC(processState)); } } } } else { powerDurationAndTraffic.durationMs = 0; powerDurationAndTraffic.powerMah = 0; if (powerDurationAndTraffic.powerPerKeyMah != null) { Arrays.fill(powerDurationAndTraffic.powerPerKeyMah, 0); } } } else { final long wifiRunningTime = u.getWifiRunningTime(rawRealtimeUs, statsType) / 1000; Loading @@ -233,6 +290,14 @@ public class WifiPowerCalculator extends PowerCalculator { powerDurationAndTraffic.wifiRxPackets, powerDurationAndTraffic.wifiTxPackets, wifiRunningTime, wifiScanTimeMs, batchTimeMs); } else { powerDurationAndTraffic.powerMah = uCtoMah(consumptionUC); } if (powerDurationAndTraffic.powerPerKeyMah != null) { // Per-process state attribution is not supported in the absence of WiFi // activity reporting Arrays.fill(powerDurationAndTraffic.powerPerKeyMah, 0); } if (DEBUG && powerDurationAndTraffic.powerMah != 0) { Loading
core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml +1 −2 Original line number Diff line number Diff line Loading @@ -16,8 +16,7 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.frameworks.core.batterystatsviewer" android:sharedUserId="android.uid.system"> package="com.android.frameworks.core.batterystatsviewer"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.BATTERY_STATS"/> Loading