diff options
| author | 2023-06-28 12:00:14 -0700 | |
|---|---|---|
| committer | 2023-08-19 05:46:21 +0000 | |
| commit | 0e2f3922c18a24c8cd06440c16714673f80656b4 (patch) | |
| tree | 413b2e89df1961f228e4c02c5b089f33212a5366 | |
| parent | 478d1436de432240035a2aa44207cceb4afbfbd4 (diff) | |
Include PowerStats snapshots in battery history
Bug: 285646152
Test: atest FrameworksCoreTests:BatteryStatsTests FrameworksServicesTests:BatteryStatsTests
Change-Id: I7f202b2012844395c43e559819ff371bbaf2161e
10 files changed, 122 insertions, 610 deletions
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 42c56265bb4a..8ad14e2557ed 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -55,6 +55,7 @@ import android.view.Display; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BatteryStatsHistoryIterator; import com.android.internal.os.CpuScalingPolicies; +import com.android.internal.os.PowerStats; import com.google.android.collect.Lists; @@ -1793,79 +1794,6 @@ public abstract class BatteryStats { } /** - * Measured energy delta from the previous reading. - */ - public static final class EnergyConsumerDetails { - /** - * Description of the energy consumer, such as CPU, DISPLAY etc - */ - public static final class EnergyConsumer { - /** - * See android.hardware.power.stats.EnergyConsumerType - */ - public int type; - /** - * Used when there are multipe energy consumers of the same type, such - * as CPU clusters, multiple displays on foldable devices etc. - */ - public int ordinal; - /** - * Human-readable name of the energy consumer, e.g. "CPU" - */ - public String name; - } - public EnergyConsumer[] consumers; - public long[] chargeUC; - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder(); - for (int i = 0; i < consumers.length; i++) { - if (chargeUC[i] == POWER_DATA_UNAVAILABLE) { - continue; - } - if (sb.length() != 0) { - sb.append(' '); - } - sb.append(consumers[i].name); - sb.append('='); - sb.append(chargeUC[i]); - } - return sb.toString(); - } - } - - /** - * CPU usage for a given UID. - */ - public static final class CpuUsageDetails { - /** - * Descriptions of CPU power brackets, see PowerProfile.getCpuPowerBracketDescription - */ - public String[] cpuBracketDescriptions; - public int uid; - /** - * The delta, in milliseconds, per CPU power bracket, from the previous record for the - * same UID. - */ - public long[] cpuUsageMs; - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder(); - UserHandle.formatUid(sb, uid); - sb.append(": "); - for (int bracket = 0; bracket < cpuUsageMs.length; bracket++) { - if (bracket != 0) { - sb.append(", "); - } - sb.append(cpuUsageMs[bracket]); - } - return sb.toString(); - } - } - - /** * Battery history record. */ public static final class HistoryItem { @@ -2008,11 +1936,8 @@ public abstract class BatteryStats { // Non-null when there is more detailed information at this step. public HistoryStepDetails stepDetails; - // Non-null when there is energy consumer information - public EnergyConsumerDetails energyConsumerDetails; - - // Non-null when there is CPU usage information - public CpuUsageDetails cpuUsageDetails; + // Non-null when there are power stats to be written to history + public PowerStats powerStats; public static final int EVENT_FLAG_START = 0x8000; public static final int EVENT_FLAG_FINISH = 0x4000; @@ -2222,8 +2147,7 @@ public abstract class BatteryStats { eventCode = EVENT_NONE; eventTag = null; tagsFirstOccurrence = false; - energyConsumerDetails = null; - cpuUsageDetails = null; + powerStats = null; } @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P) @@ -2273,8 +2197,7 @@ public abstract class BatteryStats { } tagsFirstOccurrence = o.tagsFirstOccurrence; currentTime = o.currentTime; - energyConsumerDetails = o.energyConsumerDetails; - cpuUsageDetails = o.cpuUsageDetails; + powerStats = o.powerStats; } public boolean sameNonEvent(HistoryItem o) { @@ -6911,25 +6834,6 @@ public abstract class BatteryStats { private String printNextItem(HistoryItem rec, long baseTime, boolean checkin, boolean verbose) { StringBuilder item = new StringBuilder(); - - if (rec.cpuUsageDetails != null - && rec.cpuUsageDetails.cpuBracketDescriptions != null - && checkin) { - String[] descriptions = rec.cpuUsageDetails.cpuBracketDescriptions; - for (int bracket = 0; bracket < descriptions.length; bracket++) { - item.append(BATTERY_STATS_CHECKIN_VERSION); - item.append(','); - item.append(HISTORY_DATA); - item.append(",0,XB,"); - item.append(descriptions.length); - item.append(','); - item.append(bracket); - item.append(','); - item.append(descriptions[bracket]); - item.append("\n"); - } - } - if (!checkin) { item.append(" "); TimeUtils.formatDuration( @@ -7165,57 +7069,13 @@ public abstract class BatteryStats { item.append("\""); } } - boolean firstExtension = true; - if (rec.energyConsumerDetails != null) { - firstExtension = false; - if (!checkin) { - item.append(" ext=energy:"); - item.append(rec.energyConsumerDetails); - } else { - item.append(",XE"); - for (int i = 0; i < rec.energyConsumerDetails.consumers.length; i++) { - if (rec.energyConsumerDetails.chargeUC[i] != POWER_DATA_UNAVAILABLE) { - item.append(','); - item.append(rec.energyConsumerDetails.consumers[i].name); - item.append('='); - item.append(rec.energyConsumerDetails.chargeUC[i]); - } - } - } - } - if (rec.cpuUsageDetails != null) { + if (rec.powerStats != null && verbose) { if (!checkin) { - if (!firstExtension) { - item.append("\n "); - } - String[] descriptions = rec.cpuUsageDetails.cpuBracketDescriptions; - if (descriptions != null) { - for (int bracket = 0; bracket < descriptions.length; bracket++) { - item.append(" ext=cpu-bracket:"); - item.append(bracket); - item.append(":"); - item.append(descriptions[bracket]); - item.append("\n "); - } - } - item.append(" ext=cpu:"); - item.append(rec.cpuUsageDetails); - } else { - if (!firstExtension) { - item.append('\n'); - item.append(BATTERY_STATS_CHECKIN_VERSION); - item.append(','); - item.append(HISTORY_DATA); - item.append(",0"); - } - item.append(",XC,"); - item.append(rec.cpuUsageDetails.uid); - for (int i = 0; i < rec.cpuUsageDetails.cpuUsageMs.length; i++) { - item.append(','); - item.append(rec.cpuUsageDetails.cpuUsageMs[i]); - } + item.append( + "\n Stats: "); + item.append(rec.powerStats.formatForBatteryHistory( + "\n ")); } - firstExtension = false; } item.append("\n"); if (rec.stepDetails != null) { diff --git a/core/java/com/android/internal/os/BatteryStatsHistory.java b/core/java/com/android/internal/os/BatteryStatsHistory.java index 79152b4b618f..7eb81b54a16d 100644 --- a/core/java/com/android/internal/os/BatteryStatsHistory.java +++ b/core/java/com/android/internal/os/BatteryStatsHistory.java @@ -21,8 +21,6 @@ import android.annotation.Nullable; import android.os.BatteryManager; import android.os.BatteryStats; import android.os.BatteryStats.BitDescription; -import android.os.BatteryStats.CpuUsageDetails; -import android.os.BatteryStats.EnergyConsumerDetails; import android.os.BatteryStats.HistoryItem; import android.os.BatteryStats.HistoryStepDetails; import android.os.BatteryStats.HistoryTag; @@ -124,10 +122,8 @@ public class BatteryStatsHistory { // therefore the tag value is written in the parcel static final int TAG_FIRST_OCCURRENCE_FLAG = 0x8000; - static final int EXTENSION_MEASURED_ENERGY_HEADER_FLAG = 0x00000001; - static final int EXTENSION_MEASURED_ENERGY_FLAG = 0x00000002; - static final int EXTENSION_CPU_USAGE_HEADER_FLAG = 0x00000004; - static final int EXTENSION_CPU_USAGE_FLAG = 0x00000008; + static final int EXTENSION_POWER_STATS_DESCRIPTOR_FLAG = 0x00000001; + static final int EXTENSION_POWER_STATS_FLAG = 0x00000002; // For state1, trace everything except the wakelock bit (which can race with // suspend) and the running bit (which isn't meaningful in traces). @@ -200,9 +196,7 @@ public class BatteryStatsHistory { private long mTrackRunningHistoryElapsedRealtimeMs = 0; private long mTrackRunningHistoryUptimeMs = 0; private long mHistoryBaseTimeMs; - private boolean mMeasuredEnergyHeaderWritten = false; - private boolean mCpuUsageHeaderWritten = false; - private final VarintParceler mVarintParceler = new VarintParceler(); + private ArraySet<PowerStats.Descriptor> mWrittenPowerStatsDescriptors = new ArraySet<>(); private byte mLastHistoryStepLevel = 0; private boolean mMutable = true; private final BatteryStatsHistory mWritableHistory; @@ -384,8 +378,7 @@ public class BatteryStatsHistory { mLastHistoryElapsedRealtimeMs = 0; mTrackRunningHistoryElapsedRealtimeMs = 0; mTrackRunningHistoryUptimeMs = 0; - mMeasuredEnergyHeaderWritten = false; - mCpuUsageHeaderWritten = false; + mWrittenPowerStatsDescriptors.clear(); mHistoryBuffer.setDataSize(0); mHistoryBuffer.setDataPosition(0); @@ -1050,11 +1043,11 @@ public class BatteryStatsHistory { } /** - * Records measured energy data. + * Records a PowerStats snapshot. */ - public void recordEnergyConsumerDetails(long elapsedRealtimeMs, long uptimeMs, - EnergyConsumerDetails energyConsumerDetails) { - mHistoryCur.energyConsumerDetails = energyConsumerDetails; + public void recordPowerStats(long elapsedRealtimeMs, long uptimeMs, + PowerStats powerStats) { + mHistoryCur.powerStats = powerStats; mHistoryCur.states2 |= HistoryItem.STATE2_EXTENSIONS_FLAG; writeHistoryItem(elapsedRealtimeMs, uptimeMs); } @@ -1279,17 +1272,6 @@ public class BatteryStatsHistory { } /** - * Records CPU usage by a specific UID. The recorded data is the delta from - * the previous record for the same UID. - */ - public void recordCpuUsage(long elapsedRealtimeMs, long uptimeMs, - CpuUsageDetails cpuUsageDetails) { - mHistoryCur.cpuUsageDetails = cpuUsageDetails; - mHistoryCur.states2 |= HistoryItem.STATE2_EXTENSIONS_FLAG; - writeHistoryItem(elapsedRealtimeMs, uptimeMs); - } - - /** * Writes changes to a HistoryItem state bitmap to Atrace. */ private void recordTraceCounters(int oldval, int newval, int mask, @@ -1355,7 +1337,7 @@ public class BatteryStatsHistory { mTraceLastState2 = cur.states2; } - if (!mHaveBatteryLevel || !mRecordingHistory) { + if ((!mHaveBatteryLevel || !mRecordingHistory) && cur.powerStats == null) { return; } @@ -1391,8 +1373,7 @@ public class BatteryStatsHistory { && mHistoryLastWritten.batteryPlugType == cur.batteryPlugType && mHistoryLastWritten.batteryTemperature == cur.batteryTemperature && mHistoryLastWritten.batteryVoltage == cur.batteryVoltage - && mHistoryLastWritten.energyConsumerDetails == null - && mHistoryLastWritten.cpuUsageDetails == null) { + && mHistoryLastWritten.powerStats == null) { // We can merge this new change in with the last one. Merging is // allowed as long as only the states have changed, and within those states // as long as no bit has changed both between now and the last entry, as @@ -1454,8 +1435,7 @@ public class BatteryStatsHistory { for (Map.Entry<HistoryTag, Integer> entry : mHistoryTagPool.entrySet()) { entry.setValue(entry.getValue() | BatteryStatsHistory.TAG_FIRST_OCCURRENCE_FLAG); } - mMeasuredEnergyHeaderWritten = false; - mCpuUsageHeaderWritten = false; + mWrittenPowerStatsDescriptors.clear(); // Make a copy of mHistoryCur. HistoryItem copy = new HistoryItem(); @@ -1477,8 +1457,7 @@ public class BatteryStatsHistory { copy.eventCode = HistoryItem.EVENT_NONE; copy.eventTag = null; copy.tagsFirstOccurrence = false; - copy.energyConsumerDetails = null; - copy.cpuUsageDetails = null; + copy.powerStats = null; writeHistoryItem(elapsedRealtimeMs, uptimeMs, copy, HistoryItem.CMD_RESET); } writeHistoryItem(elapsedRealtimeMs, uptimeMs, cur, HistoryItem.CMD_UPDATE); @@ -1506,8 +1485,7 @@ public class BatteryStatsHistory { cur.eventCode = HistoryItem.EVENT_NONE; cur.eventTag = null; cur.tagsFirstOccurrence = false; - cur.energyConsumerDetails = null; - cur.cpuUsageDetails = null; + cur.powerStats = null; if (DEBUG) { Slog.i(TAG, "Writing history buffer: was " + mHistoryBufferLastPos + " now " + mHistoryBuffer.dataPosition() @@ -1638,16 +1616,10 @@ public class BatteryStatsHistory { if (stateIntChanged) { firstToken |= BatteryStatsHistory.DELTA_STATE_FLAG; } - if (cur.energyConsumerDetails != null) { - extensionFlags |= BatteryStatsHistory.EXTENSION_MEASURED_ENERGY_FLAG; - if (!mMeasuredEnergyHeaderWritten) { - extensionFlags |= BatteryStatsHistory.EXTENSION_MEASURED_ENERGY_HEADER_FLAG; - } - } - if (cur.cpuUsageDetails != null) { - extensionFlags |= EXTENSION_CPU_USAGE_FLAG; - if (!mCpuUsageHeaderWritten) { - extensionFlags |= BatteryStatsHistory.EXTENSION_CPU_USAGE_HEADER_FLAG; + if (cur.powerStats != null) { + extensionFlags |= BatteryStatsHistory.EXTENSION_POWER_STATS_FLAG; + if (!mWrittenPowerStatsDescriptors.contains(cur.powerStats.descriptor)) { + extensionFlags |= BatteryStatsHistory.EXTENSION_POWER_STATS_DESCRIPTOR_FLAG; } } if (extensionFlags != 0) { @@ -1773,37 +1745,13 @@ public class BatteryStatsHistory { dest.writeDouble(cur.wifiRailChargeMah); if (extensionFlags != 0) { dest.writeInt(extensionFlags); - if (cur.energyConsumerDetails != null) { - if (DEBUG) { - Slog.i(TAG, "WRITE DELTA: measuredEnergyDetails=" + cur.energyConsumerDetails); + if (cur.powerStats != null) { + if ((extensionFlags & BatteryStatsHistory.EXTENSION_POWER_STATS_DESCRIPTOR_FLAG) + != 0) { + cur.powerStats.descriptor.writeSummaryToParcel(dest); + mWrittenPowerStatsDescriptors.add(cur.powerStats.descriptor); } - if (!mMeasuredEnergyHeaderWritten) { - EnergyConsumerDetails.EnergyConsumer[] consumers = - cur.energyConsumerDetails.consumers; - dest.writeInt(consumers.length); - for (EnergyConsumerDetails.EnergyConsumer consumer : consumers) { - dest.writeInt(consumer.type); - dest.writeInt(consumer.ordinal); - dest.writeString(consumer.name); - } - mMeasuredEnergyHeaderWritten = true; - } - mVarintParceler.writeLongArray(dest, cur.energyConsumerDetails.chargeUC); - } - - if (cur.cpuUsageDetails != null) { - if (DEBUG) { - Slog.i(TAG, "WRITE DELTA: cpuUsageDetails=" + cur.cpuUsageDetails); - } - if (!mCpuUsageHeaderWritten) { - dest.writeInt(cur.cpuUsageDetails.cpuBracketDescriptions.length); - for (String desc: cur.cpuUsageDetails.cpuBracketDescriptions) { - dest.writeString(desc); - } - mCpuUsageHeaderWritten = true; - } - dest.writeInt(cur.cpuUsageDetails.uid); - mVarintParceler.writeLongArray(dest, cur.cpuUsageDetails.cpuUsageMs); + cur.powerStats.writeToParcel(dest); } } } @@ -2054,13 +2002,15 @@ public class BatteryStatsHistory { * fewer bytes. It is a bit more expensive than just writing the long into the parcel, * but at scale saves a lot of storage and allows recording of longer battery history. */ - @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public static final class VarintParceler { /** * Writes an array of longs into Parcel using the varint format, see * https://developers.google.com/protocol-buffers/docs/encoding#varints */ public void writeLongArray(Parcel parcel, long[] values) { + if (values.length == 0) { + return; + } int out = 0; int shift = 0; for (long value : values) { @@ -2092,6 +2042,9 @@ public class BatteryStatsHistory { * Reads a long written with {@link #writeLongArray} */ public void readLongArray(Parcel parcel, long[] values) { + if (values.length == 0) { + return; + } int in = parcel.readInt(); int available = 4; for (int i = 0; i < values.length; i++) { diff --git a/core/java/com/android/internal/os/BatteryStatsHistoryIterator.java b/core/java/com/android/internal/os/BatteryStatsHistoryIterator.java index 4c2b2854df88..9cd07637e60b 100644 --- a/core/java/com/android/internal/os/BatteryStatsHistoryIterator.java +++ b/core/java/com/android/internal/os/BatteryStatsHistoryIterator.java @@ -36,16 +36,10 @@ public class BatteryStatsHistoryIterator implements Iterator<BatteryStats.Histor private final BatteryStats.HistoryStepDetails mReadHistoryStepDetails = new BatteryStats.HistoryStepDetails(); private final SparseArray<BatteryStats.HistoryTag> mHistoryTags = new SparseArray<>(); - private BatteryStats.EnergyConsumerDetails mEnergyConsumerDetails; - private BatteryStats.CpuUsageDetails mCpuUsageDetails; - private final BatteryStatsHistory.VarintParceler mVarintParceler = - new BatteryStatsHistory.VarintParceler(); - + private final PowerStats.DescriptorRegistry mDescriptorRegistry = + new PowerStats.DescriptorRegistry(); private final BatteryStats.HistoryItem mHistoryItem = new BatteryStats.HistoryItem(); - private static final int MAX_ENERGY_CONSUMER_COUNT = 100; - private static final int MAX_CPU_BRACKET_COUNT = 100; - public BatteryStatsHistoryIterator(@NonNull BatteryStatsHistory history) { mBatteryStatsHistory = history; mHistoryItem.clear(); @@ -229,74 +223,17 @@ public class BatteryStatsHistoryIterator implements Iterator<BatteryStats.Histor cur.wifiRailChargeMah = src.readDouble(); if ((cur.states2 & BatteryStats.HistoryItem.STATE2_EXTENSIONS_FLAG) != 0) { final int extensionFlags = src.readInt(); - if ((extensionFlags & BatteryStatsHistory.EXTENSION_MEASURED_ENERGY_HEADER_FLAG) != 0) { - if (mEnergyConsumerDetails == null) { - mEnergyConsumerDetails = new BatteryStats.EnergyConsumerDetails(); - } - - final int consumerCount = src.readInt(); - if (consumerCount > MAX_ENERGY_CONSUMER_COUNT) { - // Check to avoid a heap explosion in case the parcel is corrupted - throw new IllegalStateException( - "EnergyConsumer count too high: " + consumerCount - + ". Max = " + MAX_ENERGY_CONSUMER_COUNT); - } - mEnergyConsumerDetails.consumers = - new BatteryStats.EnergyConsumerDetails.EnergyConsumer[consumerCount]; - mEnergyConsumerDetails.chargeUC = new long[consumerCount]; - for (int i = 0; i < consumerCount; i++) { - BatteryStats.EnergyConsumerDetails.EnergyConsumer consumer = - new BatteryStats.EnergyConsumerDetails.EnergyConsumer(); - consumer.type = src.readInt(); - consumer.ordinal = src.readInt(); - consumer.name = src.readString(); - mEnergyConsumerDetails.consumers[i] = consumer; - } + if ((extensionFlags & BatteryStatsHistory.EXTENSION_POWER_STATS_DESCRIPTOR_FLAG) != 0) { + PowerStats.Descriptor descriptor = PowerStats.Descriptor.readSummaryFromParcel(src); + mDescriptorRegistry.register(descriptor); } - - if ((extensionFlags & BatteryStatsHistory.EXTENSION_MEASURED_ENERGY_FLAG) != 0) { - if (mEnergyConsumerDetails == null) { - throw new IllegalStateException("MeasuredEnergyDetails without a header"); - } - - mVarintParceler.readLongArray(src, mEnergyConsumerDetails.chargeUC); - cur.energyConsumerDetails = mEnergyConsumerDetails; - } else { - cur.energyConsumerDetails = null; - } - - if ((extensionFlags & BatteryStatsHistory.EXTENSION_CPU_USAGE_HEADER_FLAG) != 0) { - mCpuUsageDetails = new BatteryStats.CpuUsageDetails(); - final int cpuBracketCount = src.readInt(); - if (cpuBracketCount > MAX_CPU_BRACKET_COUNT) { - // Check to avoid a heap explosion in case the parcel is corrupted - throw new IllegalStateException("Too many CPU brackets: " + cpuBracketCount - + ". Max = " + MAX_CPU_BRACKET_COUNT); - } - mCpuUsageDetails.cpuBracketDescriptions = new String[cpuBracketCount]; - for (int i = 0; i < cpuBracketCount; i++) { - mCpuUsageDetails.cpuBracketDescriptions[i] = src.readString(); - } - mCpuUsageDetails.cpuUsageMs = - new long[mCpuUsageDetails.cpuBracketDescriptions.length]; - } else if (mCpuUsageDetails != null) { - mCpuUsageDetails.cpuBracketDescriptions = null; - } - - if ((extensionFlags & BatteryStatsHistory.EXTENSION_CPU_USAGE_FLAG) != 0) { - if (mCpuUsageDetails == null) { - throw new IllegalStateException("CpuUsageDetails without a header"); - } - - mCpuUsageDetails.uid = src.readInt(); - mVarintParceler.readLongArray(src, mCpuUsageDetails.cpuUsageMs); - cur.cpuUsageDetails = mCpuUsageDetails; + if ((extensionFlags & BatteryStatsHistory.EXTENSION_POWER_STATS_FLAG) != 0) { + cur.powerStats = PowerStats.readFromParcel(src, mDescriptorRegistry); } else { - cur.cpuUsageDetails = null; + cur.powerStats = null; } } else { - cur.energyConsumerDetails = null; - cur.cpuUsageDetails = null; + cur.powerStats = null; } } diff --git a/core/java/com/android/internal/os/PowerStats.java b/core/java/com/android/internal/os/PowerStats.java index 12ce990afbf9..8b0e814c87aa 100644 --- a/core/java/com/android/internal/os/PowerStats.java +++ b/core/java/com/android/internal/os/PowerStats.java @@ -21,6 +21,7 @@ import android.annotation.Nullable; import android.os.BatteryConsumer; import android.os.Bundle; import android.os.Parcel; +import android.os.UserHandle; import android.util.IndentingPrintWriter; import android.util.Log; import android.util.SparseArray; @@ -137,6 +138,20 @@ public final class PowerStats { return new Descriptor(powerComponentId, name, statsArrayLength, uidStatsArrayLength, extras); } + + @Override + public String toString() { + if (extras != null) { + extras.size(); // Unparcel + } + return "PowerStats.Descriptor{" + + "powerComponentId=" + powerComponentId + + ", name='" + name + '\'' + + ", statsArrayLength=" + statsArrayLength + + ", uidStatsArrayLength=" + uidStatsArrayLength + + ", extras=" + extras + + '}'; + } } /** @@ -251,6 +266,23 @@ public final class PowerStats { } /** + * Formats the stats as a string suitable to be included in the Battery History dump. + */ + public String formatForBatteryHistory(String uidPrefix) { + StringBuilder sb = new StringBuilder(); + sb.append("duration=").append(durationMs).append(" ").append(descriptor.name); + if (stats.length > 0) { + sb.append("=").append(Arrays.toString(stats)); + } + for (int i = 0; i < uidStats.size(); i++) { + sb.append(uidPrefix) + .append(UserHandle.formatUid(uidStats.keyAt(i))) + .append(": ").append(Arrays.toString(uidStats.valueAt(i))); + } + return sb.toString(); + } + + /** * Prints the contents of the stats snapshot. */ public void dump(IndentingPrintWriter pw) { @@ -266,4 +298,9 @@ public final class PowerStats { } pw.decreaseIndent(); } + + @Override + public String toString() { + return "PowerStats: " + formatForBatteryHistory(" UID "); + } } diff --git a/services/core/java/com/android/server/power/stats/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/power/stats/BatteryExternalStatsWorker.java index f4b2f52eef9c..daf02ca81a10 100644 --- a/services/core/java/com/android/server/power/stats/BatteryExternalStatsWorker.java +++ b/services/core/java/com/android/server/power/stats/BatteryExternalStatsWorker.java @@ -687,12 +687,6 @@ public class BatteryExternalStatsWorker implements BatteryStatsImpl.ExternalStat BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS, reason, 0); - if (energyConsumerDeltas != null && !energyConsumerDeltas.isEmpty() - && mStats.isUsageHistoryEnabled()) { - mStats.recordEnergyConsumerDetailsLocked(elapsedRealtime, uptime, - mEnergyConsumerSnapshot.getEnergyConsumerDetails(energyConsumerDeltas)); - } - if ((updateFlags & UPDATE_CPU) != 0) { if (useLatestStates) { onBattery = mStats.isOnBatteryLocked(); diff --git a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java index 5b10afadc0fc..8c4301ed4f06 100644 --- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java +++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java @@ -125,6 +125,7 @@ import com.android.internal.os.KernelSingleUidTimeReader; import com.android.internal.os.LongArrayMultiStateCounter; import com.android.internal.os.LongMultiStateCounter; import com.android.internal.os.PowerProfile; +import com.android.internal.os.PowerStats; import com.android.internal.os.RailStats; import com.android.internal.os.RpmStats; import com.android.internal.power.EnergyConsumerStats; @@ -280,7 +281,6 @@ public class BatteryStatsImpl extends BatteryStats { = new KernelMemoryBandwidthStats(); private final LongSparseArray<SamplingTimer> mKernelMemoryStats = new LongSparseArray<>(); private int[] mCpuPowerBracketMap; - private final CpuUsageDetails mCpuUsageDetails = new CpuUsageDetails(); private final CpuPowerStatsCollector mCpuPowerStatsCollector; public LongSparseArray<SamplingTimer> getKernelMemoryStats() { @@ -613,15 +613,8 @@ public class BatteryStatsImpl extends BatteryStats { LongArrayMultiStateCounter onBatteryScreenOffCounter = u.getProcStateScreenOffTimeCounter(elapsedRealtimeMs).getCounter(); - if (isUsageHistoryEnabled()) { - LongArrayMultiStateCounter.LongArrayContainer deltaContainer = - getCpuTimeInFreqContainer(); - mKernelSingleUidTimeReader.addDelta(uid, onBatteryCounter, elapsedRealtimeMs, - deltaContainer); - recordCpuUsage(uid, deltaContainer, elapsedRealtimeMs, uptimeMs); - } else { - mKernelSingleUidTimeReader.addDelta(uid, onBatteryCounter, elapsedRealtimeMs); - } + + mKernelSingleUidTimeReader.addDelta(uid, onBatteryCounter, elapsedRealtimeMs); mKernelSingleUidTimeReader.addDelta(uid, onBatteryScreenOffCounter, elapsedRealtimeMs); if (u.mChildUids != null) { @@ -635,25 +628,12 @@ public class BatteryStatsImpl extends BatteryStats { mKernelSingleUidTimeReader.addDelta(u.mChildUids.keyAt(j), cpuTimeInFreqCounter, elapsedRealtimeMs, deltaContainer); onBatteryCounter.addCounts(deltaContainer); - if (isUsageHistoryEnabled()) { - recordCpuUsage(uid, deltaContainer, elapsedRealtimeMs, uptimeMs); - } onBatteryScreenOffCounter.addCounts(deltaContainer); } } } } - private void recordCpuUsage(int uid, LongArrayMultiStateCounter.LongArrayContainer cpuUsage, - long elapsedRealtimeMs, long uptimeMs) { - if (!cpuUsage.combineValues(mCpuUsageDetails.cpuUsageMs, mCpuPowerBracketMap)) { - return; - } - - mCpuUsageDetails.uid = uid; - mHistory.recordCpuUsage(elapsedRealtimeMs, uptimeMs, mCpuUsageDetails); - } - /** * Removes kernel CPU stats for removed UIDs, in the order they were added to the * mPendingRemovedUids queue. @@ -674,6 +654,10 @@ public class BatteryStatsImpl extends BatteryStats { */ @SuppressWarnings("GuardedBy") // errorprone false positive on getProcStateTimeCounter public void updateCpuTimesForAllUids() { + if (mCpuPowerStatsCollector != null) { + mCpuPowerStatsCollector.schedule(); + } + synchronized (BatteryStatsImpl.this) { if (!trackPerProcStateCpuTimes()) { return; @@ -705,16 +689,8 @@ public class BatteryStatsImpl extends BatteryStats { u.getProcStateScreenOffTimeCounter(elapsedRealtimeMs).getCounter(); if (uid == parentUid || Process.isSdkSandboxUid(uid)) { - if (isUsageHistoryEnabled()) { - LongArrayMultiStateCounter.LongArrayContainer deltaContainer = - getCpuTimeInFreqContainer(); - mKernelSingleUidTimeReader.addDelta(parentUid, onBatteryCounter, - elapsedRealtimeMs, deltaContainer); - recordCpuUsage(parentUid, deltaContainer, elapsedRealtimeMs, uptimeMs); - } else { - mKernelSingleUidTimeReader.addDelta(parentUid, onBatteryCounter, - elapsedRealtimeMs); - } + mKernelSingleUidTimeReader.addDelta(parentUid, onBatteryCounter, + elapsedRealtimeMs); mKernelSingleUidTimeReader.addDelta(parentUid, onBatteryScreenOffCounter, elapsedRealtimeMs); } else { @@ -727,9 +703,6 @@ public class BatteryStatsImpl extends BatteryStats { mKernelSingleUidTimeReader.addDelta(uid, counter, elapsedRealtimeMs, deltaContainer); onBatteryCounter.addCounts(deltaContainer); - if (isUsageHistoryEnabled()) { - recordCpuUsage(uid, deltaContainer, elapsedRealtimeMs, uptimeMs); - } onBatteryScreenOffCounter.addCounts(deltaContainer); } } @@ -860,6 +833,8 @@ public class BatteryStatsImpl extends BatteryStats { private final HistoryEventTracker mActiveEvents = new HistoryEventTracker(); private final HistoryStepDetailsCalculatorImpl mStepDetailsCalculator = new HistoryStepDetailsCalculatorImpl(); + private final PowerStats.DescriptorRegistry mPowerStatsDescriptorRegistry = + new PowerStats.DescriptorRegistry(); private boolean mHaveBatteryLevel = false; private boolean mBatteryPluggedIn; @@ -7674,18 +7649,6 @@ public class BatteryStatsImpl extends BatteryStats { return names; } - /** - * Adds energy consumer delta to battery history. - */ - @GuardedBy("this") - public void recordEnergyConsumerDetailsLocked(long elapsedRealtimeMs, - long uptimeMs, EnergyConsumerDetails energyConsumerDetails) { - if (isUsageHistoryEnabled()) { - mHistory.recordEnergyConsumerDetails(elapsedRealtimeMs, uptimeMs, - energyConsumerDetails); - } - } - @GuardedBy("this") @Override public long getStartClockTime() { final long currentTimeMs = mClock.currentTimeMillis(); @@ -10972,6 +10935,7 @@ public class BatteryStatsImpl extends BatteryStats { mCpuPowerStatsCollector = new CpuPowerStatsCollector(mCpuScalingPolicies, mPowerProfile, mHandler, mBatteryStatsConfig.getPowerStatsThrottlePeriodCpu()); + mCpuPowerStatsCollector.addConsumer(this::recordPowerStats); mStartCount++; initTimersAndCounters(); @@ -10991,6 +10955,14 @@ public class BatteryStatsImpl extends BatteryStats { FrameworkStatsLog.write(FrameworkStatsLog.DEVICE_IDLE_MODE_STATE_CHANGED, mDeviceIdleMode); } + private void recordPowerStats(PowerStats stats) { + if (stats.durationMs > 0) { + synchronized (this) { + mHistory.recordPowerStats(mClock.elapsedRealtime(), mClock.uptimeMillis(), stats); + } + } + } + @VisibleForTesting protected void initTimersAndCounters() { mScreenOnTimer = new StopwatchTimer(mClock, null, -1, null, mOnBatteryTimeBase); @@ -11100,14 +11072,6 @@ public class BatteryStatsImpl extends BatteryStats { } } - int cpuPowerBracketCount = mPowerProfile.getCpuPowerBracketCount(); - mCpuUsageDetails.cpuBracketDescriptions = new String[cpuPowerBracketCount]; - mCpuUsageDetails.cpuUsageMs = new long[cpuPowerBracketCount]; - for (int i = 0; i < cpuPowerBracketCount; i++) { - mCpuUsageDetails.cpuBracketDescriptions[i] = - mPowerProfile.getCpuPowerBracketDescription(mCpuScalingPolicies, i); - } - if (mEstimatedBatteryCapacityMah == -1) { // Initialize the estimated battery capacity to a known preset one. mEstimatedBatteryCapacityMah = (int) mPowerProfile.getBatteryCapacity(); @@ -15233,11 +15197,6 @@ public class BatteryStatsImpl extends BatteryStats { } @GuardedBy("this") - boolean isUsageHistoryEnabled() { - return mConstants.RECORD_USAGE_HISTORY; - } - - @GuardedBy("this") public void systemServicesReady(Context context) { mConstants.startObserving(context.getContentResolver()); registerUsbStateReceiver(context); @@ -15348,8 +15307,6 @@ public class BatteryStatsImpl extends BatteryStats { public static final String KEY_MAX_HISTORY_BUFFER_KB = "max_history_buffer_kb"; public static final String KEY_BATTERY_CHARGED_DELAY_MS = "battery_charged_delay_ms"; - public static final String KEY_RECORD_USAGE_HISTORY = - "record_usage_history"; public static final String KEY_PER_UID_MODEM_POWER_MODEL = "per_uid_modem_power_model"; public static final String KEY_PHONE_ON_EXTERNAL_STATS_COLLECTION = @@ -15400,7 +15357,6 @@ public class BatteryStatsImpl extends BatteryStats { private static final int DEFAULT_MAX_HISTORY_FILES_LOW_RAM_DEVICE = 64; private static final int DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB = 64; /*Kilo Bytes*/ private static final int DEFAULT_BATTERY_CHARGED_DELAY_MS = 900000; /* 15 min */ - private static final boolean DEFAULT_RECORD_USAGE_HISTORY = false; @PerUidModemPowerModel private static final int DEFAULT_PER_UID_MODEM_MODEL = PER_UID_MODEM_POWER_MODEL_MODEM_ACTIVITY_INFO_RX_TX; @@ -15422,7 +15378,6 @@ public class BatteryStatsImpl extends BatteryStats { public int MAX_HISTORY_FILES; public int MAX_HISTORY_BUFFER; /*Bytes*/ public int BATTERY_CHARGED_DELAY_MS = DEFAULT_BATTERY_CHARGED_DELAY_MS; - public boolean RECORD_USAGE_HISTORY = DEFAULT_RECORD_USAGE_HISTORY; public int PER_UID_MODEM_MODEL = DEFAULT_PER_UID_MODEM_MODEL; public boolean PHONE_ON_EXTERNAL_STATS_COLLECTION = DEFAULT_PHONE_ON_EXTERNAL_STATS_COLLECTION; @@ -15503,8 +15458,6 @@ public class BatteryStatsImpl extends BatteryStats { DEFAULT_MAX_HISTORY_BUFFER_LOW_RAM_DEVICE_KB : DEFAULT_MAX_HISTORY_BUFFER_KB) * 1024; - RECORD_USAGE_HISTORY = mParser.getBoolean( - KEY_RECORD_USAGE_HISTORY, DEFAULT_RECORD_USAGE_HISTORY); final String perUidModemModel = mParser.getString(KEY_PER_UID_MODEM_POWER_MODEL, ""); PER_UID_MODEM_MODEL = getPerUidModemModel(perUidModemModel); @@ -15582,8 +15535,6 @@ public class BatteryStatsImpl extends BatteryStats { pw.println(MAX_HISTORY_BUFFER/1024); pw.print(KEY_BATTERY_CHARGED_DELAY_MS); pw.print("="); pw.println(BATTERY_CHARGED_DELAY_MS); - pw.print(KEY_RECORD_USAGE_HISTORY); pw.print("="); - pw.println(RECORD_USAGE_HISTORY); pw.print(KEY_PER_UID_MODEM_POWER_MODEL); pw.print("="); pw.println(getPerUidModemModelName(PER_UID_MODEM_MODEL)); pw.print(KEY_PHONE_ON_EXTERNAL_STATS_COLLECTION); pw.print("="); diff --git a/services/core/java/com/android/server/power/stats/EnergyConsumerSnapshot.java b/services/core/java/com/android/server/power/stats/EnergyConsumerSnapshot.java index 939a08ba0b6a..7f50ae02aa39 100644 --- a/services/core/java/com/android/server/power/stats/EnergyConsumerSnapshot.java +++ b/services/core/java/com/android/server/power/stats/EnergyConsumerSnapshot.java @@ -23,7 +23,6 @@ import android.hardware.power.stats.EnergyConsumer; import android.hardware.power.stats.EnergyConsumerAttribution; import android.hardware.power.stats.EnergyConsumerResult; import android.hardware.power.stats.EnergyConsumerType; -import android.os.BatteryStats.EnergyConsumerDetails; import android.util.Slog; import android.util.SparseArray; import android.util.SparseIntArray; @@ -85,8 +84,6 @@ public class EnergyConsumerSnapshot { */ private final SparseArray<SparseLongArray> mAttributionSnapshots; - private EnergyConsumerDetails mEnergyConsumerDetails; - /** * Constructor that initializes to the given id->EnergyConsumer map, indicating which consumers * exist and what their details are. @@ -423,122 +420,4 @@ public class EnergyConsumerSnapshot { // since the last snapshot. Round off to the nearest whole long. return (deltaEnergyUJ * MILLIVOLTS_PER_VOLT + (avgVoltageMV / 2)) / avgVoltageMV; } - - /** - * Converts the EnergyConsumerDeltaData object to EnergyConsumerDetails, which can - * be saved in battery history. - */ - EnergyConsumerDetails getEnergyConsumerDetails( - EnergyConsumerDeltaData delta) { - if (mEnergyConsumerDetails == null) { - mEnergyConsumerDetails = createEnergyConsumerDetails(); - } - - final long[] chargeUC = mEnergyConsumerDetails.chargeUC; - for (int i = 0; i < mEnergyConsumerDetails.consumers.length; i++) { - EnergyConsumerDetails.EnergyConsumer energyConsumer = - mEnergyConsumerDetails.consumers[i]; - switch (energyConsumer.type) { - case EnergyConsumerType.BLUETOOTH: - chargeUC[i] = delta.bluetoothChargeUC; - break; - case EnergyConsumerType.CPU_CLUSTER: - if (delta.cpuClusterChargeUC != null) { - chargeUC[i] = delta.cpuClusterChargeUC[energyConsumer.ordinal]; - } else { - chargeUC[i] = UNAVAILABLE; - } - break; - case EnergyConsumerType.DISPLAY: - if (delta.displayChargeUC != null) { - chargeUC[i] = delta.displayChargeUC[energyConsumer.ordinal]; - } else { - chargeUC[i] = UNAVAILABLE; - } - break; - case EnergyConsumerType.GNSS: - chargeUC[i] = delta.gnssChargeUC; - break; - case EnergyConsumerType.MOBILE_RADIO: - chargeUC[i] = delta.mobileRadioChargeUC; - break; - case EnergyConsumerType.WIFI: - chargeUC[i] = delta.wifiChargeUC; - break; - case EnergyConsumerType.CAMERA: - chargeUC[i] = delta.cameraChargeUC; - break; - case EnergyConsumerType.OTHER: - if (delta.otherTotalChargeUC != null) { - chargeUC[i] = delta.otherTotalChargeUC[energyConsumer.ordinal]; - } else { - chargeUC[i] = UNAVAILABLE; - } - break; - default: - chargeUC[i] = UNAVAILABLE; - break; - } - } - return mEnergyConsumerDetails; - } - - private EnergyConsumerDetails createEnergyConsumerDetails() { - EnergyConsumerDetails details = new EnergyConsumerDetails(); - details.consumers = - new EnergyConsumerDetails.EnergyConsumer[mEnergyConsumers.size()]; - for (int i = 0; i < mEnergyConsumers.size(); i++) { - EnergyConsumer energyConsumer = mEnergyConsumers.valueAt(i); - EnergyConsumerDetails.EnergyConsumer consumer = - new EnergyConsumerDetails.EnergyConsumer(); - consumer.type = energyConsumer.type; - consumer.ordinal = energyConsumer.ordinal; - switch (consumer.type) { - case EnergyConsumerType.BLUETOOTH: - consumer.name = "BLUETOOTH"; - break; - case EnergyConsumerType.CPU_CLUSTER: - consumer.name = "CPU"; - break; - case EnergyConsumerType.DISPLAY: - consumer.name = "DISPLAY"; - break; - case EnergyConsumerType.GNSS: - consumer.name = "GNSS"; - break; - case EnergyConsumerType.MOBILE_RADIO: - consumer.name = "MOBILE_RADIO"; - break; - case EnergyConsumerType.WIFI: - consumer.name = "WIFI"; - break; - case EnergyConsumerType.OTHER: - consumer.name = sanitizeCustomBucketName(energyConsumer.name); - break; - default: - consumer.name = "UNKNOWN"; - break; - } - if (consumer.type != EnergyConsumerType.OTHER) { - boolean hasOrdinal = consumer.ordinal != 0; - if (!hasOrdinal) { - // See if any other EnergyConsumer of the same type has an ordinal - for (int j = 0; j < mEnergyConsumers.size(); j++) { - EnergyConsumer aConsumer = mEnergyConsumers.valueAt(j); - if (aConsumer.type == consumer.type && aConsumer.ordinal != 0) { - hasOrdinal = true; - break; - } - } - } - if (hasOrdinal) { - consumer.name = consumer.name + "/" + energyConsumer.ordinal; - } - } - details.consumers[i] = consumer; - } - - details.chargeUC = new long[details.consumers.length]; - return details; - } } diff --git a/services/tests/powerstatstests/AndroidManifest.xml b/services/tests/powerstatstests/AndroidManifest.xml index d3a88d2bc38c..d6898a1f6589 100644 --- a/services/tests/powerstatstests/AndroidManifest.xml +++ b/services/tests/powerstatstests/AndroidManifest.xml @@ -21,6 +21,7 @@ <uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/> <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/> <uses-permission android:name="android.permission.MANAGE_USERS"/> + <uses-permission android:name="android.permission.READ_DEVICE_CONFIG" /> <queries> <package android:name="com.android.coretests.apps.bstatstestapp" /> diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsHistoryTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsHistoryTest.java index f2cbef69c8e5..5a5b06e2e456 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsHistoryTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsHistoryTest.java @@ -24,11 +24,9 @@ import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; import android.content.Context; -import android.os.BatteryManager; import android.os.BatteryStats; -import android.os.BatteryStats.CpuUsageDetails; -import android.os.BatteryStats.EnergyConsumerDetails; import android.os.BatteryStats.HistoryItem; +import android.os.Bundle; import android.os.Parcel; import android.telephony.NetworkRegistrationInfo; import android.util.Log; @@ -38,6 +36,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.os.BatteryStatsHistory; import com.android.internal.os.BatteryStatsHistoryIterator; +import com.android.internal.os.PowerStats; import org.junit.Before; import org.junit.Test; @@ -275,47 +274,15 @@ public class BatteryStatsHistoryTest { } @Test - public void testRecordMeasuredEnergyDetails() { - mHistory.forceRecordAllHistory(); - mHistory.startRecordingHistory(0, 0, /* reset */ true); - mHistory.setBatteryState(true /* charging */, BatteryManager.BATTERY_STATUS_CHARGING, 80, - 1234); + public void recordPowerStats() { + PowerStats.Descriptor descriptor = new PowerStats.Descriptor(42, "foo", 1, 2, new Bundle()); + PowerStats powerStats = new PowerStats(descriptor); + powerStats.durationMs = 100; + powerStats.stats[0] = 200; + powerStats.uidStats.put(300, new long[]{400, 500}); + powerStats.uidStats.put(600, new long[]{700, 800}); - EnergyConsumerDetails details = new EnergyConsumerDetails(); - EnergyConsumerDetails.EnergyConsumer consumer1 = - new EnergyConsumerDetails.EnergyConsumer(); - consumer1.type = 42; - consumer1.ordinal = 0; - consumer1.name = "A"; - - EnergyConsumerDetails.EnergyConsumer consumer2 = - new EnergyConsumerDetails.EnergyConsumer(); - consumer2.type = 777; - consumer2.ordinal = 0; - consumer2.name = "B/0"; - - EnergyConsumerDetails.EnergyConsumer consumer3 = - new EnergyConsumerDetails.EnergyConsumer(); - consumer3.type = 777; - consumer3.ordinal = 1; - consumer3.name = "B/1"; - - EnergyConsumerDetails.EnergyConsumer consumer4 = - new EnergyConsumerDetails.EnergyConsumer(); - consumer4.type = 314; - consumer4.ordinal = 1; - consumer4.name = "C"; - - details.consumers = - new EnergyConsumerDetails.EnergyConsumer[]{consumer1, consumer2, consumer3, - consumer4}; - details.chargeUC = new long[details.consumers.length]; - for (int i = 0; i < details.chargeUC.length; i++) { - details.chargeUC[i] = 100L * i; - } - details.chargeUC[3] = BatteryStats.POWER_DATA_UNAVAILABLE; - - mHistory.recordEnergyConsumerDetails(200, 200, details); + mHistory.recordPowerStats(200, 200, powerStats); BatteryStatsHistoryIterator iterator = mHistory.iterate(); BatteryStats.HistoryItem item; @@ -325,62 +292,10 @@ public class BatteryStatsHistoryTest { String dump = toString(item, /* checkin */ false); assertThat(dump).contains("+200ms"); - assertThat(dump).contains("ext=energy:A=0 B/0=100 B/1=200"); - assertThat(dump).doesNotContain("C="); - - String checkin = toString(item, /* checkin */ true); - assertThat(checkin).contains("XE"); - assertThat(checkin).contains("A=0,B/0=100,B/1=200"); - assertThat(checkin).doesNotContain("C="); - } - - @Test - public void cpuUsageDetails() { - mHistory.forceRecordAllHistory(); - mHistory.startRecordingHistory(0, 0, /* reset */ true); - mHistory.setBatteryState(true /* charging */, BatteryManager.BATTERY_STATUS_CHARGING, 80, - 1234); - - CpuUsageDetails details = new CpuUsageDetails(); - details.cpuBracketDescriptions = new String[] {"low", "Med", "HIGH"}; - details.uid = 10123; - details.cpuUsageMs = new long[] { 100, 200, 300}; - mHistory.recordCpuUsage(200, 200, details); - - details.uid = 10321; - details.cpuUsageMs = new long[] { 400, 500, 600}; - mHistory.recordCpuUsage(300, 300, details); - - BatteryStatsHistoryIterator iterator = mHistory.iterate(); - BatteryStats.HistoryItem item = new BatteryStats.HistoryItem(); - assertThat(item = iterator.next()).isNotNull(); // First item contains current time only - - assertThat(item = iterator.next()).isNotNull(); - - String dump = toString(item, /* checkin */ false); - assertThat(dump).contains("+200ms"); - assertThat(dump).contains("ext=cpu:u0a123: 100, 200, 300"); - assertThat(dump).contains("ext=cpu-bracket:0:low"); - assertThat(dump).contains("ext=cpu-bracket:1:Med"); - assertThat(dump).contains("ext=cpu-bracket:2:HIGH"); - - String checkin = toString(item, /* checkin */ true); - assertThat(checkin).contains("XB,3,0,low"); - assertThat(checkin).contains("XB,3,1,Med"); - assertThat(checkin).contains("XB,3,2,HIGH"); - assertThat(checkin).contains("XC,10123,100,200,300"); - - assertThat(item = iterator.next()).isNotNull(); - - dump = toString(item, /* checkin */ false); - assertThat(dump).contains("+300ms"); - assertThat(dump).contains("ext=cpu:u0a321: 400, 500, 600"); - // Power bracket descriptions are written only once - assertThat(dump).doesNotContain("ext=cpu-bracket"); - - checkin = toString(item, /* checkin */ true); - assertThat(checkin).doesNotContain("XB"); - assertThat(checkin).contains("XC,10321,400,500,600"); + assertThat(dump).contains("duration=100"); + assertThat(dump).contains("foo=[200]"); + assertThat(dump).contains("300: [400, 500]"); + assertThat(dump).contains("600: [700, 800]"); } @Test @@ -596,6 +511,7 @@ public class BatteryStatsHistoryTest { 0xffffffffffffffffL}; // Parcel subarrays of different lengths and assert the size of the resulting parcel + testVarintParceler(Arrays.copyOfRange(values, 0, 0), 0); testVarintParceler(Arrays.copyOfRange(values, 0, 1), 4); // v. 8 testVarintParceler(Arrays.copyOfRange(values, 0, 2), 4); // v. 16 testVarintParceler(Arrays.copyOfRange(values, 0, 3), 4); // v. 24 diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/EnergyConsumerSnapshotTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/EnergyConsumerSnapshotTest.java index 28f4799656b7..6cd08653bc33 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/EnergyConsumerSnapshotTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/EnergyConsumerSnapshotTest.java @@ -26,7 +26,6 @@ import android.hardware.power.stats.EnergyConsumer; import android.hardware.power.stats.EnergyConsumerAttribution; import android.hardware.power.stats.EnergyConsumerResult; import android.hardware.power.stats.EnergyConsumerType; -import android.os.BatteryStats; import android.util.SparseArray; import android.util.SparseLongArray; @@ -238,17 +237,6 @@ public final class EnergyConsumerSnapshotTest { } @Test - public void getMeasuredEnergyDetails() { - final EnergyConsumerSnapshot snapshot = new EnergyConsumerSnapshot(ALL_ID_CONSUMER_MAP); - snapshot.updateAndGetDelta(RESULTS_0, VOLTAGE_0); - EnergyConsumerDeltaData delta = snapshot.updateAndGetDelta(RESULTS_1, VOLTAGE_1); - BatteryStats.EnergyConsumerDetails details = snapshot.getEnergyConsumerDetails(delta); - assertThat(details.consumers).hasLength(4); - assertThat(details.chargeUC).isEqualTo(new long[]{2667, 3200000, 0, 0}); - assertThat(details.toString()).isEqualTo("DISPLAY=2667 HPU=3200000 GPU=0 IPU &_=0"); - } - - @Test public void testUpdateAndGetDelta_updatesCameraCharge() { EnergyConsumer cameraConsumer = createEnergyConsumer(7, 0, EnergyConsumerType.CAMERA, "CAMERA"); @@ -266,12 +254,8 @@ public final class EnergyConsumerSnapshotTest { createEnergyConsumerResult(cameraConsumer.id, 90_000, null, null), }; EnergyConsumerDeltaData delta = snapshot.updateAndGetDelta(result1, VOLTAGE_1); - - // Verify that the delta between the two results is reported. - BatteryStats.EnergyConsumerDetails details = snapshot.getEnergyConsumerDetails(delta); - assertThat(details.consumers).hasLength(1); long expectedDeltaUC = calculateChargeConsumedUC(60_000, VOLTAGE_1, 90_000, VOLTAGE_1); - assertThat(details.chargeUC[0]).isEqualTo(expectedDeltaUC); + assertThat(delta.cameraChargeUC).isEqualTo(expectedDeltaUC); } private static EnergyConsumer createEnergyConsumer(int id, int ord, byte type, String name) { |