• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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