diff options
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(); } |