1 package com.android.internal.os; 2 3 import android.os.BatteryConsumer; 4 import android.os.BatteryStats; 5 import android.os.BatteryUsageStats; 6 import android.os.BatteryUsageStatsQuery; 7 import android.util.LongSparseArray; 8 9 public class MemoryPowerCalculator extends PowerCalculator { 10 public static final String TAG = "MemoryPowerCalculator"; 11 private final UsageBasedPowerEstimator[] mPowerEstimators; 12 MemoryPowerCalculator(PowerProfile profile)13 public MemoryPowerCalculator(PowerProfile profile) { 14 int numBuckets = profile.getNumElements(PowerProfile.POWER_MEMORY); 15 mPowerEstimators = new UsageBasedPowerEstimator[numBuckets]; 16 for (int i = 0; i < numBuckets; i++) { 17 mPowerEstimators[i] = new UsageBasedPowerEstimator( 18 profile.getAveragePower(PowerProfile.POWER_MEMORY, i)); 19 } 20 } 21 22 @Override isPowerComponentSupported(@atteryConsumer.PowerComponent int powerComponent)23 public boolean isPowerComponentSupported(@BatteryConsumer.PowerComponent int powerComponent) { 24 return powerComponent == BatteryConsumer.POWER_COMPONENT_MEMORY; 25 } 26 27 @Override calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query)28 public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, 29 long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { 30 final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, 31 BatteryStats.STATS_SINCE_CHARGED); 32 final double powerMah = calculatePower(batteryStats, rawRealtimeUs, 33 BatteryStats.STATS_SINCE_CHARGED); 34 builder.getAggregateBatteryConsumerBuilder( 35 BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) 36 .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MEMORY, durationMs) 37 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY, powerMah); 38 } 39 calculateDuration(BatteryStats batteryStats, long rawRealtimeUs, int statsType)40 private long calculateDuration(BatteryStats batteryStats, long rawRealtimeUs, int statsType) { 41 long usageDurationMs = 0; 42 LongSparseArray<? extends BatteryStats.Timer> timers = batteryStats.getKernelMemoryStats(); 43 for (int i = 0; i < timers.size() && i < mPowerEstimators.length; i++) { 44 usageDurationMs += mPowerEstimators[i].calculateDuration(timers.valueAt(i), 45 rawRealtimeUs, statsType); 46 } 47 return usageDurationMs; 48 } 49 calculatePower(BatteryStats batteryStats, long rawRealtimeUs, int statsType)50 private double calculatePower(BatteryStats batteryStats, long rawRealtimeUs, int statsType) { 51 double powerMah = 0; 52 LongSparseArray<? extends BatteryStats.Timer> timers = batteryStats.getKernelMemoryStats(); 53 for (int i = 0; i < timers.size() && i < mPowerEstimators.length; i++) { 54 UsageBasedPowerEstimator estimator = mPowerEstimators[(int) timers.keyAt(i)]; 55 final long usageDurationMs = 56 estimator.calculateDuration(timers.valueAt(i), rawRealtimeUs, statsType); 57 powerMah += estimator.calculatePower(usageDurationMs); 58 } 59 return powerMah; 60 } 61 } 62