diff options
author | 2024-11-01 15:35:28 -0700 | |
---|---|---|
committer | 2024-11-05 17:41:54 -0800 | |
commit | fac8075d4ac45d703be4a4c6cc8aab4a3c5e0280 (patch) | |
tree | 1a193c9f7076f7a52bc3b9dca738371b8ddeb3fe | |
parent | 2350f6b281f5b453afb849a5068f0855be663989 (diff) |
Export BatteryUsageStats into prepopulated buider
Instead of overriding what has already been captured in the builder,
always add new estimates. This way we can accumulate BatteryUsageStats
without allocating new CursorWindows.
Bug: 366493365
Test: atest PowerStatsTests
Flag: EXEMPT bugfix
Change-Id: Ica681e20c1091c2336532e58583ca5d3f55db85f
12 files changed, 188 insertions, 127 deletions
diff --git a/core/java/android/os/AggregateBatteryConsumer.java b/core/java/android/os/AggregateBatteryConsumer.java index c7f8878f104e..f0e12ca644dd 100644 --- a/core/java/android/os/AggregateBatteryConsumer.java +++ b/core/java/android/os/AggregateBatteryConsumer.java @@ -85,7 +85,7 @@ public final class AggregateBatteryConsumer extends BatteryConsumer { throw new XmlPullParserException("Invalid XML parser state"); } - consumerBuilder.setConsumedPower( + consumerBuilder.addConsumedPower( parser.getAttributeDouble(null, BatteryUsageStats.XML_ATTR_POWER)); while (!(eventType == XmlPullParser.END_TAG && parser.getName().equals( @@ -132,11 +132,19 @@ public final class AggregateBatteryConsumer extends BatteryConsumer { } /** + * Adds the total power included in this aggregate. + */ + public Builder addConsumedPower(double consumedPowerMah) { + mData.putDouble(COLUMN_INDEX_CONSUMED_POWER, + mData.getDouble(COLUMN_INDEX_CONSUMED_POWER) + consumedPowerMah); + return this; + } + + /** * Adds power and usage duration from the supplied AggregateBatteryConsumer. */ public void add(AggregateBatteryConsumer aggregateBatteryConsumer) { - setConsumedPower(mData.getDouble(COLUMN_INDEX_CONSUMED_POWER) - + aggregateBatteryConsumer.getConsumedPower()); + addConsumedPower(aggregateBatteryConsumer.getConsumedPower()); mPowerComponentsBuilder.addPowerAndDuration(aggregateBatteryConsumer.mPowerComponents); } diff --git a/core/java/android/os/BatteryConsumer.java b/core/java/android/os/BatteryConsumer.java index b0ecca790b80..14b67f64b6da 100644 --- a/core/java/android/os/BatteryConsumer.java +++ b/core/java/android/os/BatteryConsumer.java @@ -1064,7 +1064,9 @@ public abstract class BatteryConsumer { * @param componentId The ID of the power component, e.g. * {@link BatteryConsumer#POWER_COMPONENT_CPU}. * @param componentPower Amount of consumed power in mAh. + * @deprecated use {@link #addConsumedPower} */ + @Deprecated @NonNull public T setConsumedPower(@PowerComponentId int componentId, double componentPower) { return setConsumedPower(componentId, componentPower, POWER_MODEL_POWER_PROFILE); @@ -1076,7 +1078,9 @@ public abstract class BatteryConsumer { * @param componentId The ID of the power component, e.g. * {@link BatteryConsumer#POWER_COMPONENT_CPU}. * @param componentPower Amount of consumed power in mAh. + * @deprecated use {@link #addConsumedPower} */ + @Deprecated @SuppressWarnings("unchecked") @NonNull public T setConsumedPower(@PowerComponentId int componentId, double componentPower, @@ -1104,6 +1108,21 @@ public abstract class BatteryConsumer { @SuppressWarnings("unchecked") @NonNull + public T addConsumedPower(@PowerComponentId int componentId, double componentPower) { + mPowerComponentsBuilder.addConsumedPower(getKey(componentId, PROCESS_STATE_UNSPECIFIED), + componentPower, POWER_MODEL_UNDEFINED); + return (T) this; + } + + @SuppressWarnings("unchecked") + @NonNull + public T addConsumedPower(Key key, double componentPower) { + mPowerComponentsBuilder.addConsumedPower(key, componentPower, POWER_MODEL_UNDEFINED); + return (T) this; + } + + @SuppressWarnings("unchecked") + @NonNull public T addConsumedPower(Key key, double componentPower, @PowerModel int powerModel) { mPowerComponentsBuilder.addConsumedPower(key, componentPower, powerModel); return (T) this; @@ -1115,7 +1134,9 @@ public abstract class BatteryConsumer { * @param componentId The ID of the power component, e.g. * {@link UidBatteryConsumer#POWER_COMPONENT_CPU}. * @param componentUsageTimeMillis Amount of time in microseconds. + * @deprecated use {@link #addUsageDurationMillis} */ + @Deprecated @SuppressWarnings("unchecked") @NonNull public T setUsageDurationMillis(@PowerComponentId int componentId, @@ -1126,6 +1147,7 @@ public abstract class BatteryConsumer { return (T) this; } + @Deprecated @SuppressWarnings("unchecked") @NonNull public T setUsageDurationMillis(Key key, long componentUsageTimeMillis) { @@ -1133,6 +1155,14 @@ public abstract class BatteryConsumer { return (T) this; } + @NonNull + public T addUsageDurationMillis(@PowerComponentId int componentId, + long componentUsageTimeMillis) { + mPowerComponentsBuilder.addUsageDurationMillis( + getKey(componentId, PROCESS_STATE_UNSPECIFIED), componentUsageTimeMillis); + return (T) this; + } + @SuppressWarnings("unchecked") @NonNull public T addUsageDurationMillis(Key key, long componentUsageTimeMillis) { diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index 5ae425f184c7..72e4cef2f6eb 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -209,7 +209,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable { } builder.getAggregateBatteryConsumerBuilder(AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) - .setConsumedPower(totalPowerMah); + .addConsumedPower(totalPowerMah); mAggregateBatteryConsumers = new AggregateBatteryConsumer[AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT]; diff --git a/core/java/android/os/PowerComponents.java b/core/java/android/os/PowerComponents.java index f4e3f3b6e430..d116e0737c46 100644 --- a/core/java/android/os/PowerComponents.java +++ b/core/java/android/os/PowerComponents.java @@ -439,8 +439,8 @@ class PowerComponents { } final BatteryConsumer.Key key = builder.mData.layout.getKey(componentId, processState, screenState, powerState); - builder.setConsumedPower(key, powerMah, model); - builder.setUsageDurationMillis(key, durationMs); + builder.addConsumedPower(key, powerMah, model); + builder.addUsageDurationMillis(key, durationMs); break; } } @@ -468,6 +468,10 @@ class PowerComponents { } } + /** + * @deprecated use {@link #addConsumedPower(BatteryConsumer.Key, double, int)} + */ + @Deprecated @NonNull public Builder setConsumedPower(BatteryConsumer.Key key, double componentPower, int powerModel) { @@ -489,6 +493,10 @@ class PowerComponents { return this; } + /** + * @deprecated use {@link #addUsageDurationMillis(BatteryConsumer.Key, long)} + */ + @Deprecated @NonNull public Builder setUsageDurationMillis(BatteryConsumer.Key key, long componentUsageDurationMillis) { diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java index f893739fcf28..976bfe41ba45 100644 --- a/core/java/android/os/UidBatteryConsumer.java +++ b/core/java/android/os/UidBatteryConsumer.java @@ -210,12 +210,6 @@ public final class UidBatteryConsumer extends BatteryConsumer { serializer.attribute(null, BatteryUsageStats.XML_ATTR_HIGHEST_DRAIN_PACKAGE, packageWithHighestDrain); } - serializer.attributeLong(null, BatteryUsageStats.XML_ATTR_TIME_IN_FOREGROUND, - getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND)); - serializer.attributeLong(null, BatteryUsageStats.XML_ATTR_TIME_IN_BACKGROUND, - getTimeInProcessStateMs(PROCESS_STATE_BACKGROUND)); - serializer.attributeLong(null, BatteryUsageStats.XML_ATTR_TIME_IN_FOREGROUND_SERVICE, - getTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE)); mPowerComponents.writeToXml(serializer); serializer.endTag(null, BatteryUsageStats.XML_TAG_UID); } @@ -235,13 +229,6 @@ public final class UidBatteryConsumer extends BatteryConsumer { consumerBuilder.setPackageWithHighestDrain( parser.getAttributeValue(null, BatteryUsageStats.XML_ATTR_HIGHEST_DRAIN_PACKAGE)); - consumerBuilder.setTimeInProcessStateMs(PROCESS_STATE_FOREGROUND, - parser.getAttributeLong(null, BatteryUsageStats.XML_ATTR_TIME_IN_FOREGROUND)); - consumerBuilder.setTimeInProcessStateMs(PROCESS_STATE_BACKGROUND, - parser.getAttributeLong(null, BatteryUsageStats.XML_ATTR_TIME_IN_BACKGROUND)); - consumerBuilder.setTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE, - parser.getAttributeLong(null, - BatteryUsageStats.XML_ATTR_TIME_IN_FOREGROUND_SERVICE)); while (!(eventType == XmlPullParser.END_TAG && parser.getName().equals(BatteryUsageStats.XML_TAG_UID)) && eventType != XmlPullParser.END_DOCUMENT) { @@ -335,7 +322,11 @@ public final class UidBatteryConsumer extends BatteryConsumer { /** * Sets the duration, in milliseconds, that this UID was active in a particular process * state, such as foreground service. + * + * @deprecated time in process is now derived from the + * {@link BatteryConsumer#POWER_COMPONENT_BASE} duration */ + @Deprecated @NonNull public Builder setTimeInProcessStateMs(@ProcessState int state, long timeInProcessStateMs) { Key key = getKey(POWER_COMPONENT_BASE, state); diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 7c563abea22f..23092ed83809 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -453,7 +453,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub com.android.internal.R.integer.config_accumulatedBatteryUsageStatsSpanSize); mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context, mPowerAttributor, mPowerProfile, mCpuScalingPolicies, - mPowerStatsStore, accumulatedBatteryUsageStatsSpanSize, Clock.SYSTEM_CLOCK); + mPowerStatsStore, accumulatedBatteryUsageStatsSpanSize, Clock.SYSTEM_CLOCK, + mMonotonicClock); mDumpHelper = new BatteryStatsDumpHelperImpl(mBatteryUsageStatsProvider); mCpuWakeupStats = new CpuWakeupStats(context, R.xml.irq_device_map, mHandler); mConfigFile = new AtomicFile(new File(systemDir, "battery_usage_stats_config")); diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java index 600fe59215b6..606bd1dd0f3f 100644 --- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java +++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java @@ -51,6 +51,7 @@ public class BatteryUsageStatsProvider { private final CpuScalingPolicies mCpuScalingPolicies; private final int mAccumulatedBatteryUsageStatsSpanSize; private final Clock mClock; + private final MonotonicClock mMonotonicClock; private final Object mLock = new Object(); private List<PowerCalculator> mPowerCalculators; private UserPowerCalculator mUserPowerCalculator; @@ -67,7 +68,7 @@ public class BatteryUsageStatsProvider { @NonNull PowerAttributor powerAttributor, @NonNull PowerProfile powerProfile, @NonNull CpuScalingPolicies cpuScalingPolicies, @NonNull PowerStatsStore powerStatsStore, int accumulatedBatteryUsageStatsSpanSize, - @NonNull Clock clock) { + @NonNull Clock clock, @NonNull MonotonicClock monotonicClock) { mContext = context; mPowerAttributor = powerAttributor; mPowerStatsStore = powerStatsStore; @@ -75,6 +76,7 @@ public class BatteryUsageStatsProvider { mCpuScalingPolicies = cpuScalingPolicies; mAccumulatedBatteryUsageStatsSpanSize = accumulatedBatteryUsageStatsSpanSize; mClock = clock; + mMonotonicClock = monotonicClock; mUserPowerCalculator = new UserPowerCalculator(); mPowerStatsStore.addSectionReader(new BatteryUsageStatsSection.Reader()); @@ -213,7 +215,7 @@ public class BatteryUsageStatsProvider { powerStatsSpan.addTimeFrame(accumulatedStats.startMonotonicTime, accumulatedStats.startWallClockTime, accumulatedStats.endMonotonicTime - accumulatedStats.startMonotonicTime); - stats.commitMonotonicClock(); + mMonotonicClock.write(); mPowerStatsStore.storePowerStatsSpanAsync(powerStatsSpan, accumulatedStats.builder::discard); } @@ -308,23 +310,29 @@ public class BatteryUsageStatsProvider { private void updateAccumulatedBatteryUsageStats(AccumulatedBatteryUsageStats accumulatedStats, BatteryStatsImpl stats, BatteryUsageStatsQuery query) { - // TODO(b/366493365): add the current batteryusagestats directly into - // `accumulatedStats.builder` to avoid allocating a second CursorWindow - BatteryUsageStats.Builder remainingBatteryUsageStats = computeBatteryUsageStats(stats, - query, accumulatedStats.endMonotonicTime, query.getMonotonicEndTime(), - mClock.currentTimeMillis()); + long startMonotonicTime = accumulatedStats.endMonotonicTime; + if (startMonotonicTime == MonotonicClock.UNDEFINED) { + startMonotonicTime = stats.getMonotonicStartTime(); + } + long endWallClockTime = mClock.currentTimeMillis(); + long endMonotonicTime = mMonotonicClock.monotonicTime(); if (accumulatedStats.builder == null) { - accumulatedStats.builder = remainingBatteryUsageStats; + accumulatedStats.builder = new BatteryUsageStats.Builder( + stats.getCustomEnergyConsumerNames(), false, true, true, true, 0); accumulatedStats.startWallClockTime = stats.getStartClockTime(); - accumulatedStats.startMonotonicTime = stats.getMonotonicStartTime(); - accumulatedStats.endMonotonicTime = accumulatedStats.startMonotonicTime - + accumulatedStats.builder.getStatsDuration(); - } else { - accumulatedStats.builder.add(remainingBatteryUsageStats.build()); - accumulatedStats.endMonotonicTime += remainingBatteryUsageStats.getStatsDuration(); - remainingBatteryUsageStats.discard(); + accumulatedStats.builder.setStatsStartTimestamp(accumulatedStats.startWallClockTime); } + + accumulatedStats.endMonotonicTime = endMonotonicTime; + + accumulatedStats.builder.setStatsEndTimestamp(endWallClockTime); + accumulatedStats.builder.setStatsDuration(endWallClockTime - startMonotonicTime); + + mPowerAttributor.estimatePowerConsumption(accumulatedStats.builder, stats.getHistory(), + startMonotonicTime, MonotonicClock.UNDEFINED); + + populateGeneralInfo(accumulatedStats.builder, stats); } private BatteryUsageStats.Builder computeBatteryUsageStats(BatteryStatsImpl stats, diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsImplTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsImplTest.java index f02a389a160e..d83dc110800a 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsImplTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsImplTest.java @@ -67,6 +67,7 @@ import com.android.internal.os.CpuScalingPolicies; import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader; import com.android.internal.os.KernelSingleUidTimeReader; import com.android.internal.os.LongArrayMultiStateCounter; +import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerProfile; import com.android.server.power.feature.flags.Flags; @@ -120,6 +121,7 @@ public class BatteryStatsImplTest { }}); private final MockClock mMockClock = new MockClock(); + private final MonotonicClock mMonotonicClock = new MonotonicClock(777666, mMockClock); private MockBatteryStatsImpl mBatteryStatsImpl; private Handler mHandler; private PowerStatsStore mPowerStatsStore; @@ -160,7 +162,7 @@ public class BatteryStatsImplTest { mPowerStatsStore = new PowerStatsStore(systemDir, mHandler); mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context, mPowerAttributor, mPowerProfile, mBatteryStatsImpl.getCpuScalingPolicies(), mPowerStatsStore, 0, - mMockClock); + mMockClock, mMonotonicClock); } @Test diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsAtomTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsAtomTest.java index 813dd841b2b9..5d50e6c9f715 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsAtomTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsAtomTest.java @@ -191,7 +191,7 @@ public class BatteryUsageStatsAtomTest { "cpu", 1650.0f, 9300.0f, - 8400L + 8300L ); verify(statsLogger).buildStatsEvent( 1000L, @@ -205,7 +205,7 @@ public class BatteryUsageStatsAtomTest { "cpu", 1650.0f, 9400.0f, - 0L + 8400L ); verify(statsLogger).buildStatsEvent( 1000L, @@ -502,17 +502,17 @@ public class BatteryUsageStatsAtomTest { .setPackageWithHighestDrain("myPackage0") .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_FOREGROUND, 1000) .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_BACKGROUND, 2000) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.POWER_COMPONENT_SCREEN, 300) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.POWER_COMPONENT_CPU, 400) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 450) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 1, 500) - .setUsageDurationMillis( + .addUsageDurationMillis( BatteryConsumer.POWER_COMPONENT_CPU, 600) - .setUsageDurationMillis( + .addUsageDurationMillis( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + 1, 800); final BatteryConsumer.Key keyFg = uidBuilder.getKey(BatteryConsumer.POWER_COMPONENT_CPU, @@ -524,14 +524,14 @@ public class BatteryUsageStatsAtomTest { final BatteryConsumer.Key keyCached = uidBuilder.getKey(BatteryConsumer.POWER_COMPONENT_CPU, BatteryConsumer.PROCESS_STATE_CACHED); - uidBuilder.setConsumedPower(keyFg, 9100, BatteryConsumer.POWER_MODEL_POWER_PROFILE) - .setUsageDurationMillis(keyFg, 8100) - .setConsumedPower(keyBg, 9200, BatteryConsumer.POWER_MODEL_ENERGY_CONSUMPTION) - .setUsageDurationMillis(keyBg, 8200) - .setConsumedPower(keyFgs, 9300, BatteryConsumer.POWER_MODEL_ENERGY_CONSUMPTION) - .setUsageDurationMillis(keyFgs, 8300) - .setConsumedPower(keyCached, 9400, BatteryConsumer.POWER_MODEL_ENERGY_CONSUMPTION) - .setUsageDurationMillis(keyFgs, 8400); + uidBuilder.addConsumedPower(keyFg, 9100, BatteryConsumer.POWER_MODEL_POWER_PROFILE) + .addUsageDurationMillis(keyFg, 8100) + .addConsumedPower(keyBg, 9200, BatteryConsumer.POWER_MODEL_ENERGY_CONSUMPTION) + .addUsageDurationMillis(keyBg, 8200) + .addConsumedPower(keyFgs, 9300, BatteryConsumer.POWER_MODEL_ENERGY_CONSUMPTION) + .addUsageDurationMillis(keyFgs, 8300) + .addConsumedPower(keyCached, 9400, BatteryConsumer.POWER_MODEL_ENERGY_CONSUMPTION) + .addUsageDurationMillis(keyCached, 8400); final BatteryConsumer.Key keyCustomFg = uidBuilder.getKey( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, @@ -539,9 +539,9 @@ public class BatteryUsageStatsAtomTest { final BatteryConsumer.Key keyCustomBg = uidBuilder.getKey( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, BatteryConsumer.PROCESS_STATE_BACKGROUND); - uidBuilder.setConsumedPower( + uidBuilder.addConsumedPower( keyCustomFg, 100, BatteryConsumer.POWER_MODEL_ENERGY_CONSUMPTION); - uidBuilder.setConsumedPower( + uidBuilder.addConsumedPower( keyCustomBg, 350, BatteryConsumer.POWER_MODEL_ENERGY_CONSUMPTION); builder.getOrCreateUidBatteryConsumerBuilder(UID_1) @@ -549,36 +549,36 @@ public class BatteryUsageStatsAtomTest { .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_FOREGROUND, 1234); builder.getOrCreateUidBatteryConsumerBuilder(UID_2) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, + .addConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, 766); builder.getOrCreateUidBatteryConsumerBuilder(UID_3); builder.getAggregateBatteryConsumerBuilder(AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) - .setConsumedPower(30000) - .setConsumedPower( + .addConsumedPower(30000) + .addConsumedPower( BatteryConsumer.POWER_COMPONENT_CPU, 20100, BatteryConsumer.POWER_MODEL_POWER_PROFILE) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.POWER_COMPONENT_AUDIO, 0, BatteryConsumer.POWER_MODEL_POWER_PROFILE) // Empty - .setConsumedPower( + .addConsumedPower( BatteryConsumer.POWER_COMPONENT_CAMERA, 20150, BatteryConsumer.POWER_MODEL_ENERGY_CONSUMPTION) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 20200) - .setUsageDurationMillis( + .addUsageDurationMillis( BatteryConsumer.POWER_COMPONENT_CPU, 20300) - .setUsageDurationMillis( + .addUsageDurationMillis( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 20400); // Not used; just to make sure extraneous data doesn't mess things up. builder.getAggregateBatteryConsumerBuilder( BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.POWER_COMPONENT_CPU, 10100, BatteryConsumer.POWER_MODEL_POWER_PROFILE) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10200); return builder.build(); @@ -596,8 +596,8 @@ public class BatteryUsageStatsAtomTest { BatteryConsumer.PROCESS_STATE_FOREGROUND, 1 * 60 * 1000) .setTimeInProcessStateMs( BatteryConsumer.PROCESS_STATE_BACKGROUND, 2 * 60 * 1000) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, 30) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 40); + .addConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, 30) + .addConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 40); } // Add a UID with much larger battery footprint @@ -605,16 +605,16 @@ public class BatteryUsageStatsAtomTest { builder.getOrCreateUidBatteryConsumerBuilder(largeConsumerUid) .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_FOREGROUND, 10 * 60 * 1000) .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_BACKGROUND, 20 * 60 * 1000) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, 300) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 400); + .addConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, 300) + .addConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 400); // Add a UID with much larger usage duration final int highUsageUid = 3002; builder.getOrCreateUidBatteryConsumerBuilder(highUsageUid) .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_FOREGROUND, 60 * 60 * 1000) .setTimeInProcessStateMs(BatteryConsumer.PROCESS_STATE_BACKGROUND, 120 * 60 * 1000) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, 3) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 4); + .addConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, 3) + .addConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 4); BatteryUsageStats batteryUsageStats = builder.build(); final byte[] bytes = batteryUsageStats.getStatsProto(); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java index 8239e0955032..709f83ba907d 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java @@ -47,6 +47,7 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.internal.os.BatteryStatsHistoryIterator; +import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerProfile; import com.android.server.power.stats.processor.MultiStatePowerAttributor; @@ -80,6 +81,7 @@ public class BatteryUsageStatsProviderTest { .setAveragePower(PowerProfile.POWER_BATTERY_CAPACITY, 4000.0); private MockClock mMockClock = mStatsRule.getMockClock(); + private MonotonicClock mMonotonicClock = new MonotonicClock(666777, mMockClock); private Context mContext; @Before @@ -146,7 +148,8 @@ public class BatteryUsageStatsProviderTest { BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, mock(PowerAttributor.class), mStatsRule.getPowerProfile(), - mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock); + mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock, + mMonotonicClock); final BatteryUsageStats batteryUsageStats = provider.getBatteryUsageStats(batteryStats, @@ -273,7 +276,8 @@ public class BatteryUsageStatsProviderTest { BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, powerAttributor, mStatsRule.getPowerProfile(), - mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock); + mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock, + mMonotonicClock); return provider.getBatteryUsageStats(batteryStats, BatteryUsageStatsQuery.DEFAULT); } @@ -303,7 +307,8 @@ public class BatteryUsageStatsProviderTest { BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, mock(PowerAttributor.class), mStatsRule.getPowerProfile(), - mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock); + mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock, + mMonotonicClock); final BatteryUsageStats batteryUsageStats = provider.getBatteryUsageStats(batteryStats, @@ -396,7 +401,8 @@ public class BatteryUsageStatsProviderTest { BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, mock(PowerAttributor.class), mStatsRule.getPowerProfile(), - mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock); + mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock, + mMonotonicClock); final BatteryUsageStats batteryUsageStats = provider.getBatteryUsageStats(batteryStats, @@ -487,7 +493,8 @@ public class BatteryUsageStatsProviderTest { BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, mock(PowerAttributor.class), mStatsRule.getPowerProfile(), - mStatsRule.getCpuScalingPolicies(), powerStatsStore, 0, mMockClock); + mStatsRule.getCpuScalingPolicies(), powerStatsStore, 0, mMockClock, + mMonotonicClock); batteryStats.saveBatteryUsageStatsOnReset(provider, powerStatsStore, /* accumulateBatteryUsageStats */ false); @@ -590,7 +597,10 @@ public class BatteryUsageStatsProviderTest { private void accumulateBatteryUsageStats(int accumulatedBatteryUsageStatsSpanSize, int expectedNumberOfUpdates) throws Throwable { - BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); + BatteryStatsImpl batteryStats = spy(mStatsRule.getBatteryStats()); + // Note - these two are in microseconds + when(batteryStats.computeBatteryTimeRemaining(anyLong())).thenReturn(111_000L); + when(batteryStats.computeChargeTimeRemaining(anyLong())).thenReturn(777_000L); batteryStats.forceRecordAllHistory(); setTime(5 * MINUTE_IN_MS); @@ -623,7 +633,7 @@ public class BatteryUsageStatsProviderTest { BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, powerAttributor, mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), powerStatsStore, - accumulatedBatteryUsageStatsSpanSize, mMockClock); + accumulatedBatteryUsageStatsSpanSize, mMockClock, mMonotonicClock); provider.accumulateBatteryUsageStatsAsync(batteryStats, mStatsRule.getHandler()); @@ -677,9 +687,14 @@ public class BatteryUsageStatsProviderTest { BatteryUsageStats stats = provider.getBatteryUsageStats(batteryStats, new BatteryUsageStatsQuery.Builder().accumulated().build()); + assertThat(stats.getStatsStartTimestamp()).isEqualTo(5 * MINUTE_IN_MS); assertThat(stats.getStatsEndTimestamp()).isEqualTo(115 * MINUTE_IN_MS); + assertThat(stats.getBatteryTimeRemainingMs()).isEqualTo(111); + assertThat(stats.getChargeTimeRemainingMs()).isEqualTo(777); + assertThat(stats.getBatteryCapacity()).isEqualTo(4000); // from PowerProfile + // Total: 10 + 20 + 30 = 60 assertThat(stats.getAggregateBatteryConsumer( BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) @@ -729,7 +744,8 @@ public class BatteryUsageStatsProviderTest { BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, mock(PowerAttributor.class), mStatsRule.getPowerProfile(), - mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock); + mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), 0, mMockClock, + mMonotonicClock); PowerStatsStore powerStatsStore = mock(PowerStatsStore.class); doAnswer(invocation -> { @@ -796,7 +812,8 @@ public class BatteryUsageStatsProviderTest { BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, mock(PowerAttributor.class), mStatsRule.getPowerProfile(), - mStatsRule.getCpuScalingPolicies(), powerStatsStore, 0, mMockClock); + mStatsRule.getCpuScalingPolicies(), powerStatsStore, 0, mMockClock, + mMonotonicClock); BatteryUsageStatsQuery query = new BatteryUsageStatsQuery.Builder() .aggregateSnapshots(0, 3000) diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java index 1b6b8c49461e..9771da590e37 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java @@ -119,7 +119,7 @@ public class BatteryUsageStatsTest { BatteryStatsImpl.Uid mockUid = mock(BatteryStatsImpl.Uid.class); when(mockUid.getUid()).thenReturn(i); builder.getOrCreateUidBatteryConsumerBuilder(mockUid) - .setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, i * 100); + .addConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN, i * 100); } BatteryUsageStats outBatteryUsageStats = builder.build(); @@ -355,13 +355,13 @@ public class BatteryUsageStatsTest { if (includeUserBatteryConsumer) { builder.getOrCreateUserBatteryConsumerBuilder(USER_ID) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.POWER_COMPONENT_CPU, 10) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 20) - .setUsageDurationMillis( + .addUsageDurationMillis( BatteryConsumer.POWER_COMPONENT_CPU, 30) - .setUsageDurationMillis( + .addUsageDurationMillis( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 40); } return builder; @@ -422,15 +422,15 @@ public class BatteryUsageStatsTest { .setTimeInProcessStateMs(PROCESS_STATE_BACKGROUND, timeInProcessStateBackground) .setTimeInProcessStateMs(PROCESS_STATE_FOREGROUND_SERVICE, timeInProcessStateForegroundService) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.POWER_COMPONENT_SCREEN, screenPower, screenPowerModel) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.POWER_COMPONENT_CPU, cpuPower, cpuPowerModel) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, customComponentPower) - .setUsageDurationMillis( + .addUsageDurationMillis( BatteryConsumer.POWER_COMPONENT_CPU, cpuDuration) - .setUsageDurationMillis( + .addUsageDurationMillis( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, customComponentDuration); if (builder.isProcessStateDataNeeded()) { final BatteryConsumer.Key cpuFgKey = builder.isScreenStateDataNeeded() @@ -461,21 +461,21 @@ public class BatteryUsageStatsTest { BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, BatteryConsumer.PROCESS_STATE_BACKGROUND); uidBuilder - .setConsumedPower(cpuFgKey, cpuPowerForeground, + .addConsumedPower(cpuFgKey, cpuPowerForeground, BatteryConsumer.POWER_MODEL_POWER_PROFILE) - .setUsageDurationMillis(cpuFgKey, cpuDurationForeground) - .setConsumedPower(cpuBgKey, cpuPowerBackground, + .addUsageDurationMillis(cpuFgKey, cpuDurationForeground) + .addConsumedPower(cpuBgKey, cpuPowerBackground, BatteryConsumer.POWER_MODEL_POWER_PROFILE) - .setUsageDurationMillis(cpuBgKey, cpuDurationBackground) - .setConsumedPower(cpuFgsKey, cpuPowerFgs, + .addUsageDurationMillis(cpuBgKey, cpuDurationBackground) + .addConsumedPower(cpuFgsKey, cpuPowerFgs, BatteryConsumer.POWER_MODEL_POWER_PROFILE) - .setUsageDurationMillis(cpuFgsKey, cpuDurationFgs) - .setConsumedPower(cachedKey, cpuPowerCached, + .addUsageDurationMillis(cpuFgsKey, cpuDurationFgs) + .addConsumedPower(cachedKey, cpuPowerCached, BatteryConsumer.POWER_MODEL_POWER_PROFILE) - .setUsageDurationMillis(cachedKey, cpuDurationCached) - .setConsumedPower(customBgKey, customComponentPower, + .addUsageDurationMillis(cachedKey, cpuDurationCached) + .addConsumedPower(customBgKey, customComponentPower, BatteryConsumer.POWER_MODEL_UNDEFINED) - .setUsageDurationMillis(customBgKey, customComponentDuration); + .addUsageDurationMillis(customBgKey, customComponentDuration); } } @@ -486,15 +486,15 @@ public class BatteryUsageStatsTest { long cpuDurationChgScrOn, double cpuPowerChgScrOff, long cpuDurationChgScrOff) { final AggregateBatteryConsumer.Builder aggBuilder = builder.getAggregateBatteryConsumerBuilder(scope) - .setConsumedPower(consumedPower) - .setConsumedPower( + .addConsumedPower(consumedPower) + .addConsumedPower( BatteryConsumer.POWER_COMPONENT_CPU, cpuPower) - .setConsumedPower( + .addConsumedPower( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, customComponentPower) - .setUsageDurationMillis( + .addUsageDurationMillis( BatteryConsumer.POWER_COMPONENT_CPU, cpuDuration) - .setUsageDurationMillis( + .addUsageDurationMillis( BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, customComponentDuration); if (builder.isPowerStateDataNeeded() || builder.isScreenStateDataNeeded()) { @@ -519,18 +519,18 @@ public class BatteryUsageStatsTest { BatteryConsumer.SCREEN_STATE_OTHER, BatteryConsumer.POWER_STATE_OTHER); aggBuilder - .setConsumedPower(cpuBatScrOn, cpuPowerBatScrOn, + .addConsumedPower(cpuBatScrOn, cpuPowerBatScrOn, BatteryConsumer.POWER_MODEL_POWER_PROFILE) - .setUsageDurationMillis(cpuBatScrOn, cpuDurationBatScrOn) - .setConsumedPower(cpuBatScrOff, cpuPowerBatScrOff, + .addUsageDurationMillis(cpuBatScrOn, cpuDurationBatScrOn) + .addConsumedPower(cpuBatScrOff, cpuPowerBatScrOff, BatteryConsumer.POWER_MODEL_POWER_PROFILE) - .setUsageDurationMillis(cpuBatScrOff, cpuDurationBatScrOff) - .setConsumedPower(cpuChgScrOn, cpuPowerChgScrOn, + .addUsageDurationMillis(cpuBatScrOff, cpuDurationBatScrOff) + .addConsumedPower(cpuChgScrOn, cpuPowerChgScrOn, BatteryConsumer.POWER_MODEL_POWER_PROFILE) - .setUsageDurationMillis(cpuChgScrOn, cpuDurationChgScrOn) - .setConsumedPower(cpuChgScrOff, cpuPowerChgScrOff, + .addUsageDurationMillis(cpuChgScrOn, cpuDurationChgScrOn) + .addConsumedPower(cpuChgScrOff, cpuPowerChgScrOff, BatteryConsumer.POWER_MODEL_POWER_PROFILE) - .setUsageDurationMillis(cpuChgScrOff, cpuDurationChgScrOff); + .addUsageDurationMillis(cpuChgScrOff, cpuDurationChgScrOff); } } diff --git a/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryUsageStatsPerfTest.java b/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryUsageStatsPerfTest.java index 30cc002b4144..bfce3d276a2d 100644 --- a/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryUsageStatsPerfTest.java +++ b/tests/BatteryStatsPerfTest/src/com/android/internal/os/BatteryUsageStatsPerfTest.java @@ -168,32 +168,28 @@ public class BatteryUsageStatsPerfTest { builder.getAggregateBatteryConsumerBuilder( BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_ALL_APPS) - .setConsumedPower(123) - .setConsumedPower( - BatteryConsumer.POWER_COMPONENT_CPU, 10100) - .setConsumedPower( - BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10200) - .setUsageDurationMillis( - BatteryConsumer.POWER_COMPONENT_CPU, 10300) - .setUsageDurationMillis( - BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10400); + .addConsumedPower(123) + .addConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU, 10100) + .addConsumedPower(BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10200) + .addUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_CPU, 10300) + .addUsageDurationMillis(BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 10400); for (int i = 0; i < 1000; i++) { final UidBatteryConsumer.Builder consumerBuilder = builder.getOrCreateUidBatteryConsumerBuilder(i) .setPackageWithHighestDrain("example.packagename" + i) - .setTimeInStateMs(UidBatteryConsumer.STATE_FOREGROUND, i * 2000) - .setTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND, i * 1000); + .setTimeInProcessStateMs(UidBatteryConsumer.STATE_FOREGROUND, i * 2000) + .setTimeInProcessStateMs(UidBatteryConsumer.STATE_BACKGROUND, i * 1000); for (int componentId = 0; componentId < BatteryConsumer.POWER_COMPONENT_COUNT; componentId++) { - consumerBuilder.setConsumedPower(componentId, componentId * 123.0, + consumerBuilder.addConsumedPower(componentId, componentId * 123.0, BatteryConsumer.POWER_MODEL_POWER_PROFILE); - consumerBuilder.setUsageDurationMillis(componentId, componentId * 1000); + consumerBuilder.addUsageDurationMillis(componentId, componentId * 1000); } consumerBuilder - .setConsumedPower(BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 1234) - .setUsageDurationMillis(BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 4321); + .addConsumedPower(BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 1234) + .addUsageDurationMillis(BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID, 4321); } return builder.build(); } |