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