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.os.UserHandle; 8 import android.util.LongSparseArray; 9 import android.util.SparseArray; 10 11 import java.util.List; 12 13 public class MemoryPowerCalculator extends PowerCalculator { 14 public static final String TAG = "MemoryPowerCalculator"; 15 private final UsageBasedPowerEstimator[] mPowerEstimators; 16 MemoryPowerCalculator(PowerProfile profile)17 public MemoryPowerCalculator(PowerProfile profile) { 18 int numBuckets = profile.getNumElements(PowerProfile.POWER_MEMORY); 19 mPowerEstimators = new UsageBasedPowerEstimator[numBuckets]; 20 for (int i = 0; i < numBuckets; i++) { 21 mPowerEstimators[i] = new UsageBasedPowerEstimator( 22 profile.getAveragePower(PowerProfile.POWER_MEMORY, i)); 23 } 24 } 25 26 @Override calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query)27 public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats, 28 long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) { 29 final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, 30 BatteryStats.STATS_SINCE_CHARGED); 31 final double powerMah = calculatePower(batteryStats, rawRealtimeUs, 32 BatteryStats.STATS_SINCE_CHARGED); 33 builder.getAggregateBatteryConsumerBuilder( 34 BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) 35 .setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MEMORY, durationMs) 36 .setConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY, powerMah); 37 } 38 39 @Override calculate(List<BatterySipper> sippers, BatteryStats batteryStats, long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers)40 public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats, 41 long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) { 42 final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, statsType); 43 final double powerMah = calculatePower(batteryStats, rawRealtimeUs, statsType); 44 BatterySipper memory = new BatterySipper(BatterySipper.DrainType.MEMORY, null, 0); 45 memory.usageTimeMs = durationMs; 46 memory.usagePowerMah = powerMah; 47 memory.sumPower(); 48 if (memory.totalPowerMah > 0) { 49 sippers.add(memory); 50 } 51 } 52 calculateDuration(BatteryStats batteryStats, long rawRealtimeUs, int statsType)53 private long calculateDuration(BatteryStats batteryStats, long rawRealtimeUs, int statsType) { 54 long usageDurationMs = 0; 55 LongSparseArray<? extends BatteryStats.Timer> timers = batteryStats.getKernelMemoryStats(); 56 for (int i = 0; i < timers.size() && i < mPowerEstimators.length; i++) { 57 usageDurationMs += mPowerEstimators[i].calculateDuration(timers.valueAt(i), 58 rawRealtimeUs, statsType); 59 } 60 return usageDurationMs; 61 } 62 calculatePower(BatteryStats batteryStats, long rawRealtimeUs, int statsType)63 private double calculatePower(BatteryStats batteryStats, long rawRealtimeUs, int statsType) { 64 double powerMah = 0; 65 LongSparseArray<? extends BatteryStats.Timer> timers = batteryStats.getKernelMemoryStats(); 66 for (int i = 0; i < timers.size() && i < mPowerEstimators.length; i++) { 67 UsageBasedPowerEstimator estimator = mPowerEstimators[(int) timers.keyAt(i)]; 68 final long usageDurationMs = 69 estimator.calculateDuration(timers.valueAt(i), rawRealtimeUs, statsType); 70 powerMah += estimator.calculatePower(usageDurationMs); 71 } 72 return powerMah; 73 } 74 } 75