blob: 09fd85e42225b01e565d5c73fb7f04b77d68d377 [file] [log] [blame]
package com.android.internal.os;
import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.UserHandle;
import android.util.LongSparseArray;
import android.util.SparseArray;
import java.util.List;
public class MemoryPowerCalculator extends PowerCalculator {
public static final String TAG = "MemoryPowerCalculator";
private final UsageBasedPowerEstimator[] mPowerEstimators;
public MemoryPowerCalculator(PowerProfile profile) {
int numBuckets = profile.getNumElements(PowerProfile.POWER_MEMORY);
mPowerEstimators = new UsageBasedPowerEstimator[numBuckets];
for (int i = 0; i < numBuckets; i++) {
mPowerEstimators[i] = new UsageBasedPowerEstimator(
profile.getAveragePower(PowerProfile.POWER_MEMORY, i));
}
}
@Override
public void calculate(BatteryUsageStats.Builder builder, BatteryStats batteryStats,
long rawRealtimeUs, long rawUptimeUs, BatteryUsageStatsQuery query) {
final long durationMs = calculateDuration(batteryStats, rawRealtimeUs,
BatteryStats.STATS_SINCE_CHARGED);
final double powerMah = calculatePower(batteryStats, rawRealtimeUs,
BatteryStats.STATS_SINCE_CHARGED);
builder.getAggregateBatteryConsumerBuilder(
BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE)
.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MEMORY, durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_MEMORY, powerMah);
}
@Override
public void calculate(List<BatterySipper> sippers, BatteryStats batteryStats,
long rawRealtimeUs, long rawUptimeUs, int statsType, SparseArray<UserHandle> asUsers) {
final long durationMs = calculateDuration(batteryStats, rawRealtimeUs, statsType);
final double powerMah = calculatePower(batteryStats, rawRealtimeUs, statsType);
BatterySipper memory = new BatterySipper(BatterySipper.DrainType.MEMORY, null, 0);
memory.usageTimeMs = durationMs;
memory.usagePowerMah = powerMah;
memory.sumPower();
if (memory.totalPowerMah > 0) {
sippers.add(memory);
}
}
private long calculateDuration(BatteryStats batteryStats, long rawRealtimeUs, int statsType) {
long usageDurationMs = 0;
LongSparseArray<? extends BatteryStats.Timer> timers = batteryStats.getKernelMemoryStats();
for (int i = 0; i < timers.size() && i < mPowerEstimators.length; i++) {
usageDurationMs += mPowerEstimators[i].calculateDuration(timers.valueAt(i),
rawRealtimeUs, statsType);
}
return usageDurationMs;
}
private double calculatePower(BatteryStats batteryStats, long rawRealtimeUs, int statsType) {
double powerMah = 0;
LongSparseArray<? extends BatteryStats.Timer> timers = batteryStats.getKernelMemoryStats();
for (int i = 0; i < timers.size() && i < mPowerEstimators.length; i++) {
UsageBasedPowerEstimator estimator = mPowerEstimators[(int) timers.keyAt(i)];
final long usageDurationMs =
estimator.calculateDuration(timers.valueAt(i), rawRealtimeUs, statsType);
powerMah += estimator.calculatePower(usageDurationMs);
}
return powerMah;
}
}