Merge "Address proportional counting for out-of-order timestamps" into tm-dev am: 860fe90fbd am: 892520724e

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18062923

Change-Id: I84bb17f4a2aef66253c0fb8072d82fae10ed302b
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Dmitri Plotnikov
2022-05-04 01:48:55 +00:00
committed by Automerger Merge Worker
3 changed files with 128 additions and 15 deletions

View File

@@ -472,9 +472,9 @@ public class BatteryStatsImpl extends BatteryStats {
mNumSingleUidCpuTimeReads++;
LongArrayMultiStateCounter onBatteryCounter =
u.getProcStateTimeCounter().getCounter();
u.getProcStateTimeCounter(timestampMs).getCounter();
LongArrayMultiStateCounter onBatteryScreenOffCounter =
u.getProcStateScreenOffTimeCounter().getCounter();
u.getProcStateScreenOffTimeCounter(timestampMs).getCounter();
mKernelSingleUidTimeReader.addDelta(uid, onBatteryCounter, timestampMs);
mKernelSingleUidTimeReader.addDelta(uid, onBatteryScreenOffCounter, timestampMs);
@@ -543,9 +543,9 @@ public class BatteryStatsImpl extends BatteryStats {
final long timestampMs = mClock.elapsedRealtime();
final LongArrayMultiStateCounter onBatteryCounter =
u.getProcStateTimeCounter().getCounter();
u.getProcStateTimeCounter(timestampMs).getCounter();
final LongArrayMultiStateCounter onBatteryScreenOffCounter =
u.getProcStateScreenOffTimeCounter().getCounter();
u.getProcStateScreenOffTimeCounter(timestampMs).getCounter();
if (uid == parentUid || Process.isSdkSandboxUid(uid)) {
mKernelSingleUidTimeReader.addDelta(parentUid, onBatteryCounter, timestampMs);
@@ -8935,8 +8935,8 @@ public class BatteryStatsImpl extends BatteryStats {
@VisibleForTesting
public void setProcessStateForTest(int procState, long elapsedTimeMs) {
mProcessState = procState;
getProcStateTimeCounter().setState(procState, elapsedTimeMs);
getProcStateScreenOffTimeCounter().setState(procState, elapsedTimeMs);
getProcStateTimeCounter(elapsedTimeMs).setState(procState, elapsedTimeMs);
getProcStateScreenOffTimeCounter(elapsedTimeMs).setState(procState, elapsedTimeMs);
final int batteryConsumerProcessState =
mapUidProcessStateToBatteryConsumerProcessState(procState);
getCpuActiveTimeCounter().setState(batteryConsumerProcessState, elapsedTimeMs);
@@ -9095,12 +9095,11 @@ public class BatteryStatsImpl extends BatteryStats {
}
@GuardedBy("mBsi")
private void ensureMultiStateCounters() {
private void ensureMultiStateCounters(long timestampMs) {
if (mProcStateTimeMs != null) {
return;
}
final long timestampMs = mBsi.mClock.elapsedRealtime();
mProcStateTimeMs =
new TimeInFreqMultiStateCounter(mBsi.mOnBatteryTimeBase,
PROC_STATE_TIME_COUNTER_STATE_COUNT, mBsi.getCpuFreqCount(),
@@ -9112,14 +9111,14 @@ public class BatteryStatsImpl extends BatteryStats {
}
@GuardedBy("mBsi")
private TimeInFreqMultiStateCounter getProcStateTimeCounter() {
ensureMultiStateCounters();
private TimeInFreqMultiStateCounter getProcStateTimeCounter(long timestampMs) {
ensureMultiStateCounters(timestampMs);
return mProcStateTimeMs;
}
@GuardedBy("mBsi")
private TimeInFreqMultiStateCounter getProcStateScreenOffTimeCounter() {
ensureMultiStateCounters();
private TimeInFreqMultiStateCounter getProcStateScreenOffTimeCounter(long timestampMs) {
ensureMultiStateCounters(timestampMs);
return mProcStateScreenOffTimeMs;
}
@@ -11972,9 +11971,9 @@ public class BatteryStatsImpl extends BatteryStats {
mBsi.updateProcStateCpuTimesLocked(mUid, elapsedRealtimeMs);
LongArrayMultiStateCounter onBatteryCounter =
getProcStateTimeCounter().getCounter();
getProcStateTimeCounter(elapsedRealtimeMs).getCounter();
LongArrayMultiStateCounter onBatteryScreenOffCounter =
getProcStateScreenOffTimeCounter().getCounter();
getProcStateScreenOffTimeCounter(elapsedRealtimeMs).getCounter();
onBatteryCounter.setState(uidRunningState, elapsedRealtimeMs);
onBatteryScreenOffCounter.setState(uidRunningState, elapsedRealtimeMs);

View File

@@ -18,6 +18,7 @@ package com.android.internal.os;
import android.content.Context;
import android.hardware.SensorManager;
import android.os.BatteryConsumer;
import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
@@ -26,6 +27,7 @@ import android.os.Process;
import android.os.SystemClock;
import android.os.UidBatteryConsumer;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
@@ -230,7 +232,52 @@ public class BatteryUsageStatsProvider {
batteryUsageStatsBuilder.setBatteryHistory(batteryStatsHistory);
}
return batteryUsageStatsBuilder.build();
BatteryUsageStats stats = batteryUsageStatsBuilder.build();
if (includeProcessStateData) {
verify(stats);
}
return stats;
}
// STOPSHIP(b/229906525): remove verification before shipping
private static boolean sErrorReported;
private void verify(BatteryUsageStats stats) {
if (sErrorReported) {
return;
}
final double precision = 2.0; // Allow rounding errors up to 2 mAh
final int[] components =
{BatteryConsumer.POWER_COMPONENT_CPU,
BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
BatteryConsumer.POWER_COMPONENT_WIFI,
BatteryConsumer.POWER_COMPONENT_BLUETOOTH};
final int[] states =
{BatteryConsumer.PROCESS_STATE_FOREGROUND,
BatteryConsumer.PROCESS_STATE_BACKGROUND,
BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE,
BatteryConsumer.PROCESS_STATE_CACHED};
for (UidBatteryConsumer ubc : stats.getUidBatteryConsumers()) {
for (int component : components) {
double consumedPower = ubc.getConsumedPower(ubc.getKey(component));
double sumStates = 0;
for (int state : states) {
sumStates += ubc.getConsumedPower(ubc.getKey(component, state));
}
if (sumStates > consumedPower + precision) {
String error = "Sum of states exceeds total. UID = " + ubc.getUid() + " "
+ BatteryConsumer.powerComponentIdToString(component)
+ " total = " + consumedPower + " states = " + sumStates;
if (!sErrorReported) {
Slog.wtf(TAG, error);
sErrorReported = true;
} else {
Slog.e(TAG, error);
}
return;
}
}
}
}
private long getProcessForegroundTimeMs(BatteryStats.Uid uid, long realtimeUs) {