Add UID time-in-state to UidBatteryConsumer

Bug: 158137862
Test: atest FrameworksCoreTests:com.android.internal.os.BatteryUsageStatsProviderTest
Test: atest FrameworksCoreTests:com.android.internal.os.BatteryUsageStatsTest
Change-Id: I8fde2f754deaa0d2c4ebb06b9a2c99d60086bc23
This commit is contained in:
Dmitri Plotnikov
2021-02-18 11:34:51 -08:00
parent 863e3fee2b
commit f441fbf774
5 changed files with 232 additions and 34 deletions

View File

@@ -22,10 +22,12 @@ import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.Bundle;
import android.os.SystemClock;
import android.os.UidBatteryConsumer;
import android.os.UserHandle;
import android.util.SparseArray;
import com.android.internal.annotations.VisibleForTesting;
import java.util.ArrayList;
import java.util.List;
@@ -85,7 +87,7 @@ public class BatteryUsageStatsProvider {
}
/**
* Returns a snapshot of battery attribution data.
* Returns snapshots of battery attribution data, one per supplied query.
*/
public List<BatteryUsageStats> getBatteryUsageStats(List<BatteryUsageStatsQuery> queries) {
@@ -112,12 +114,19 @@ public class BatteryUsageStatsProvider {
return results;
}
private BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
/**
* Returns a snapshot of battery attribution data.
*/
@VisibleForTesting
public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) {
final long realtimeUs = mStats.mClocks.elapsedRealtime() * 1000;
final long uptimeUs = mStats.mClocks.uptimeMillis() * 1000;
final long[] customMeasuredEnergiesMicroJoules =
mStats.getCustomMeasuredEnergiesMicroJoules();
final int customPowerComponentCount = customMeasuredEnergiesMicroJoules != null
? customMeasuredEnergiesMicroJoules.length
: 0;
? customMeasuredEnergiesMicroJoules.length
: 0;
// TODO(b/174186358): read extra time component number from configuration
final int customTimeComponentCount = 0;
@@ -128,12 +137,14 @@ public class BatteryUsageStatsProvider {
SparseArray<? extends BatteryStats.Uid> uidStats = mStats.getUidStats();
for (int i = uidStats.size() - 1; i >= 0; i--) {
batteryUsageStatsBuilder.getOrCreateUidBatteryConsumerBuilder(uidStats.valueAt(i));
final BatteryStats.Uid uid = uidStats.valueAt(i);
batteryUsageStatsBuilder.getOrCreateUidBatteryConsumerBuilder(uid)
.setTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND,
getProcessBackgroundTimeMs(uid, realtimeUs))
.setTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND,
getProcessForegroundTimeMs(uid, realtimeUs));
}
final long realtimeUs = SystemClock.elapsedRealtime() * 1000;
final long uptimeUs = SystemClock.uptimeMillis() * 1000;
final List<PowerCalculator> powerCalculators = getPowerCalculators();
for (int i = 0, count = powerCalculators.size(); i < count; i++) {
PowerCalculator powerCalculator = powerCalculators.get(i);
@@ -143,4 +154,35 @@ public class BatteryUsageStatsProvider {
return batteryUsageStatsBuilder.build();
}
private long getProcessForegroundTimeMs(BatteryStats.Uid uid, long realtimeUs) {
final long topStateDurationMs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_TOP,
realtimeUs, BatteryStats.STATS_SINCE_CHARGED) / 1000;
long foregroundActivityDurationMs = 0;
final BatteryStats.Timer foregroundActivityTimer = uid.getForegroundActivityTimer();
if (foregroundActivityTimer != null) {
foregroundActivityDurationMs = foregroundActivityTimer.getTotalTimeLocked(realtimeUs,
BatteryStats.STATS_SINCE_CHARGED) / 1000;
}
// Use the min value of STATE_TOP time and foreground activity time, since both of these
// times are imprecise
final long foregroundDurationMs = Math.min(topStateDurationMs,
foregroundActivityDurationMs);
long foregroundServiceDurationMs = 0;
final BatteryStats.Timer foregroundServiceTimer = uid.getForegroundServiceTimer();
if (foregroundServiceTimer != null) {
foregroundServiceDurationMs = foregroundServiceTimer.getTotalTimeLocked(realtimeUs,
BatteryStats.STATS_SINCE_CHARGED) / 1000;
}
return foregroundDurationMs + foregroundServiceDurationMs;
}
private long getProcessBackgroundTimeMs(BatteryStats.Uid uid, long realtimeUs) {
return uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND, realtimeUs,
BatteryStats.STATS_SINCE_CHARGED) / 1000;
}
}