diff options
82 files changed, 1690 insertions, 1327 deletions
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 8e87342a9569..955b75d8bba0 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -123,31 +123,16 @@ import com.android.server.Watchdog; import com.android.server.net.BaseNetworkObserver; import com.android.server.pm.UserManagerInternal; import com.android.server.power.optimization.Flags; -import com.android.server.power.stats.AggregatedPowerStatsConfig; -import com.android.server.power.stats.AmbientDisplayPowerStatsProcessor; -import com.android.server.power.stats.AudioPowerStatsProcessor; import com.android.server.power.stats.BatteryExternalStatsWorker; import com.android.server.power.stats.BatteryStatsDumpHelperImpl; import com.android.server.power.stats.BatteryStatsImpl; import com.android.server.power.stats.BatteryUsageStatsProvider; -import com.android.server.power.stats.BluetoothPowerStatsProcessor; -import com.android.server.power.stats.CameraPowerStatsProcessor; -import com.android.server.power.stats.CpuPowerStatsProcessor; -import com.android.server.power.stats.CustomEnergyConsumerPowerStatsProcessor; -import com.android.server.power.stats.FlashlightPowerStatsProcessor; -import com.android.server.power.stats.GnssPowerStatsProcessor; -import com.android.server.power.stats.MobileRadioPowerStatsProcessor; -import com.android.server.power.stats.PhoneCallPowerStatsProcessor; -import com.android.server.power.stats.PowerStatsAggregator; -import com.android.server.power.stats.PowerStatsExporter; +import com.android.server.power.stats.PowerAttributor; import com.android.server.power.stats.PowerStatsScheduler; import com.android.server.power.stats.PowerStatsStore; import com.android.server.power.stats.PowerStatsUidResolver; -import com.android.server.power.stats.ScreenPowerStatsProcessor; -import com.android.server.power.stats.SensorPowerStatsProcessor; import com.android.server.power.stats.SystemServerCpuThreadReader.SystemServiceCpuThreadTimes; -import com.android.server.power.stats.VideoPowerStatsProcessor; -import com.android.server.power.stats.WifiPowerStatsProcessor; +import com.android.server.power.stats.processor.MultiStatePowerAttributor; import com.android.server.power.stats.wakeups.CpuWakeupStats; import java.io.File; @@ -207,7 +192,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub private final AtomicFile mConfigFile; private final BatteryStats.BatteryStatsDumpHelper mDumpHelper; private final PowerStatsUidResolver mPowerStatsUidResolver = new PowerStatsUidResolver(); - private final AggregatedPowerStatsConfig mAggregatedPowerStatsConfig; + private final PowerAttributor mPowerAttributor; private volatile boolean mMonitorEnabled = true; @@ -445,14 +430,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub mStats.startTrackingSystemServerCpuTime(); } - mAggregatedPowerStatsConfig = createAggregatedPowerStatsConfig(); - mPowerStatsStore = new PowerStatsStore(systemDir, mHandler, mAggregatedPowerStatsConfig); + mPowerStatsStore = new PowerStatsStore(systemDir, mHandler); + mPowerAttributor = new MultiStatePowerAttributor(mContext, mPowerStatsStore, mPowerProfile, + mCpuScalingPolicies, mPowerStatsUidResolver); mPowerStatsScheduler = createPowerStatsScheduler(mContext); - PowerStatsExporter powerStatsExporter = - new PowerStatsExporter(mPowerStatsStore, - new PowerStatsAggregator(mAggregatedPowerStatsConfig, mStats.getHistory())); mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context, - powerStatsExporter, mPowerProfile, mCpuScalingPolicies, + mPowerAttributor, mPowerProfile, mCpuScalingPolicies, mPowerStatsStore, Clock.SYSTEM_CLOCK); mStats.saveBatteryUsageStatsOnReset(mBatteryUsageStatsProvider, mPowerStatsStore); mDumpHelper = new BatteryStatsDumpHelperImpl(mBatteryUsageStatsProvider); @@ -472,154 +455,11 @@ public final class BatteryStatsService extends IBatteryStats.Stub onAlarmListener, aHandler); }; return new PowerStatsScheduler(mStats::schedulePowerStatsSampleCollection, - new PowerStatsAggregator(mAggregatedPowerStatsConfig, - mStats.getHistory()), aggregatedPowerStatsSpanDuration, + mStats.getHistory(), mPowerAttributor, aggregatedPowerStatsSpanDuration, powerStatsAggregationPeriod, mPowerStatsStore, alarmScheduler, Clock.SYSTEM_CLOCK, mMonotonicClock, () -> mStats.getHistory().getStartTime(), mHandler); } - private AggregatedPowerStatsConfig createAggregatedPowerStatsConfig() { - AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_CPU) - .trackDeviceStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .trackUidStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN, - AggregatedPowerStatsConfig.STATE_PROCESS_STATE) - .setProcessorSupplier( - () -> new CpuPowerStatsProcessor(mPowerProfile, mCpuScalingPolicies)); - - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_SCREEN) - .trackDeviceStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .trackUidStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .setProcessorSupplier( - () -> new ScreenPowerStatsProcessor(mPowerProfile)); - - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, - BatteryConsumer.POWER_COMPONENT_SCREEN) - .setProcessorSupplier(AmbientDisplayPowerStatsProcessor::new); - - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) - .trackDeviceStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .trackUidStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN, - AggregatedPowerStatsConfig.STATE_PROCESS_STATE) - .setProcessorSupplier( - () -> new MobileRadioPowerStatsProcessor(mPowerProfile)); - - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_PHONE, - BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) - .setProcessorSupplier(PhoneCallPowerStatsProcessor::new); - - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_WIFI) - .trackDeviceStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .trackUidStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN, - AggregatedPowerStatsConfig.STATE_PROCESS_STATE) - .setProcessorSupplier( - () -> new WifiPowerStatsProcessor(mPowerProfile)); - - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_BLUETOOTH) - .trackDeviceStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .trackUidStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN, - AggregatedPowerStatsConfig.STATE_PROCESS_STATE) - .setProcessorSupplier( - () -> new BluetoothPowerStatsProcessor(mPowerProfile)); - - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_AUDIO) - .trackDeviceStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .trackUidStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN, - AggregatedPowerStatsConfig.STATE_PROCESS_STATE) - .setProcessorSupplier( - () -> new AudioPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver)); - - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_VIDEO) - .trackDeviceStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .trackUidStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN, - AggregatedPowerStatsConfig.STATE_PROCESS_STATE) - .setProcessorSupplier( - () -> new VideoPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver)); - - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT) - .trackDeviceStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .trackUidStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN, - AggregatedPowerStatsConfig.STATE_PROCESS_STATE) - .setProcessorSupplier( - () -> new FlashlightPowerStatsProcessor(mPowerProfile, - mPowerStatsUidResolver)); - - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_CAMERA) - .trackDeviceStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .trackUidStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN, - AggregatedPowerStatsConfig.STATE_PROCESS_STATE) - .setProcessorSupplier( - () -> new CameraPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver)); - - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_GNSS) - .trackDeviceStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .trackUidStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN, - AggregatedPowerStatsConfig.STATE_PROCESS_STATE) - .setProcessorSupplier( - () -> new GnssPowerStatsProcessor(mPowerProfile, mPowerStatsUidResolver)); - - config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_SENSORS) - .trackDeviceStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .trackUidStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN, - AggregatedPowerStatsConfig.STATE_PROCESS_STATE) - .setProcessorSupplier(() -> new SensorPowerStatsProcessor( - () -> mContext.getSystemService(SensorManager.class))); - - config.trackCustomPowerComponents(CustomEnergyConsumerPowerStatsProcessor::new) - .trackDeviceStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN) - .trackUidStates( - AggregatedPowerStatsConfig.STATE_POWER, - AggregatedPowerStatsConfig.STATE_SCREEN, - AggregatedPowerStatsConfig.STATE_PROCESS_STATE); - return config; - } - private void setPowerStatsThrottlePeriods(BatteryStatsImpl.BatteryStatsConfig.Builder builder, String configString) { if (configString == null) { @@ -664,83 +504,84 @@ public final class BatteryStatsService extends IBatteryStats.Stub } public void systemServicesReady() { + MultiStatePowerAttributor attributor = (MultiStatePowerAttributor) mPowerAttributor; mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_CPU, Flags.streamlinedBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_CPU, Flags.streamlinedBatteryStats()); mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_SCREEN, Flags.streamlinedMiscBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_SCREEN, Flags.streamlinedMiscBatteryStats()); mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, Flags.streamlinedMiscBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, Flags.streamlinedMiscBatteryStats()); mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, Flags.streamlinedConnectivityBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO, Flags.streamlinedConnectivityBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_PHONE, Flags.streamlinedConnectivityBatteryStats()); mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_WIFI, Flags.streamlinedConnectivityBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_WIFI, Flags.streamlinedConnectivityBatteryStats()); mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_BLUETOOTH, Flags.streamlinedConnectivityBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_BLUETOOTH, Flags.streamlinedConnectivityBatteryStats()); mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_AUDIO, Flags.streamlinedMiscBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_AUDIO, Flags.streamlinedMiscBatteryStats()); mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_VIDEO, Flags.streamlinedMiscBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_VIDEO, Flags.streamlinedMiscBatteryStats()); mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, Flags.streamlinedMiscBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, Flags.streamlinedMiscBatteryStats()); mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_GNSS, Flags.streamlinedMiscBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_GNSS, Flags.streamlinedMiscBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_SENSORS, Flags.streamlinedMiscBatteryStats()); mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_CAMERA, Flags.streamlinedMiscBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_CAMERA, Flags.streamlinedMiscBatteryStats()); // By convention POWER_COMPONENT_ANY represents custom Energy Consumers mStats.setPowerStatsCollectorEnabled(BatteryConsumer.POWER_COMPONENT_ANY, Flags.streamlinedMiscBatteryStats()); - mBatteryUsageStatsProvider.setPowerStatsExporterEnabled( + attributor.setPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_ANY, Flags.streamlinedMiscBatteryStats()); 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 385561d8c1a8..47ae9d0ff37c 100644 --- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java +++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java @@ -23,8 +23,6 @@ import static android.os.BatteryStats.Uid.NUM_WIFI_BATCHED_SCAN_BINS; import static android.os.BatteryStatsManager.NUM_WIFI_STATES; import static android.os.BatteryStatsManager.NUM_WIFI_SUPPL_STATES; -import static com.android.server.power.stats.MobileRadioPowerStatsCollector.mapRadioAccessNetworkTypeToRadioAccessTechnology; - import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -149,6 +147,7 @@ import com.android.modules.utils.TypedXmlSerializer; import com.android.server.LocalServices; import com.android.server.power.optimization.Flags; import com.android.server.power.stats.SystemServerCpuThreadReader.SystemServiceCpuThreadTimes; +import com.android.server.power.stats.format.MobileRadioPowerStatsLayout; import libcore.util.EmptyArray; @@ -13191,7 +13190,8 @@ public class BatteryStatsImpl extends BatteryStats { final int freq = deltaInfo.getSpecificInfoFrequencyRange(index); // Map RadioAccessNetworkType to course grain RadioAccessTechnology. - final int ratBucket = mapRadioAccessNetworkTypeToRadioAccessTechnology(rat); + final int ratBucket = MobileRadioPowerStatsLayout + .mapRadioAccessNetworkTypeToRadioAccessTechnology(rat); final RadioAccessTechnologyBatteryStats ratStats = getRatBatteryStatsLocked( ratBucket); 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 d51cfeab2da9..87a3e5e14e0d 100644 --- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java +++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java @@ -16,6 +16,7 @@ package com.android.server.power.stats; +import android.annotation.NonNull; import android.content.Context; import android.hardware.SensorManager; import android.os.BatteryConsumer; @@ -27,7 +28,6 @@ import android.os.UidBatteryConsumer; import android.util.Log; import android.util.Slog; import android.util.SparseArray; -import android.util.SparseBooleanArray; import com.android.internal.os.Clock; import com.android.internal.os.CpuScalingPolicies; @@ -44,8 +44,7 @@ import java.util.List; public class BatteryUsageStatsProvider { private static final String TAG = "BatteryUsageStatsProv"; private final Context mContext; - private final SparseBooleanArray mPowerStatsExporterEnabled = new SparseBooleanArray(); - private final PowerStatsExporter mPowerStatsExporter; + private final PowerAttributor mPowerAttributor; private final PowerStatsStore mPowerStatsStore; private final PowerProfile mPowerProfile; private final CpuScalingPolicies mCpuScalingPolicies; @@ -53,16 +52,18 @@ public class BatteryUsageStatsProvider { private final Object mLock = new Object(); private List<PowerCalculator> mPowerCalculators; - public BatteryUsageStatsProvider(Context context, - PowerStatsExporter powerStatsExporter, - PowerProfile powerProfile, CpuScalingPolicies cpuScalingPolicies, - PowerStatsStore powerStatsStore, Clock clock) { + public BatteryUsageStatsProvider(@NonNull Context context, + @NonNull PowerAttributor powerAttributor, + @NonNull PowerProfile powerProfile, @NonNull CpuScalingPolicies cpuScalingPolicies, + @NonNull PowerStatsStore powerStatsStore, @NonNull Clock clock) { mContext = context; - mPowerStatsExporter = powerStatsExporter; + mPowerAttributor = powerAttributor; mPowerStatsStore = powerStatsStore; mPowerProfile = powerProfile; mCpuScalingPolicies = cpuScalingPolicies; mClock = clock; + + mPowerStatsStore.addSectionReader(new BatteryUsageStatsSection.Reader()); } private List<PowerCalculator> getPowerCalculators() { @@ -72,55 +73,67 @@ public class BatteryUsageStatsProvider { // Power calculators are applied in the order of registration mPowerCalculators.add(new BatteryChargeCalculator()); - if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_CPU)) { + if (!mPowerAttributor.isPowerComponentSupported( + BatteryConsumer.POWER_COMPONENT_CPU)) { mPowerCalculators.add( new CpuPowerCalculator(mCpuScalingPolicies, mPowerProfile)); } mPowerCalculators.add(new MemoryPowerCalculator(mPowerProfile)); mPowerCalculators.add(new WakelockPowerCalculator(mPowerProfile)); if (!BatteryStats.checkWifiOnly(mContext)) { - if (!mPowerStatsExporterEnabled.get( + if (!mPowerAttributor.isPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)) { mPowerCalculators.add(new MobileRadioPowerCalculator(mPowerProfile)); } - if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_PHONE)) { + if (!mPowerAttributor.isPowerComponentSupported( + BatteryConsumer.POWER_COMPONENT_PHONE)) { mPowerCalculators.add(new PhonePowerCalculator(mPowerProfile)); } } - if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_WIFI)) { + if (!mPowerAttributor.isPowerComponentSupported( + BatteryConsumer.POWER_COMPONENT_WIFI)) { mPowerCalculators.add(new WifiPowerCalculator(mPowerProfile)); } - if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_BLUETOOTH)) { + if (!mPowerAttributor.isPowerComponentSupported( + BatteryConsumer.POWER_COMPONENT_BLUETOOTH)) { mPowerCalculators.add(new BluetoothPowerCalculator(mPowerProfile)); } - if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_SENSORS)) { + if (!mPowerAttributor.isPowerComponentSupported( + BatteryConsumer.POWER_COMPONENT_SENSORS)) { mPowerCalculators.add(new SensorPowerCalculator( mContext.getSystemService(SensorManager.class))); } - if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_GNSS)) { + if (!mPowerAttributor.isPowerComponentSupported( + BatteryConsumer.POWER_COMPONENT_GNSS)) { mPowerCalculators.add(new GnssPowerCalculator(mPowerProfile)); } - if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_CAMERA)) { + if (!mPowerAttributor.isPowerComponentSupported( + BatteryConsumer.POWER_COMPONENT_CAMERA)) { mPowerCalculators.add(new CameraPowerCalculator(mPowerProfile)); } - if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) { + if (!mPowerAttributor.isPowerComponentSupported( + BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) { mPowerCalculators.add(new FlashlightPowerCalculator(mPowerProfile)); } - if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_AUDIO)) { + if (!mPowerAttributor.isPowerComponentSupported( + BatteryConsumer.POWER_COMPONENT_AUDIO)) { mPowerCalculators.add(new AudioPowerCalculator(mPowerProfile)); } - if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_VIDEO)) { + if (!mPowerAttributor.isPowerComponentSupported( + BatteryConsumer.POWER_COMPONENT_VIDEO)) { mPowerCalculators.add(new VideoPowerCalculator(mPowerProfile)); } - if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_SCREEN)) { + if (!mPowerAttributor.isPowerComponentSupported( + BatteryConsumer.POWER_COMPONENT_SCREEN)) { mPowerCalculators.add(new ScreenPowerCalculator(mPowerProfile)); } - if (!mPowerStatsExporterEnabled.get( + if (!mPowerAttributor.isPowerComponentSupported( BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY)) { mPowerCalculators.add(new AmbientDisplayPowerCalculator(mPowerProfile)); } mPowerCalculators.add(new IdlePowerCalculator(mPowerProfile)); - if (!mPowerStatsExporterEnabled.get(BatteryConsumer.POWER_COMPONENT_ANY)) { + if (!mPowerAttributor.isPowerComponentSupported( + BatteryConsumer.POWER_COMPONENT_ANY)) { mPowerCalculators.add(new CustomEnergyConsumerPowerCalculator(mPowerProfile)); } mPowerCalculators.add(new UserPowerCalculator()); @@ -196,7 +209,7 @@ public class BatteryUsageStatsProvider { final boolean includeProcessStateData = ((query.getFlags() & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_PROCESS_STATE_DATA) != 0) && stats.isProcessStateDataAvailable(); - final boolean includeVirtualUids = ((query.getFlags() + final boolean includeVirtualUids = ((query.getFlags() & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS) != 0); final double minConsumedPowerThreshold = query.getMinConsumedPowerThreshold(); @@ -258,10 +271,8 @@ public class BatteryUsageStatsProvider { } } - if (mPowerStatsExporterEnabled.indexOfValue(true) >= 0) { - mPowerStatsExporter.exportAggregatedPowerStats(batteryUsageStatsBuilder, - monotonicStartTime, monotonicEndTime); - } + mPowerAttributor.estimatePowerConsumption(batteryUsageStatsBuilder, stats.getHistory(), + monotonicStartTime, monotonicEndTime); BatteryUsageStats batteryUsageStats = batteryUsageStatsBuilder.build(); if (includeProcessStateData) { @@ -272,6 +283,7 @@ public class BatteryUsageStatsProvider { // STOPSHIP(b/229906525): remove verification before shipping private static boolean sErrorReported; + private void verify(BatteryUsageStats stats) { if (sErrorReported) { return; @@ -390,7 +402,7 @@ public class BatteryUsageStatsProvider { // while the "to" timestamp is *inclusive*. boolean isInRange = (query.getFromTimestamp() == 0 || minTime > query.getFromTimestamp()) - && (query.getToTimestamp() == 0 || maxTime <= query.getToTimestamp()); + && (query.getToTimestamp() == 0 || maxTime <= query.getToTimestamp()); if (!isInRange) { continue; } @@ -422,12 +434,4 @@ public class BatteryUsageStatsProvider { } return builder.build(); } - - /** - * Specify whether PowerStats based attribution is supported for the specified component. - */ - public void setPowerStatsExporterEnabled(int powerComponentId, boolean enabled) { - mPowerStatsExporterEnabled.put(powerComponentId, enabled); - mPowerStatsExporter.setPowerComponentEnabled(powerComponentId, enabled); - } } diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsSection.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsSection.java index b95faac7c111..af3652475376 100644 --- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsSection.java +++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsSection.java @@ -19,8 +19,11 @@ package com.android.server.power.stats; import android.os.BatteryUsageStats; import android.util.IndentingPrintWriter; +import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; +import org.xmlpull.v1.XmlPullParserException; + import java.io.IOException; class BatteryUsageStatsSection extends PowerStatsSpan.Section { @@ -38,7 +41,7 @@ class BatteryUsageStatsSection extends PowerStatsSpan.Section { } @Override - void write(TypedXmlSerializer serializer) throws IOException { + public void write(TypedXmlSerializer serializer) throws IOException { mBatteryUsageStats.writeXml(serializer); } @@ -46,4 +49,17 @@ class BatteryUsageStatsSection extends PowerStatsSpan.Section { public void dump(IndentingPrintWriter ipw) { mBatteryUsageStats.dump(ipw, ""); } + + static class Reader implements PowerStatsSpan.SectionReader { + @Override + public String getType() { + return TYPE; + } + + @Override + public PowerStatsSpan.Section read(String sectionType, TypedXmlPullParser parser) + throws IOException, XmlPullParserException { + return new BatteryUsageStatsSection(BatteryUsageStats.createFromXml(parser)); + } + } } diff --git a/services/core/java/com/android/server/power/stats/BluetoothPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/BluetoothPowerStatsCollector.java index 8a5085b0b34b..622cc1630e69 100644 --- a/services/core/java/com/android/server/power/stats/BluetoothPowerStatsCollector.java +++ b/services/core/java/com/android/server/power/stats/BluetoothPowerStatsCollector.java @@ -28,6 +28,7 @@ import android.util.SparseArray; import com.android.internal.os.Clock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.BluetoothPowerStatsLayout; import java.util.Arrays; import java.util.List; @@ -43,7 +44,7 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { private static final long ENERGY_UNSPECIFIED = -1; - interface BluetoothStatsRetriever { + public interface BluetoothStatsRetriever { interface Callback { void onBluetoothScanTime(int uid, long scanTimeMs); } @@ -54,7 +55,7 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { BluetoothAdapter.OnBluetoothActivityEnergyInfoCallback callback); } - interface Injector { + public interface Injector { Handler getHandler(); Clock getClock(); PowerStatsUidResolver getUidResolver(); @@ -67,7 +68,7 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { private final Injector mInjector; - private BluetoothPowerStatsLayout mLayout; + private com.android.server.power.stats.format.BluetoothPowerStatsLayout mLayout; private boolean mIsInitialized; private PowerStats mPowerStats; private long[] mDeviceStats; @@ -93,7 +94,7 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { private final SparseArray<UidStats> mUidStats = new SparseArray<>(); - BluetoothPowerStatsCollector(Injector injector) { + public BluetoothPowerStatsCollector(Injector injector) { super(injector.getHandler(), injector.getPowerStatsCollectionThrottlePeriod( BatteryConsumer.powerComponentIdToString( BatteryConsumer.POWER_COMPONENT_BLUETOOTH)), @@ -130,13 +131,7 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { mLastConsumedEnergyUws = new long[mEnergyConsumerIds.length]; Arrays.fill(mLastConsumedEnergyUws, ENERGY_UNSPECIFIED); - mLayout = new BluetoothPowerStatsLayout(); - mLayout.addDeviceBluetoothControllerActivity(); - mLayout.addDeviceSectionEnergyConsumers(mEnergyConsumerIds.length); - mLayout.addDeviceSectionUsageDuration(); - mLayout.addDeviceSectionPowerEstimate(); - mLayout.addUidTrafficStats(); - mLayout.addUidSectionPowerEstimate(); + mLayout = new BluetoothPowerStatsLayout(mEnergyConsumerIds.length); PersistableBundle extras = new PersistableBundle(); mLayout.toExtras(extras); @@ -152,7 +147,7 @@ public class BluetoothPowerStatsCollector extends PowerStatsCollector { } @Override - protected PowerStats collectStats() { + public PowerStats collectStats() { if (!ensureInitialized()) { return null; } diff --git a/services/core/java/com/android/server/power/stats/CameraPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/CameraPowerStatsCollector.java index 8705bd53a3b7..7ded031354ac 100644 --- a/services/core/java/com/android/server/power/stats/CameraPowerStatsCollector.java +++ b/services/core/java/com/android/server/power/stats/CameraPowerStatsCollector.java @@ -19,9 +19,11 @@ package com.android.server.power.stats; import android.hardware.power.stats.EnergyConsumerType; import android.os.BatteryConsumer; +import com.android.server.power.stats.format.BinaryStatePowerStatsLayout; + public class CameraPowerStatsCollector extends EnergyConsumerPowerStatsCollector { - CameraPowerStatsCollector(Injector injector) { + public CameraPowerStatsCollector(Injector injector) { super(injector, BatteryConsumer.POWER_COMPONENT_CAMERA, BatteryConsumer.powerComponentIdToString(BatteryConsumer.POWER_COMPONENT_CAMERA), EnergyConsumerType.CAMERA, /* energy consumer name */ null, diff --git a/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java index b5ef67b44e75..7b006f0af84a 100644 --- a/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java +++ b/services/core/java/com/android/server/power/stats/CpuPowerStatsCollector.java @@ -31,6 +31,7 @@ import com.android.internal.os.Clock; import com.android.internal.os.CpuScalingPolicies; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.CpuPowerStatsLayout; import java.io.PrintWriter; import java.util.Arrays; @@ -132,14 +133,8 @@ public class CpuPowerStatsCollector extends PowerStatsCollector { mTempCpuTimeByScalingStep = new long[cpuScalingStepCount]; int[] scalingStepToPowerBracketMap = initPowerBrackets(); - mLayout = new CpuPowerStatsLayout(); - mLayout.addDeviceSectionCpuTimeByScalingStep(cpuScalingStepCount); - mLayout.addDeviceSectionCpuTimeByCluster(mCpuScalingPolicies.getPolicies().length); - mLayout.addDeviceSectionUsageDuration(); - mLayout.addDeviceSectionEnergyConsumers(mCpuEnergyConsumerIds.length); - mLayout.addDeviceSectionPowerEstimate(); - mLayout.addUidSectionCpuTimeByPowerBracket(scalingStepToPowerBracketMap); - mLayout.addUidSectionPowerEstimate(); + mLayout = new CpuPowerStatsLayout(mCpuEnergyConsumerIds.length, + mCpuScalingPolicies.getPolicies().length, scalingStepToPowerBracketMap); PersistableBundle extras = new PersistableBundle(); mLayout.toExtras(extras); diff --git a/services/core/java/com/android/server/power/stats/CustomEnergyConsumerPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/CustomEnergyConsumerPowerStatsCollector.java index 4bfe4426800c..7d7eb29971c9 100644 --- a/services/core/java/com/android/server/power/stats/CustomEnergyConsumerPowerStatsCollector.java +++ b/services/core/java/com/android/server/power/stats/CustomEnergyConsumerPowerStatsCollector.java @@ -19,6 +19,8 @@ package com.android.server.power.stats; import android.hardware.power.stats.EnergyConsumerType; import android.os.BatteryConsumer; +import com.android.server.power.stats.format.EnergyConsumerPowerStatsLayout; + import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; @@ -29,7 +31,8 @@ public class CustomEnergyConsumerPowerStatsCollector extends PowerStatsCollector private final EnergyConsumerPowerStatsCollector.Injector mInjector; private List<EnergyConsumerPowerStatsCollector> mCollectors; - CustomEnergyConsumerPowerStatsCollector(EnergyConsumerPowerStatsCollector.Injector injector) { + public CustomEnergyConsumerPowerStatsCollector( + EnergyConsumerPowerStatsCollector.Injector injector) { super(injector.getHandler(), 0, injector.getUidResolver(), injector.getClock()); mInjector = injector; } diff --git a/services/core/java/com/android/server/power/stats/EnergyConsumerPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/EnergyConsumerPowerStatsCollector.java index 79fbe8ef7070..c5229b90cff2 100644 --- a/services/core/java/com/android/server/power/stats/EnergyConsumerPowerStatsCollector.java +++ b/services/core/java/com/android/server/power/stats/EnergyConsumerPowerStatsCollector.java @@ -26,6 +26,7 @@ import android.util.SparseLongArray; import com.android.internal.os.Clock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.EnergyConsumerPowerStatsLayout; import java.util.function.IntSupplier; @@ -34,7 +35,7 @@ public class EnergyConsumerPowerStatsCollector extends PowerStatsCollector { private static final long ENERGY_UNSPECIFIED = -1; - interface Injector { + public interface Injector { Handler getHandler(); Clock getClock(); PowerStatsUidResolver getUidResolver(); diff --git a/services/core/java/com/android/server/power/stats/GnssPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/GnssPowerStatsCollector.java index 168a8749b34c..ad5fe0b0064f 100644 --- a/services/core/java/com/android/server/power/stats/GnssPowerStatsCollector.java +++ b/services/core/java/com/android/server/power/stats/GnssPowerStatsCollector.java @@ -19,9 +19,11 @@ package com.android.server.power.stats; import android.hardware.power.stats.EnergyConsumerType; import android.os.BatteryConsumer; +import com.android.server.power.stats.format.GnssPowerStatsLayout; + public class GnssPowerStatsCollector extends EnergyConsumerPowerStatsCollector { - GnssPowerStatsCollector(Injector injector) { + public GnssPowerStatsCollector(Injector injector) { super(injector, BatteryConsumer.POWER_COMPONENT_GNSS, BatteryConsumer.powerComponentIdToString(BatteryConsumer.POWER_COMPONENT_GNSS), EnergyConsumerType.GNSS, /* energy consumer name */ null, diff --git a/services/core/java/com/android/server/power/stats/MobileRadioPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/MobileRadioPowerStatsCollector.java index c88e1b0c0d1f..506c072dd0ed 100644 --- a/services/core/java/com/android/server/power/stats/MobileRadioPowerStatsCollector.java +++ b/services/core/java/com/android/server/power/stats/MobileRadioPowerStatsCollector.java @@ -35,6 +35,7 @@ import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.Clock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.MobileRadioPowerStatsLayout; import java.util.Arrays; import java.util.List; @@ -77,7 +78,7 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector { long elapsedRealtimeMs, long uptimeMs); } - interface Injector { + public interface Injector { Handler getHandler(); Clock getClock(); PowerStatsUidResolver getUidResolver(); @@ -114,7 +115,7 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector { private long mLastCallDuration; private long mLastScanDuration; - MobileRadioPowerStatsCollector(Injector injector, Observer observer) { + public MobileRadioPowerStatsCollector(Injector injector, Observer observer) { super(injector.getHandler(), injector.getPowerStatsCollectionThrottlePeriod( BatteryConsumer.powerComponentIdToString( BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)), @@ -157,21 +158,14 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector { mLastConsumedEnergyUws = new long[mEnergyConsumerIds.length]; Arrays.fill(mLastConsumedEnergyUws, ENERGY_UNSPECIFIED); - mLayout = new MobileRadioPowerStatsLayout(); - mLayout.addDeviceMobileActivity(); - mLayout.addDeviceSectionEnergyConsumers(mEnergyConsumerIds.length); - mLayout.addStateStats(); - mLayout.addUidNetworkStats(); - mLayout.addDeviceSectionUsageDuration(); - mLayout.addDeviceSectionPowerEstimate(); - mLayout.addUidSectionPowerEstimate(); + mLayout = new MobileRadioPowerStatsLayout(mEnergyConsumerIds.length); SparseArray<String> stateLabels = new SparseArray<>(); for (int rat = 0; rat < BatteryStats.RADIO_ACCESS_TECHNOLOGY_COUNT; rat++) { final int freqCount = rat == BatteryStats.RADIO_ACCESS_TECHNOLOGY_NR ? ServiceState.FREQUENCY_RANGE_COUNT : 1; for (int freq = 0; freq < freqCount; freq++) { - int stateKey = makeStateKey(rat, freq); + int stateKey = MobileRadioPowerStatsLayout.makeStateKey(rat, freq); StringBuilder sb = new StringBuilder(); if (rat != BatteryStats.RADIO_ACCESS_TECHNOLOGY_OTHER) { sb.append(BatteryStats.RADIO_ACCESS_TECHNOLOGY_NAMES[rat]); @@ -200,7 +194,7 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector { } @Override - protected PowerStats collectStats() { + public PowerStats collectStats() { if (!ensureInitialized()) { return null; } @@ -374,37 +368,8 @@ public class MobileRadioPowerStatsCollector extends PowerStatsCollector { } } - static int makeStateKey(int rat, int freqRange) { - if (rat == BatteryStats.RADIO_ACCESS_TECHNOLOGY_NR) { - return rat | (freqRange << 8); - } else { - return rat; - } - } - private void setTimestamp(long timestamp) { mPowerStats.durationMs = Math.max(timestamp - mLastUpdateTimestampMillis, 0); mLastUpdateTimestampMillis = timestamp; } - - @BatteryStats.RadioAccessTechnology - static int mapRadioAccessNetworkTypeToRadioAccessTechnology( - @AccessNetworkConstants.RadioAccessNetworkType int networkType) { - switch (networkType) { - case AccessNetworkConstants.AccessNetworkType.NGRAN: - return BatteryStats.RADIO_ACCESS_TECHNOLOGY_NR; - case AccessNetworkConstants.AccessNetworkType.EUTRAN: - return BatteryStats.RADIO_ACCESS_TECHNOLOGY_LTE; - case AccessNetworkConstants.AccessNetworkType.UNKNOWN: //fallthrough - case AccessNetworkConstants.AccessNetworkType.GERAN: //fallthrough - case AccessNetworkConstants.AccessNetworkType.UTRAN: //fallthrough - case AccessNetworkConstants.AccessNetworkType.CDMA2000: //fallthrough - case AccessNetworkConstants.AccessNetworkType.IWLAN: - return BatteryStats.RADIO_ACCESS_TECHNOLOGY_OTHER; - default: - Slog.w(TAG, - "Unhandled RadioAccessNetworkType (" + networkType + "), mapping to OTHER"); - return BatteryStats.RADIO_ACCESS_TECHNOLOGY_OTHER; - } - } } diff --git a/services/core/java/com/android/server/power/stats/PowerAttributor.java b/services/core/java/com/android/server/power/stats/PowerAttributor.java new file mode 100644 index 000000000000..d1f8564070ba --- /dev/null +++ b/services/core/java/com/android/server/power/stats/PowerAttributor.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.power.stats; + +import android.os.BatteryConsumer; +import android.os.BatteryUsageStats; +import android.util.IndentingPrintWriter; + +import com.android.internal.os.BatteryStatsHistory; + +public interface PowerAttributor { + + /** + * Returns true if the specified power component can be handled by this PowerAttributor + */ + boolean isPowerComponentSupported(@BatteryConsumer.PowerComponentId int powerComponentId); + + /** + * Performs the power attribution calculations and returns the results by populating the + * supplied BatteryUsageStats.Builder + */ + void estimatePowerConsumption(BatteryUsageStats.Builder batteryUsageStatsBuilder, + BatteryStatsHistory batteryHistory, long monotonicStartTime, long monotonicEndTime); + + /** + * Computes estimated power consumption attribution for the specified time range and stores + * it in PowerStatsStore for potential accumulation. + * + * Returns the monotonic timestamp of the last processed history item. + */ + long storeEstimatedPowerConsumption(BatteryStatsHistory batteryStatsHistory, long startTime, + long endTimeMs); + + /** + * Returns the monotonic timestamp of the last processed history item, stored in + * PowerStatsStore. + */ + long getLastSavedEstimatesPowerConsumptionTimestamp(); + + /** + * Performs the power attribution calculation and prints the results. + */ + void dumpEstimatedPowerConsumption(IndentingPrintWriter ipw, + BatteryStatsHistory batteryStatsHistory, long startTime, long endTime); +} diff --git a/services/core/java/com/android/server/power/stats/PowerStatsCollector.java b/services/core/java/com/android/server/power/stats/PowerStatsCollector.java index f5b00054bea4..7f220320edc5 100644 --- a/services/core/java/com/android/server/power/stats/PowerStatsCollector.java +++ b/services/core/java/com/android/server/power/stats/PowerStatsCollector.java @@ -235,7 +235,7 @@ public abstract class PowerStatsCollector { return (deltaEnergyUj * MILLIVOLTS_PER_VOLT + (avgVoltageMv / 2)) / avgVoltageMv; } - interface ConsumedEnergyRetriever { + public interface ConsumedEnergyRetriever { @NonNull int[] getEnergyConsumerIds(@EnergyConsumerType int energyConsumerType, String name); diff --git a/services/core/java/com/android/server/power/stats/PowerStatsScheduler.java b/services/core/java/com/android/server/power/stats/PowerStatsScheduler.java index abe4c0ca7bc9..38ca0878d220 100644 --- a/services/core/java/com/android/server/power/stats/PowerStatsScheduler.java +++ b/services/core/java/com/android/server/power/stats/PowerStatsScheduler.java @@ -23,6 +23,7 @@ import android.os.Handler; import android.util.IndentingPrintWriter; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.os.BatteryStatsHistory; import com.android.internal.os.Clock; import com.android.internal.os.MonotonicClock; @@ -51,7 +52,8 @@ public class PowerStatsScheduler { private final Handler mHandler; private final Runnable mPowerStatsCollector; private final Supplier<Long> mEarliestAvailableBatteryHistoryTimeMs; - private final PowerStatsAggregator mPowerStatsAggregator; + private final BatteryStatsHistory mBatteryStatsHistory; + private final PowerAttributor mPowerAttributor; private long mLastSavedSpanEndMonotonicTime; /** @@ -66,12 +68,13 @@ public class PowerStatsScheduler { } public PowerStatsScheduler(Runnable powerStatsCollector, - PowerStatsAggregator powerStatsAggregator, + BatteryStatsHistory batteryStatsHistory, PowerAttributor powerAttributor, @DurationMillisLong long aggregatedPowerStatsSpanDuration, @DurationMillisLong long powerStatsAggregationPeriod, PowerStatsStore powerStatsStore, AlarmScheduler alarmScheduler, Clock clock, MonotonicClock monotonicClock, Supplier<Long> earliestAvailableBatteryHistoryTimeMs, Handler handler) { - mPowerStatsAggregator = powerStatsAggregator; + mBatteryStatsHistory = batteryStatsHistory; + mPowerAttributor = powerAttributor; mAggregatedPowerStatsSpanDuration = aggregatedPowerStatsSpanDuration; mPowerStatsAggregationPeriod = powerStatsAggregationPeriod; mPowerStatsStore = powerStatsStore; @@ -123,12 +126,8 @@ public class PowerStatsScheduler { long endTimeMs = alignToWallClock(startTime + mAggregatedPowerStatsSpanDuration, mAggregatedPowerStatsSpanDuration, currentMonotonicTime, currentTimeMillis); while (endTimeMs <= currentMonotonicTime) { - mPowerStatsAggregator.aggregatePowerStats(startTime, endTimeMs, - stats -> { - storeAggregatedPowerStats(stats); - mLastSavedSpanEndMonotonicTime = stats.getStartTime() + stats.getDuration(); - }); - + mLastSavedSpanEndMonotonicTime = mPowerAttributor.storeEstimatedPowerConsumption( + mBatteryStatsHistory, startTime, endTimeMs); startTime = endTimeMs; endTimeMs += mAggregatedPowerStatsSpanDuration; } @@ -153,15 +152,8 @@ public class PowerStatsScheduler { mPowerStatsStore.dump(ipw); // Aggregate the remainder of power stats and dump the results without storing them yet. long powerStoreEndMonotonicTime = getLastSavedSpanEndMonotonicTime(); - mPowerStatsAggregator.aggregatePowerStats(powerStoreEndMonotonicTime, - MonotonicClock.UNDEFINED, - stats -> { - // Create a PowerStatsSpan for consistency of the textual output - PowerStatsSpan span = PowerStatsStore.createPowerStatsSpan(stats); - if (span != null) { - span.dump(ipw); - } - }); + mPowerAttributor.dumpEstimatedPowerConsumption(ipw, mBatteryStatsHistory, + powerStoreEndMonotonicTime, MonotonicClock.UNDEFINED); }); awaitCompletion(); @@ -223,28 +215,13 @@ public class PowerStatsScheduler { } private long getLastSavedSpanEndMonotonicTime() { - if (mLastSavedSpanEndMonotonicTime != 0) { - return mLastSavedSpanEndMonotonicTime; - } - - mLastSavedSpanEndMonotonicTime = -1; - for (PowerStatsSpan.Metadata metadata : mPowerStatsStore.getTableOfContents()) { - if (metadata.getSections().contains(AggregatedPowerStatsSection.TYPE)) { - for (PowerStatsSpan.TimeFrame timeFrame : metadata.getTimeFrames()) { - long endMonotonicTime = timeFrame.startMonotonicTime + timeFrame.duration; - if (endMonotonicTime > mLastSavedSpanEndMonotonicTime) { - mLastSavedSpanEndMonotonicTime = endMonotonicTime; - } - } - } + if (mLastSavedSpanEndMonotonicTime == 0) { + mLastSavedSpanEndMonotonicTime = + mPowerAttributor.getLastSavedEstimatesPowerConsumptionTimestamp(); } return mLastSavedSpanEndMonotonicTime; } - private void storeAggregatedPowerStats(AggregatedPowerStats stats) { - mPowerStatsStore.storeAggregatedPowerStats(stats); - } - private void awaitCompletion() { ConditionVariable done = new ConditionVariable(); mHandler.post(done::open); diff --git a/services/core/java/com/android/server/power/stats/PowerStatsSpan.java b/services/core/java/com/android/server/power/stats/PowerStatsSpan.java index 4df919dffbe5..fc0611f7fcff 100644 --- a/services/core/java/com/android/server/power/stats/PowerStatsSpan.java +++ b/services/core/java/com/android/server/power/stats/PowerStatsSpan.java @@ -44,6 +44,7 @@ import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.Map; import java.util.Set; /** @@ -72,7 +73,7 @@ public class PowerStatsSpan { private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("MM-dd HH:mm:ss.SSS").withZone(ZoneId.systemDefault()); - static class TimeFrame { + public static class TimeFrame { public final long startMonotonicTime; @CurrentTimeMillisLong public final long startTime; @@ -119,7 +120,7 @@ public class PowerStatsSpan { } } - static class Metadata { + public static class Metadata { static final Comparator<Metadata> COMPARATOR = Comparator.comparing(Metadata::getId); private final long mId; @@ -262,7 +263,7 @@ public class PowerStatsSpan { public abstract static class Section { private final String mType; - Section(String type) { + protected Section(String type) { mType = type; } @@ -274,7 +275,10 @@ public class PowerStatsSpan { return mType; } - abstract void write(TypedXmlSerializer serializer) throws IOException; + /** + * Adds the contents of this section to the XML doc. + */ + public abstract void write(TypedXmlSerializer serializer) throws IOException; /** * Prints the section type. @@ -290,6 +294,11 @@ public class PowerStatsSpan { */ public interface SectionReader { /** + * Returns the unique type of content handled by this reader. + */ + String getType(); + + /** * Reads the contents of the section using the parser. The type of the object * read and the corresponding XML format are determined by the section type. */ @@ -316,12 +325,18 @@ public class PowerStatsSpan { return mMetadata.mId; } - void addTimeFrame(long monotonicTime, @CurrentTimeMillisLong long wallClockTime, + /** + * Adds a time frame covered by this PowerStats span + */ + public void addTimeFrame(long monotonicTime, @CurrentTimeMillisLong long wallClockTime, @DurationMillisLong long duration) { mMetadata.mTimeFrames.add(new TimeFrame(monotonicTime, wallClockTime, duration)); } - void addSection(Section section) { + /** + * Adds the supplied section to the span. + */ + public void addSection(Section section) { mMetadata.addSection(section.getType()); mSections.add(section); } @@ -354,7 +369,7 @@ public class PowerStatsSpan { @Nullable static PowerStatsSpan read(InputStream in, TypedXmlPullParser parser, - SectionReader sectionReader, String... sectionTypes) + Map<String, SectionReader> sectionReaders, String... sectionTypes) throws IOException, XmlPullParserException { Set<String> neededSections = Sets.newArraySet(sectionTypes); boolean selectSections = !neededSections.isEmpty(); @@ -386,7 +401,11 @@ public class PowerStatsSpan { if (tag.equals(XML_TAG_SECTION)) { String sectionType = parser.getAttributeValue(null, XML_ATTR_SECTION_TYPE); if (!selectSections || neededSections.contains(sectionType)) { - Section section = sectionReader.read(sectionType, parser); + Section section = null; + SectionReader sectionReader = sectionReaders.get(sectionType); + if (sectionReader != null) { + section = sectionReader.read(sectionType, parser); + } if (section == null) { if (selectSections) { throw new XmlPullParserException( @@ -396,11 +415,11 @@ public class PowerStatsSpan { @Override public void dump(IndentingPrintWriter ipw) { ipw.println("Unsupported PowerStatsStore section type: " - + sectionType); + + sectionType); } @Override - void write(TypedXmlSerializer serializer) { + public void write(TypedXmlSerializer serializer) { } }; } diff --git a/services/core/java/com/android/server/power/stats/PowerStatsStore.java b/services/core/java/com/android/server/power/stats/PowerStatsStore.java index 7bcdc7129d10..a875c30c9ebc 100644 --- a/services/core/java/com/android/server/power/stats/PowerStatsStore.java +++ b/services/core/java/com/android/server/power/stats/PowerStatsStore.java @@ -42,6 +42,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -66,28 +67,31 @@ public class PowerStatsStore { private FileLock mJvmLock; private final long mMaxStorageBytes; private final Handler mHandler; - private final PowerStatsSpan.SectionReader mSectionReader; + private final Map<String, PowerStatsSpan.SectionReader> mSectionReaders = new HashMap<>(); private volatile List<PowerStatsSpan.Metadata> mTableOfContents; - public PowerStatsStore(@NonNull File systemDir, Handler handler, - AggregatedPowerStatsConfig aggregatedPowerStatsConfig) { - this(systemDir, MAX_POWER_STATS_SPAN_STORAGE_BYTES, handler, - new DefaultSectionReader(aggregatedPowerStatsConfig)); + public PowerStatsStore(@NonNull File systemDir, Handler handler) { + this(systemDir, MAX_POWER_STATS_SPAN_STORAGE_BYTES, handler); } @VisibleForTesting - public PowerStatsStore(@NonNull File systemDir, long maxStorageBytes, Handler handler, - @NonNull PowerStatsSpan.SectionReader sectionReader) { + public PowerStatsStore(@NonNull File systemDir, long maxStorageBytes, Handler handler) { mSystemDir = systemDir; mStoreDir = new File(systemDir, POWER_STATS_DIR); mLockFile = new File(mStoreDir, DIR_LOCK_FILENAME); mHandler = handler; mMaxStorageBytes = maxStorageBytes; - mSectionReader = sectionReader; mHandler.post(this::maybeClearLegacyStore); } /** + * Registers a Reader for a section type, which is determined by `sectionReader.getType()` + */ + public void addSectionReader(PowerStatsSpan.SectionReader sectionReader) { + mSectionReaders.put(sectionReader.getType(), sectionReader); + } + + /** * Returns the metadata for all {@link PowerStatsSpan}'s contained in the store. */ @NonNull @@ -169,7 +173,7 @@ public class PowerStatsStore { try { File file = makePowerStatsSpanFilename(id); try (InputStream inputStream = new BufferedInputStream(new FileInputStream(file))) { - return PowerStatsSpan.read(inputStream, parser, mSectionReader, sectionTypes); + return PowerStatsSpan.read(inputStream, parser, mSectionReaders, sectionTypes); } catch (IOException | XmlPullParserException e) { Slog.wtf(TAG, "Cannot read PowerStatsSpan file: " + file, e); } @@ -179,41 +183,6 @@ public class PowerStatsStore { return null; } - void storeAggregatedPowerStats(AggregatedPowerStats stats) { - PowerStatsSpan span = createPowerStatsSpan(stats); - if (span == null) { - return; - } - storePowerStatsSpan(span); - } - - static PowerStatsSpan createPowerStatsSpan(AggregatedPowerStats stats) { - List<AggregatedPowerStats.ClockUpdate> clockUpdates = stats.getClockUpdates(); - if (clockUpdates.isEmpty()) { - Slog.w(TAG, "No clock updates in aggregated power stats " + stats); - return null; - } - - long monotonicTime = clockUpdates.get(0).monotonicTime; - long durationSum = 0; - PowerStatsSpan span = new PowerStatsSpan(monotonicTime); - for (int i = 0; i < clockUpdates.size(); i++) { - AggregatedPowerStats.ClockUpdate clockUpdate = clockUpdates.get(i); - long duration; - if (i == clockUpdates.size() - 1) { - duration = stats.getDuration() - durationSum; - } else { - duration = clockUpdate.monotonicTime - monotonicTime; - } - span.addTimeFrame(clockUpdate.monotonicTime, clockUpdate.currentTime, duration); - monotonicTime = clockUpdate.monotonicTime; - durationSum += duration; - } - - span.addSection(new AggregatedPowerStatsSection(stats)); - return span; - } - /** * Stores a {@link PowerStatsSpan} containing a single section for the supplied * battery usage stats. @@ -344,28 +313,4 @@ public class PowerStatsStore { } ipw.decreaseIndent(); } - - private static class DefaultSectionReader implements PowerStatsSpan.SectionReader { - private final AggregatedPowerStatsConfig mAggregatedPowerStatsConfig; - - DefaultSectionReader(AggregatedPowerStatsConfig aggregatedPowerStatsConfig) { - mAggregatedPowerStatsConfig = aggregatedPowerStatsConfig; - } - - @Override - public PowerStatsSpan.Section read(String sectionType, TypedXmlPullParser parser) - throws IOException, XmlPullParserException { - switch (sectionType) { - case AggregatedPowerStatsSection.TYPE: - return new AggregatedPowerStatsSection( - AggregatedPowerStats.createFromXml(parser, - mAggregatedPowerStatsConfig)); - case BatteryUsageStatsSection.TYPE: - return new BatteryUsageStatsSection( - BatteryUsageStats.createFromXml(parser)); - default: - return null; - } - } - } } diff --git a/services/core/java/com/android/server/power/stats/ScreenPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/ScreenPowerStatsCollector.java index 291f28940424..4b5d89907f84 100644 --- a/services/core/java/com/android/server/power/stats/ScreenPowerStatsCollector.java +++ b/services/core/java/com/android/server/power/stats/ScreenPowerStatsCollector.java @@ -26,6 +26,7 @@ import android.util.SparseLongArray; import com.android.internal.os.Clock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.ScreenPowerStatsLayout; import java.util.Arrays; import java.util.function.IntSupplier; @@ -33,7 +34,7 @@ import java.util.function.IntSupplier; public class ScreenPowerStatsCollector extends PowerStatsCollector { private static final String TAG = "ScreenPowerStatsCollector"; - interface ScreenUsageTimeRetriever { + public interface ScreenUsageTimeRetriever { interface Callback { void onUidTopActivityTime(int uid, long topActivityTimeMs); } @@ -45,7 +46,7 @@ public class ScreenPowerStatsCollector extends PowerStatsCollector { long getScreenDozeTimeMs(int display); } - interface Injector { + public interface Injector { Handler getHandler(); Clock getClock(); PowerStatsUidResolver getUidResolver(); @@ -76,7 +77,7 @@ public class ScreenPowerStatsCollector extends PowerStatsCollector { private final SparseLongArray mLastTopActivityTime = new SparseLongArray(); private long mLastCollectionTime; - ScreenPowerStatsCollector(Injector injector) { + public ScreenPowerStatsCollector(Injector injector) { super(injector.getHandler(), injector.getPowerStatsCollectionThrottlePeriod( BatteryConsumer.powerComponentIdToString( @@ -103,13 +104,8 @@ public class ScreenPowerStatsCollector extends PowerStatsCollector { mLastConsumedEnergyUws = new long[mEnergyConsumerIds.length]; Arrays.fill(mLastConsumedEnergyUws, ENERGY_UNSPECIFIED); - mLayout = new ScreenPowerStatsLayout(); - mLayout.addDeviceScreenUsageDurationSection(mInjector.getDisplayCount()); - mLayout.addDeviceSectionEnergyConsumers(mEnergyConsumerIds.length); - mLayout.addDeviceSectionUsageDuration(); - mLayout.addDeviceSectionPowerEstimate(); - mLayout.addUidTopActivitiyDuration(); - mLayout.addUidSectionPowerEstimate(); + mLayout = new ScreenPowerStatsLayout(mEnergyConsumerIds.length, + mInjector.getDisplayCount()); PersistableBundle extras = new PersistableBundle(); mLayout.toExtras(extras); @@ -129,7 +125,7 @@ public class ScreenPowerStatsCollector extends PowerStatsCollector { } @Override - protected PowerStats collectStats() { + public PowerStats collectStats() { if (!ensureInitialized()) { return null; } diff --git a/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java b/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java index 90981ada7c31..45bf5739cddb 100644 --- a/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java +++ b/services/core/java/com/android/server/power/stats/WifiPowerStatsCollector.java @@ -28,6 +28,7 @@ import android.util.SparseArray; import com.android.internal.os.Clock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.WifiPowerStatsLayout; import java.util.Arrays; import java.util.List; @@ -49,7 +50,7 @@ public class WifiPowerStatsCollector extends PowerStatsCollector { long uptimeMs); } - interface WifiStatsRetriever { + public interface WifiStatsRetriever { interface Callback { void onWifiScanTime(int uid, long scanTimeMs, long batchScanTimeMs); } @@ -58,7 +59,7 @@ public class WifiPowerStatsCollector extends PowerStatsCollector { long getWifiActiveDuration(); } - interface Injector { + public interface Injector { Handler getHandler(); Clock getClock(); PowerStatsUidResolver getUidResolver(); @@ -99,7 +100,7 @@ public class WifiPowerStatsCollector extends PowerStatsCollector { private final SparseArray<WifiScanTimes> mLastScanTimes = new SparseArray<>(); private long mLastWifiActiveDuration; - WifiPowerStatsCollector(Injector injector, Observer observer) { + public WifiPowerStatsCollector(Injector injector, Observer observer) { super(injector.getHandler(), injector.getPowerStatsCollectionThrottlePeriod( BatteryConsumer.powerComponentIdToString( BatteryConsumer.POWER_COMPONENT_WIFI)), @@ -140,13 +141,7 @@ public class WifiPowerStatsCollector extends PowerStatsCollector { mLastConsumedEnergyUws = new long[mEnergyConsumerIds.length]; Arrays.fill(mLastConsumedEnergyUws, ENERGY_UNSPECIFIED); - mLayout = new WifiPowerStatsLayout(); - mLayout.addDeviceWifiActivity(mPowerReportingSupported); - mLayout.addDeviceSectionEnergyConsumers(mEnergyConsumerIds.length); - mLayout.addUidNetworkStats(); - mLayout.addDeviceSectionUsageDuration(); - mLayout.addDeviceSectionPowerEstimate(); - mLayout.addUidSectionPowerEstimate(); + mLayout = new WifiPowerStatsLayout(mEnergyConsumerIds.length, mPowerReportingSupported); PersistableBundle extras = new PersistableBundle(); mLayout.toExtras(extras); @@ -162,7 +157,7 @@ public class WifiPowerStatsCollector extends PowerStatsCollector { } @Override - protected PowerStats collectStats() { + public PowerStats collectStats() { if (!ensureInitialized()) { return null; } diff --git a/services/core/java/com/android/server/power/stats/BinaryStatePowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/AmbientDisplayPowerStatsLayout.java index 502337c789a2..1b99b0d2eb86 100644 --- a/services/core/java/com/android/server/power/stats/BinaryStatePowerStatsLayout.java +++ b/services/core/java/com/android/server/power/stats/format/AmbientDisplayPowerStatsLayout.java @@ -13,12 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package com.android.server.power.stats.format; -package com.android.server.power.stats; - -class BinaryStatePowerStatsLayout extends EnergyConsumerPowerStatsLayout { - BinaryStatePowerStatsLayout() { - addDeviceSectionUsageDuration(); - addUidSectionUsageDuration(); +public class AmbientDisplayPowerStatsLayout extends PowerStatsLayout { + public AmbientDisplayPowerStatsLayout() { + addDeviceSectionPowerEstimate(); } } diff --git a/services/core/java/com/android/server/power/stats/format/BinaryStatePowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/BinaryStatePowerStatsLayout.java new file mode 100644 index 000000000000..4a26d83175fa --- /dev/null +++ b/services/core/java/com/android/server/power/stats/format/BinaryStatePowerStatsLayout.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.power.stats.format; + +import com.android.internal.os.PowerStats; + +public class BinaryStatePowerStatsLayout extends EnergyConsumerPowerStatsLayout { + public BinaryStatePowerStatsLayout() { + addDeviceSectionUsageDuration(); + addUidSectionUsageDuration(); + } + + public BinaryStatePowerStatsLayout(PowerStats.Descriptor descriptor) { + super(descriptor); + } +} diff --git a/services/core/java/com/android/server/power/stats/BluetoothPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/BluetoothPowerStatsLayout.java index 9358b5ef20a8..534a9f701019 100644 --- a/services/core/java/com/android/server/power/stats/BluetoothPowerStatsLayout.java +++ b/services/core/java/com/android/server/power/stats/format/BluetoothPowerStatsLayout.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.format; import android.annotation.NonNull; import android.os.PersistableBundle; @@ -37,21 +37,49 @@ public class BluetoothPowerStatsLayout extends PowerStatsLayout { private int mUidTxBytesPosition; private int mUidScanTimePosition; - BluetoothPowerStatsLayout() { + public BluetoothPowerStatsLayout(int energyConsumerCount) { + addDeviceBluetoothControllerActivity(); + addDeviceSectionEnergyConsumers(energyConsumerCount); + addDeviceSectionUsageDuration(); + addDeviceSectionPowerEstimate(); + addUidTrafficStats(); + addUidSectionPowerEstimate(); } - BluetoothPowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) { + public BluetoothPowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) { super(descriptor); + PersistableBundle extras = descriptor.extras; + mDeviceRxTimePosition = extras.getInt(EXTRA_DEVICE_RX_TIME_POSITION); + mDeviceTxTimePosition = extras.getInt(EXTRA_DEVICE_TX_TIME_POSITION); + mDeviceIdleTimePosition = extras.getInt(EXTRA_DEVICE_IDLE_TIME_POSITION); + mDeviceScanTimePosition = extras.getInt(EXTRA_DEVICE_SCAN_TIME_POSITION); + mUidRxBytesPosition = extras.getInt(EXTRA_UID_RX_BYTES_POSITION); + mUidTxBytesPosition = extras.getInt(EXTRA_UID_TX_BYTES_POSITION); + mUidScanTimePosition = extras.getInt(EXTRA_UID_SCAN_TIME_POSITION); } - void addDeviceBluetoothControllerActivity() { + /** + * Copies the elements of the stats array layout into <code>extras</code> + */ + public void toExtras(PersistableBundle extras) { + super.toExtras(extras); + extras.putInt(EXTRA_DEVICE_RX_TIME_POSITION, mDeviceRxTimePosition); + extras.putInt(EXTRA_DEVICE_TX_TIME_POSITION, mDeviceTxTimePosition); + extras.putInt(EXTRA_DEVICE_IDLE_TIME_POSITION, mDeviceIdleTimePosition); + extras.putInt(EXTRA_DEVICE_SCAN_TIME_POSITION, mDeviceScanTimePosition); + extras.putInt(EXTRA_UID_RX_BYTES_POSITION, mUidRxBytesPosition); + extras.putInt(EXTRA_UID_TX_BYTES_POSITION, mUidTxBytesPosition); + extras.putInt(EXTRA_UID_SCAN_TIME_POSITION, mUidScanTimePosition); + } + + private void addDeviceBluetoothControllerActivity() { mDeviceRxTimePosition = addDeviceSection(1, "rx"); mDeviceTxTimePosition = addDeviceSection(1, "tx"); mDeviceIdleTimePosition = addDeviceSection(1, "idle"); mDeviceScanTimePosition = addDeviceSection(1, "scan", FLAG_OPTIONAL); } - void addUidTrafficStats() { + private void addUidTrafficStats() { mUidRxBytesPosition = addUidSection(1, "rx-B"); mUidTxBytesPosition = addUidSection(1, "tx-B"); mUidScanTimePosition = addUidSection(1, "scan", FLAG_OPTIONAL); @@ -112,32 +140,4 @@ public class BluetoothPowerStatsLayout extends PowerStatsLayout { public long getUidScanTime(long[] stats) { return stats[mUidScanTimePosition]; } - - /** - * Copies the elements of the stats array layout into <code>extras</code> - */ - public void toExtras(PersistableBundle extras) { - super.toExtras(extras); - extras.putInt(EXTRA_DEVICE_RX_TIME_POSITION, mDeviceRxTimePosition); - extras.putInt(EXTRA_DEVICE_TX_TIME_POSITION, mDeviceTxTimePosition); - extras.putInt(EXTRA_DEVICE_IDLE_TIME_POSITION, mDeviceIdleTimePosition); - extras.putInt(EXTRA_DEVICE_SCAN_TIME_POSITION, mDeviceScanTimePosition); - extras.putInt(EXTRA_UID_RX_BYTES_POSITION, mUidRxBytesPosition); - extras.putInt(EXTRA_UID_TX_BYTES_POSITION, mUidTxBytesPosition); - extras.putInt(EXTRA_UID_SCAN_TIME_POSITION, mUidScanTimePosition); - } - - /** - * Retrieves elements of the stats array layout from <code>extras</code> - */ - public void fromExtras(PersistableBundle extras) { - super.fromExtras(extras); - mDeviceRxTimePosition = extras.getInt(EXTRA_DEVICE_RX_TIME_POSITION); - mDeviceTxTimePosition = extras.getInt(EXTRA_DEVICE_TX_TIME_POSITION); - mDeviceIdleTimePosition = extras.getInt(EXTRA_DEVICE_IDLE_TIME_POSITION); - mDeviceScanTimePosition = extras.getInt(EXTRA_DEVICE_SCAN_TIME_POSITION); - mUidRxBytesPosition = extras.getInt(EXTRA_UID_RX_BYTES_POSITION); - mUidTxBytesPosition = extras.getInt(EXTRA_UID_TX_BYTES_POSITION); - mUidScanTimePosition = extras.getInt(EXTRA_UID_SCAN_TIME_POSITION); - } } diff --git a/services/core/java/com/android/server/power/stats/CpuPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/CpuPowerStatsLayout.java index 2a02bd0f9e6a..3186d7da6cb4 100644 --- a/services/core/java/com/android/server/power/stats/CpuPowerStatsLayout.java +++ b/services/core/java/com/android/server/power/stats/format/CpuPowerStatsLayout.java @@ -14,10 +14,13 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.format; +import android.annotation.NonNull; import android.os.PersistableBundle; +import com.android.internal.os.PowerStats; + /** * Captures the positions and lengths of sections of the stats array, such as time-in-state, * power usage estimates etc. @@ -40,10 +43,59 @@ public class CpuPowerStatsLayout extends PowerStatsLayout { private int[] mScalingStepToPowerBracketMap; + public CpuPowerStatsLayout(int energyConsumerCount, int cpuScalingPolicyCount, + int[] scalingStepToPowerBracketMap) { + addDeviceSectionCpuTimeByScalingStep(scalingStepToPowerBracketMap.length); + addDeviceSectionCpuTimeByCluster(cpuScalingPolicyCount); + addDeviceSectionUsageDuration(); + addDeviceSectionEnergyConsumers(energyConsumerCount); + addDeviceSectionPowerEstimate(); + addUidSectionCpuTimeByPowerBracket(scalingStepToPowerBracketMap); + addUidSectionPowerEstimate(); + } + + public CpuPowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) { + super(descriptor); + PersistableBundle extras = descriptor.extras; + mDeviceCpuTimeByScalingStepPosition = + extras.getInt(EXTRA_DEVICE_TIME_BY_SCALING_STEP_POSITION); + mDeviceCpuTimeByScalingStepCount = + extras.getInt(EXTRA_DEVICE_TIME_BY_SCALING_STEP_COUNT); + mDeviceCpuTimeByClusterPosition = + extras.getInt(EXTRA_DEVICE_TIME_BY_CLUSTER_POSITION); + mDeviceCpuTimeByClusterCount = + extras.getInt(EXTRA_DEVICE_TIME_BY_CLUSTER_COUNT); + mUidPowerBracketsPosition = extras.getInt(EXTRA_UID_BRACKETS_POSITION); + mScalingStepToPowerBracketMap = + getIntArray(extras, EXTRA_UID_STATS_SCALING_STEP_TO_POWER_BRACKET); + if (mScalingStepToPowerBracketMap == null) { + mScalingStepToPowerBracketMap = new int[mDeviceCpuTimeByScalingStepCount]; + } + updatePowerBracketCount(); + } + + /** + * Copies the elements of the stats array layout into <code>extras</code> + */ + public void toExtras(PersistableBundle extras) { + super.toExtras(extras); + extras.putInt(EXTRA_DEVICE_TIME_BY_SCALING_STEP_POSITION, + mDeviceCpuTimeByScalingStepPosition); + extras.putInt(EXTRA_DEVICE_TIME_BY_SCALING_STEP_COUNT, + mDeviceCpuTimeByScalingStepCount); + extras.putInt(EXTRA_DEVICE_TIME_BY_CLUSTER_POSITION, + mDeviceCpuTimeByClusterPosition); + extras.putInt(EXTRA_DEVICE_TIME_BY_CLUSTER_COUNT, + mDeviceCpuTimeByClusterCount); + extras.putInt(EXTRA_UID_BRACKETS_POSITION, mUidPowerBracketsPosition); + putIntArray(extras, EXTRA_UID_STATS_SCALING_STEP_TO_POWER_BRACKET, + mScalingStepToPowerBracketMap); + } + /** * Declare that the stats array has a section capturing CPU time per scaling step */ - public void addDeviceSectionCpuTimeByScalingStep(int scalingStepCount) { + private void addDeviceSectionCpuTimeByScalingStep(int scalingStepCount) { mDeviceCpuTimeByScalingStepPosition = addDeviceSection(scalingStepCount, "steps"); mDeviceCpuTimeByScalingStepCount = scalingStepCount; } @@ -71,7 +123,7 @@ public class CpuPowerStatsLayout extends PowerStatsLayout { /** * Declare that the stats array has a section capturing CPU time in each cluster */ - public void addDeviceSectionCpuTimeByCluster(int clusterCount) { + private void addDeviceSectionCpuTimeByCluster(int clusterCount) { mDeviceCpuTimeByClusterPosition = addDeviceSection(clusterCount, "clusters"); mDeviceCpuTimeByClusterCount = clusterCount; } @@ -99,7 +151,7 @@ public class CpuPowerStatsLayout extends PowerStatsLayout { /** * Declare that the UID stats array has a section capturing CPU time per power bracket. */ - public void addUidSectionCpuTimeByPowerBracket(int[] scalingStepToPowerBracketMap) { + private void addUidSectionCpuTimeByPowerBracket(int[] scalingStepToPowerBracketMap) { mScalingStepToPowerBracketMap = scalingStepToPowerBracketMap; updatePowerBracketCount(); mUidPowerBracketsPosition = addUidSection(mUidPowerBracketCount, "time"); @@ -135,44 +187,4 @@ public class CpuPowerStatsLayout extends PowerStatsLayout { public long getUidTimeByPowerBracket(long[] stats, int bracket) { return stats[mUidPowerBracketsPosition + bracket]; } - - /** - * Copies the elements of the stats array layout into <code>extras</code> - */ - public void toExtras(PersistableBundle extras) { - super.toExtras(extras); - extras.putInt(EXTRA_DEVICE_TIME_BY_SCALING_STEP_POSITION, - mDeviceCpuTimeByScalingStepPosition); - extras.putInt(EXTRA_DEVICE_TIME_BY_SCALING_STEP_COUNT, - mDeviceCpuTimeByScalingStepCount); - extras.putInt(EXTRA_DEVICE_TIME_BY_CLUSTER_POSITION, - mDeviceCpuTimeByClusterPosition); - extras.putInt(EXTRA_DEVICE_TIME_BY_CLUSTER_COUNT, - mDeviceCpuTimeByClusterCount); - extras.putInt(EXTRA_UID_BRACKETS_POSITION, mUidPowerBracketsPosition); - putIntArray(extras, EXTRA_UID_STATS_SCALING_STEP_TO_POWER_BRACKET, - mScalingStepToPowerBracketMap); - } - - /** - * Retrieves elements of the stats array layout from <code>extras</code> - */ - public void fromExtras(PersistableBundle extras) { - super.fromExtras(extras); - mDeviceCpuTimeByScalingStepPosition = - extras.getInt(EXTRA_DEVICE_TIME_BY_SCALING_STEP_POSITION); - mDeviceCpuTimeByScalingStepCount = - extras.getInt(EXTRA_DEVICE_TIME_BY_SCALING_STEP_COUNT); - mDeviceCpuTimeByClusterPosition = - extras.getInt(EXTRA_DEVICE_TIME_BY_CLUSTER_POSITION); - mDeviceCpuTimeByClusterCount = - extras.getInt(EXTRA_DEVICE_TIME_BY_CLUSTER_COUNT); - mUidPowerBracketsPosition = extras.getInt(EXTRA_UID_BRACKETS_POSITION); - mScalingStepToPowerBracketMap = - getIntArray(extras, EXTRA_UID_STATS_SCALING_STEP_TO_POWER_BRACKET); - if (mScalingStepToPowerBracketMap == null) { - mScalingStepToPowerBracketMap = new int[mDeviceCpuTimeByScalingStepCount]; - } - updatePowerBracketCount(); - } } diff --git a/services/core/java/com/android/server/power/stats/EnergyConsumerPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/EnergyConsumerPowerStatsLayout.java index 8430f564813f..e7a4822cf41d 100644 --- a/services/core/java/com/android/server/power/stats/EnergyConsumerPowerStatsLayout.java +++ b/services/core/java/com/android/server/power/stats/format/EnergyConsumerPowerStatsLayout.java @@ -14,10 +14,12 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.format; -class EnergyConsumerPowerStatsLayout extends PowerStatsLayout { - EnergyConsumerPowerStatsLayout() { +import com.android.internal.os.PowerStats; + +public class EnergyConsumerPowerStatsLayout extends PowerStatsLayout { + public EnergyConsumerPowerStatsLayout() { // Add a section for consumed energy, even if the specific device does not // have support EnergyConsumers. This is done to guarantee format compatibility between // PowerStats created by a PowerStatsCollector and those produced by a PowerStatsProcessor. @@ -30,4 +32,8 @@ class EnergyConsumerPowerStatsLayout extends PowerStatsLayout { addUidSectionEnergyConsumers(1); addUidSectionPowerEstimate(); } + + public EnergyConsumerPowerStatsLayout(PowerStats.Descriptor descriptor) { + super(descriptor); + } } diff --git a/services/core/java/com/android/server/power/stats/GnssPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/GnssPowerStatsLayout.java index 9a1317d2420c..b70b17397e12 100644 --- a/services/core/java/com/android/server/power/stats/GnssPowerStatsLayout.java +++ b/services/core/java/com/android/server/power/stats/format/GnssPowerStatsLayout.java @@ -14,28 +14,31 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.format; +import android.annotation.NonNull; import android.location.GnssSignalQuality; import android.os.PersistableBundle; -class GnssPowerStatsLayout extends BinaryStatePowerStatsLayout { +import com.android.internal.os.PowerStats; + +public class GnssPowerStatsLayout extends BinaryStatePowerStatsLayout { private static final String EXTRA_DEVICE_TIME_SIGNAL_LEVEL_POSITION = "dt-sig"; private static final String EXTRA_UID_TIME_SIGNAL_LEVEL_POSITION = "ut-sig"; - private int mDeviceSignalLevelTimePosition; - private int mUidSignalLevelTimePosition; + private final int mDeviceSignalLevelTimePosition; + private final int mUidSignalLevelTimePosition; - GnssPowerStatsLayout() { + public GnssPowerStatsLayout() { mDeviceSignalLevelTimePosition = addDeviceSection( GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS, "level"); mUidSignalLevelTimePosition = addUidSection( GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS, "level"); } - @Override - public void fromExtras(PersistableBundle extras) { - super.fromExtras(extras); + public GnssPowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) { + super(descriptor); + PersistableBundle extras = descriptor.extras; mDeviceSignalLevelTimePosition = extras.getInt(EXTRA_DEVICE_TIME_SIGNAL_LEVEL_POSITION); mUidSignalLevelTimePosition = extras.getInt(EXTRA_UID_TIME_SIGNAL_LEVEL_POSITION); } diff --git a/services/core/java/com/android/server/power/stats/MobileRadioPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/MobileRadioPowerStatsLayout.java index 07d78f8ce4d0..da6fc4115701 100644 --- a/services/core/java/com/android/server/power/stats/MobileRadioPowerStatsLayout.java +++ b/services/core/java/com/android/server/power/stats/format/MobileRadioPowerStatsLayout.java @@ -14,10 +14,12 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.format; import android.annotation.NonNull; +import android.os.BatteryStats; import android.os.PersistableBundle; +import android.telephony.AccessNetworkConstants; import android.telephony.ModemActivityInfo; import android.util.Slog; import android.util.SparseArray; @@ -28,7 +30,7 @@ import com.android.internal.os.PowerStats; * Captures the positions and lengths of sections of the stats array, such as time-in-state, * power usage estimates etc. */ -class MobileRadioPowerStatsLayout extends PowerStatsLayout { +public class MobileRadioPowerStatsLayout extends PowerStatsLayout { private static final String TAG = "MobileRadioPowerStatsLayout"; private static final String EXTRA_DEVICE_SLEEP_TIME_POSITION = "dt-sleep"; private static final String EXTRA_DEVICE_IDLE_TIME_POSITION = "dt-idle"; @@ -56,27 +58,95 @@ class MobileRadioPowerStatsLayout extends PowerStatsLayout { private int mUidRxPacketsPosition; private int mUidTxPacketsPosition; - MobileRadioPowerStatsLayout() { + public MobileRadioPowerStatsLayout(int energyConsumerCount) { + addDeviceMobileActivity(); + addDeviceSectionEnergyConsumers(energyConsumerCount); + addStateStats(); + addUidNetworkStats(); + addDeviceSectionUsageDuration(); + addDeviceSectionPowerEstimate(); + addUidSectionPowerEstimate(); } - MobileRadioPowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) { + public MobileRadioPowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) { super(descriptor); + PersistableBundle extras = descriptor.extras; + mDeviceSleepTimePosition = extras.getInt(EXTRA_DEVICE_SLEEP_TIME_POSITION); + mDeviceIdleTimePosition = extras.getInt(EXTRA_DEVICE_IDLE_TIME_POSITION); + mDeviceScanTimePosition = extras.getInt(EXTRA_DEVICE_SCAN_TIME_POSITION); + mDeviceCallTimePosition = extras.getInt(EXTRA_DEVICE_CALL_TIME_POSITION); + mDeviceCallPowerPosition = extras.getInt(EXTRA_DEVICE_CALL_POWER_POSITION); + mStateRxTimePosition = extras.getInt(EXTRA_STATE_RX_TIME_POSITION); + mStateTxTimesPosition = extras.getInt(EXTRA_STATE_TX_TIMES_POSITION); + mStateTxTimesCount = extras.getInt(EXTRA_STATE_TX_TIMES_COUNT); + mUidRxBytesPosition = extras.getInt(EXTRA_UID_RX_BYTES_POSITION); + mUidTxBytesPosition = extras.getInt(EXTRA_UID_TX_BYTES_POSITION); + mUidRxPacketsPosition = extras.getInt(EXTRA_UID_RX_PACKETS_POSITION); + mUidTxPacketsPosition = extras.getInt(EXTRA_UID_TX_PACKETS_POSITION); } - void addDeviceMobileActivity() { + /** + * Copies the elements of the stats array layout into <code>extras</code> + */ + public void toExtras(PersistableBundle extras) { + super.toExtras(extras); + extras.putInt(EXTRA_DEVICE_SLEEP_TIME_POSITION, mDeviceSleepTimePosition); + extras.putInt(EXTRA_DEVICE_IDLE_TIME_POSITION, mDeviceIdleTimePosition); + extras.putInt(EXTRA_DEVICE_SCAN_TIME_POSITION, mDeviceScanTimePosition); + extras.putInt(EXTRA_DEVICE_CALL_TIME_POSITION, mDeviceCallTimePosition); + extras.putInt(EXTRA_DEVICE_CALL_POWER_POSITION, mDeviceCallPowerPosition); + extras.putInt(EXTRA_STATE_RX_TIME_POSITION, mStateRxTimePosition); + extras.putInt(EXTRA_STATE_TX_TIMES_POSITION, mStateTxTimesPosition); + extras.putInt(EXTRA_STATE_TX_TIMES_COUNT, mStateTxTimesCount); + extras.putInt(EXTRA_UID_RX_BYTES_POSITION, mUidRxBytesPosition); + extras.putInt(EXTRA_UID_TX_BYTES_POSITION, mUidTxBytesPosition); + extras.putInt(EXTRA_UID_RX_PACKETS_POSITION, mUidRxPacketsPosition); + extras.putInt(EXTRA_UID_TX_PACKETS_POSITION, mUidTxPacketsPosition); + } + + public static int makeStateKey(int rat, int freqRange) { + if (rat == BatteryStats.RADIO_ACCESS_TECHNOLOGY_NR) { + return rat | (freqRange << 8); + } else { + return rat; + } + } + + @BatteryStats.RadioAccessTechnology + public static int mapRadioAccessNetworkTypeToRadioAccessTechnology( + @AccessNetworkConstants.RadioAccessNetworkType int networkType) { + switch (networkType) { + case AccessNetworkConstants.AccessNetworkType.NGRAN: + return BatteryStats.RADIO_ACCESS_TECHNOLOGY_NR; + case AccessNetworkConstants.AccessNetworkType.EUTRAN: + return BatteryStats.RADIO_ACCESS_TECHNOLOGY_LTE; + case AccessNetworkConstants.AccessNetworkType.UNKNOWN: //fallthrough + case AccessNetworkConstants.AccessNetworkType.GERAN: //fallthrough + case AccessNetworkConstants.AccessNetworkType.UTRAN: //fallthrough + case AccessNetworkConstants.AccessNetworkType.CDMA2000: //fallthrough + case AccessNetworkConstants.AccessNetworkType.IWLAN: + return BatteryStats.RADIO_ACCESS_TECHNOLOGY_OTHER; + default: + Slog.w(TAG, + "Unhandled RadioAccessNetworkType (" + networkType + "), mapping to OTHER"); + return BatteryStats.RADIO_ACCESS_TECHNOLOGY_OTHER; + } + } + + private void addDeviceMobileActivity() { mDeviceSleepTimePosition = addDeviceSection(1, "sleep"); mDeviceIdleTimePosition = addDeviceSection(1, "idle"); mDeviceScanTimePosition = addDeviceSection(1, "scan"); mDeviceCallTimePosition = addDeviceSection(1, "call", FLAG_OPTIONAL); } - void addStateStats() { + private void addStateStats() { mStateRxTimePosition = addStateSection(1, "rx"); mStateTxTimesCount = ModemActivityInfo.getNumTxPowerLevels(); mStateTxTimesPosition = addStateSection(mStateTxTimesCount, "tx"); } - void addUidNetworkStats() { + private void addUidNetworkStats() { mUidRxPacketsPosition = addUidSection(1, "rx-pkts"); mUidRxBytesPosition = addUidSection(1, "rx-B"); mUidTxPacketsPosition = addUidSection(1, "tx-pkts"); @@ -84,7 +154,7 @@ class MobileRadioPowerStatsLayout extends PowerStatsLayout { } @Override - public void addDeviceSectionPowerEstimate() { + protected void addDeviceSectionPowerEstimate() { super.addDeviceSectionPowerEstimate(); // Printed as part of the PhoneCallPowerStatsProcessor mDeviceCallPowerPosition = addDeviceSection(1, "call-power", FLAG_HIDDEN); @@ -178,44 +248,6 @@ class MobileRadioPowerStatsLayout extends PowerStatsLayout { return stats[mUidTxPacketsPosition]; } - /** - * Copies the elements of the stats array layout into <code>extras</code> - */ - public void toExtras(PersistableBundle extras) { - super.toExtras(extras); - extras.putInt(EXTRA_DEVICE_SLEEP_TIME_POSITION, mDeviceSleepTimePosition); - extras.putInt(EXTRA_DEVICE_IDLE_TIME_POSITION, mDeviceIdleTimePosition); - extras.putInt(EXTRA_DEVICE_SCAN_TIME_POSITION, mDeviceScanTimePosition); - extras.putInt(EXTRA_DEVICE_CALL_TIME_POSITION, mDeviceCallTimePosition); - extras.putInt(EXTRA_DEVICE_CALL_POWER_POSITION, mDeviceCallPowerPosition); - extras.putInt(EXTRA_STATE_RX_TIME_POSITION, mStateRxTimePosition); - extras.putInt(EXTRA_STATE_TX_TIMES_POSITION, mStateTxTimesPosition); - extras.putInt(EXTRA_STATE_TX_TIMES_COUNT, mStateTxTimesCount); - extras.putInt(EXTRA_UID_RX_BYTES_POSITION, mUidRxBytesPosition); - extras.putInt(EXTRA_UID_TX_BYTES_POSITION, mUidTxBytesPosition); - extras.putInt(EXTRA_UID_RX_PACKETS_POSITION, mUidRxPacketsPosition); - extras.putInt(EXTRA_UID_TX_PACKETS_POSITION, mUidTxPacketsPosition); - } - - /** - * Retrieves elements of the stats array layout from <code>extras</code> - */ - public void fromExtras(PersistableBundle extras) { - super.fromExtras(extras); - mDeviceSleepTimePosition = extras.getInt(EXTRA_DEVICE_SLEEP_TIME_POSITION); - mDeviceIdleTimePosition = extras.getInt(EXTRA_DEVICE_IDLE_TIME_POSITION); - mDeviceScanTimePosition = extras.getInt(EXTRA_DEVICE_SCAN_TIME_POSITION); - mDeviceCallTimePosition = extras.getInt(EXTRA_DEVICE_CALL_TIME_POSITION); - mDeviceCallPowerPosition = extras.getInt(EXTRA_DEVICE_CALL_POWER_POSITION); - mStateRxTimePosition = extras.getInt(EXTRA_STATE_RX_TIME_POSITION); - mStateTxTimesPosition = extras.getInt(EXTRA_STATE_TX_TIMES_POSITION); - mStateTxTimesCount = extras.getInt(EXTRA_STATE_TX_TIMES_COUNT); - mUidRxBytesPosition = extras.getInt(EXTRA_UID_RX_BYTES_POSITION); - mUidTxBytesPosition = extras.getInt(EXTRA_UID_TX_BYTES_POSITION); - mUidRxPacketsPosition = extras.getInt(EXTRA_UID_RX_PACKETS_POSITION); - mUidTxPacketsPosition = extras.getInt(EXTRA_UID_TX_PACKETS_POSITION); - } - public void addRxTxTimesForRat(SparseArray<long[]> stateStats, int networkType, int freqRange, long rxTime, int[] txTime) { if (txTime.length != mStateTxTimesCount) { @@ -239,9 +271,8 @@ class MobileRadioPowerStatsLayout extends PowerStatsLayout { return; } - int rat = MobileRadioPowerStatsCollector.mapRadioAccessNetworkTypeToRadioAccessTechnology( - networkType); - int stateKey = MobileRadioPowerStatsCollector.makeStateKey(rat, freqRange); + int rat = mapRadioAccessNetworkTypeToRadioAccessTechnology(networkType); + int stateKey = makeStateKey(rat, freqRange); long[] stats = stateStats.get(stateKey); if (stats == null) { stats = new long[getStateStatsArrayLength()]; diff --git a/services/core/java/com/android/server/power/stats/format/PhoneCallPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/PhoneCallPowerStatsLayout.java new file mode 100644 index 000000000000..5a341486072b --- /dev/null +++ b/services/core/java/com/android/server/power/stats/format/PhoneCallPowerStatsLayout.java @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.server.power.stats.format; + +public class PhoneCallPowerStatsLayout extends PowerStatsLayout { + public PhoneCallPowerStatsLayout() { + addDeviceSectionPowerEstimate(); + } +} diff --git a/services/core/java/com/android/server/power/stats/PowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/PowerStatsLayout.java index 62abfc62fd36..d070919f4c18 100644 --- a/services/core/java/com/android/server/power/stats/PowerStatsLayout.java +++ b/services/core/java/com/android/server/power/stats/format/PowerStatsLayout.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.format; import android.os.PersistableBundle; import android.util.Slog; @@ -36,7 +36,7 @@ public class PowerStatsLayout { private static final String EXTRA_UID_ENERGY_CONSUMERS_COUNT = "uec"; private static final String EXTRA_UID_POWER_POSITION = "up"; - protected static final int UNSUPPORTED = -1; + public static final int UNSUPPORTED = -1; protected static final double MILLI_TO_NANO_MULTIPLIER = 1000000.0; protected static final int FLAG_OPTIONAL = 1; protected static final int FLAG_HIDDEN = 2; @@ -46,9 +46,9 @@ public class PowerStatsLayout { private int mStateStatsArrayLength; private int mUidStatsArrayLength; - private StringBuilder mDeviceFormat = new StringBuilder(); - private StringBuilder mStateFormat = new StringBuilder(); - private StringBuilder mUidFormat = new StringBuilder(); + private final StringBuilder mDeviceFormat = new StringBuilder(); + private final StringBuilder mStateFormat = new StringBuilder(); + private final StringBuilder mUidFormat = new StringBuilder(); protected int mDeviceDurationPosition = UNSUPPORTED; private int mDeviceEnergyConsumerPosition; @@ -63,7 +63,32 @@ public class PowerStatsLayout { } public PowerStatsLayout(PowerStats.Descriptor descriptor) { - fromExtras(descriptor.extras); + PersistableBundle extras = descriptor.extras; + mDeviceDurationPosition = extras.getInt(EXTRA_DEVICE_DURATION_POSITION); + mDeviceEnergyConsumerPosition = extras.getInt(EXTRA_DEVICE_ENERGY_CONSUMERS_POSITION); + mDeviceEnergyConsumerCount = extras.getInt(EXTRA_DEVICE_ENERGY_CONSUMERS_COUNT); + mDevicePowerEstimatePosition = extras.getInt(EXTRA_DEVICE_POWER_POSITION); + mUidDurationPosition = extras.getInt(EXTRA_UID_DURATION_POSITION); + mUidEnergyConsumerPosition = extras.getInt(EXTRA_UID_ENERGY_CONSUMERS_POSITION); + mUidEnergyConsumerCount = extras.getInt(EXTRA_UID_ENERGY_CONSUMERS_COUNT); + mUidPowerEstimatePosition = extras.getInt(EXTRA_UID_POWER_POSITION); + } + + /** + * Copies the elements of the stats array layout into <code>extras</code> + */ + public void toExtras(PersistableBundle extras) { + extras.putInt(EXTRA_DEVICE_DURATION_POSITION, mDeviceDurationPosition); + extras.putInt(EXTRA_DEVICE_ENERGY_CONSUMERS_POSITION, mDeviceEnergyConsumerPosition); + extras.putInt(EXTRA_DEVICE_ENERGY_CONSUMERS_COUNT, mDeviceEnergyConsumerCount); + extras.putInt(EXTRA_DEVICE_POWER_POSITION, mDevicePowerEstimatePosition); + extras.putInt(EXTRA_UID_DURATION_POSITION, mUidDurationPosition); + extras.putInt(EXTRA_UID_ENERGY_CONSUMERS_POSITION, mUidEnergyConsumerPosition); + extras.putInt(EXTRA_UID_ENERGY_CONSUMERS_COUNT, mUidEnergyConsumerCount); + extras.putInt(EXTRA_UID_POWER_POSITION, mUidPowerEstimatePosition); + extras.putString(PowerStats.Descriptor.EXTRA_DEVICE_STATS_FORMAT, mDeviceFormat.toString()); + extras.putString(PowerStats.Descriptor.EXTRA_STATE_STATS_FORMAT, mStateFormat.toString()); + extras.putString(PowerStats.Descriptor.EXTRA_UID_STATS_FORMAT, mUidFormat.toString()); } public int getDeviceStatsArrayLength() { @@ -141,7 +166,7 @@ public class PowerStatsLayout { /** * Declare that the stats array has a section capturing usage duration */ - public void addDeviceSectionUsageDuration() { + protected void addDeviceSectionUsageDuration() { mDeviceDurationPosition = addDeviceSection(1, "usage", FLAG_OPTIONAL); } @@ -163,7 +188,7 @@ public class PowerStatsLayout { * Declares that the stats array has a section capturing EnergyConsumer data from * PowerStatsService. */ - public void addDeviceSectionEnergyConsumers(int energyConsumerCount) { + protected void addDeviceSectionEnergyConsumers(int energyConsumerCount) { mDeviceEnergyConsumerPosition = addDeviceSection(energyConsumerCount, "energy", FLAG_OPTIONAL); mDeviceEnergyConsumerCount = energyConsumerCount; @@ -192,7 +217,7 @@ public class PowerStatsLayout { /** * Declare that the stats array has a section capturing a power estimate */ - public void addDeviceSectionPowerEstimate() { + protected void addDeviceSectionPowerEstimate() { mDevicePowerEstimatePosition = addDeviceSection(1, "power", FLAG_FORMAT_AS_POWER | FLAG_OPTIONAL); } @@ -215,14 +240,14 @@ public class PowerStatsLayout { /** * Declare that the UID stats array has a section capturing usage duration */ - public void addUidSectionUsageDuration() { + protected void addUidSectionUsageDuration() { mUidDurationPosition = addUidSection(1, "time"); } /** * Declare that the UID stats array has a section capturing a power estimate */ - public void addUidSectionPowerEstimate() { + protected void addUidSectionPowerEstimate() { mUidPowerEstimatePosition = addUidSection(1, "power", FLAG_FORMAT_AS_POWER | FLAG_OPTIONAL); } @@ -251,7 +276,7 @@ public class PowerStatsLayout { * Declares that the UID stats array has a section capturing EnergyConsumer data from * PowerStatsService. */ - public void addUidSectionEnergyConsumers(int energyConsumerCount) { + protected void addUidSectionEnergyConsumers(int energyConsumerCount) { mUidEnergyConsumerPosition = addUidSection(energyConsumerCount, "energy", FLAG_OPTIONAL); mUidEnergyConsumerCount = energyConsumerCount; @@ -292,39 +317,6 @@ public class PowerStatsLayout { return stats[mUidPowerEstimatePosition] / MILLI_TO_NANO_MULTIPLIER; } - /** - * Copies the elements of the stats array layout into <code>extras</code> - */ - public void toExtras(PersistableBundle extras) { - extras.putInt(EXTRA_DEVICE_DURATION_POSITION, mDeviceDurationPosition); - extras.putInt(EXTRA_DEVICE_ENERGY_CONSUMERS_POSITION, - mDeviceEnergyConsumerPosition); - extras.putInt(EXTRA_DEVICE_ENERGY_CONSUMERS_COUNT, - mDeviceEnergyConsumerCount); - extras.putInt(EXTRA_DEVICE_POWER_POSITION, mDevicePowerEstimatePosition); - extras.putInt(EXTRA_UID_DURATION_POSITION, mUidDurationPosition); - extras.putInt(EXTRA_UID_ENERGY_CONSUMERS_POSITION, mUidEnergyConsumerPosition); - extras.putInt(EXTRA_UID_ENERGY_CONSUMERS_COUNT, mUidEnergyConsumerCount); - extras.putInt(EXTRA_UID_POWER_POSITION, mUidPowerEstimatePosition); - extras.putString(PowerStats.Descriptor.EXTRA_DEVICE_STATS_FORMAT, mDeviceFormat.toString()); - extras.putString(PowerStats.Descriptor.EXTRA_STATE_STATS_FORMAT, mStateFormat.toString()); - extras.putString(PowerStats.Descriptor.EXTRA_UID_STATS_FORMAT, mUidFormat.toString()); - } - - /** - * Retrieves elements of the stats array layout from <code>extras</code> - */ - public void fromExtras(PersistableBundle extras) { - mDeviceDurationPosition = extras.getInt(EXTRA_DEVICE_DURATION_POSITION); - mDeviceEnergyConsumerPosition = extras.getInt(EXTRA_DEVICE_ENERGY_CONSUMERS_POSITION); - mDeviceEnergyConsumerCount = extras.getInt(EXTRA_DEVICE_ENERGY_CONSUMERS_COUNT); - mDevicePowerEstimatePosition = extras.getInt(EXTRA_DEVICE_POWER_POSITION); - mUidDurationPosition = extras.getInt(EXTRA_UID_DURATION_POSITION); - mUidEnergyConsumerPosition = extras.getInt(EXTRA_UID_ENERGY_CONSUMERS_POSITION); - mUidEnergyConsumerCount = extras.getInt(EXTRA_UID_ENERGY_CONSUMERS_COUNT); - mUidPowerEstimatePosition = extras.getInt(EXTRA_UID_POWER_POSITION); - } - protected void putIntArray(PersistableBundle extras, String key, int[] array) { if (array == null) { return; diff --git a/services/core/java/com/android/server/power/stats/ScreenPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/ScreenPowerStatsLayout.java index f134aa81057d..6f6a7ff5064a 100644 --- a/services/core/java/com/android/server/power/stats/ScreenPowerStatsLayout.java +++ b/services/core/java/com/android/server/power/stats/format/ScreenPowerStatsLayout.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.format; import android.annotation.NonNull; import android.os.BatteryStats; @@ -41,14 +41,40 @@ public class ScreenPowerStatsLayout extends PowerStatsLayout { private int mDeviceScreenDozePowerPosition; private int mUidTopActivityTimePosition; - ScreenPowerStatsLayout() { + public ScreenPowerStatsLayout(int energyConsumerCount, int displayCount) { + addDeviceScreenUsageDurationSection(displayCount); + addDeviceSectionEnergyConsumers(energyConsumerCount); + addDeviceSectionUsageDuration(); + addDeviceSectionPowerEstimate(); + addUidTopActivitiyDuration(); + addUidSectionPowerEstimate(); } - ScreenPowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) { + public ScreenPowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) { super(descriptor); + PersistableBundle extras = descriptor.extras; + mDisplayCount = extras.getInt(EXTRA_DEVICE_SCREEN_COUNT, 1); + mDeviceScreenOnDurationPosition = extras.getInt(EXTRA_DEVICE_SCREEN_ON_DURATION_POSITION); + mDeviceBrightnessDurationPositions = extras.getIntArray( + EXTRA_DEVICE_BRIGHTNESS_DURATION_POSITIONS); + mDeviceScreenDozeDurationPosition = extras.getInt(EXTRA_DEVICE_DOZE_DURATION_POSITION); + mDeviceScreenDozePowerPosition = extras.getInt(EXTRA_DEVICE_DOZE_POWER_POSITION); + mUidTopActivityTimePosition = extras.getInt(EXTRA_UID_FOREGROUND_DURATION); } - void addDeviceScreenUsageDurationSection(int displayCount) { + @Override + public void toExtras(PersistableBundle extras) { + super.toExtras(extras); + extras.putInt(EXTRA_DEVICE_SCREEN_COUNT, mDisplayCount); + extras.putInt(EXTRA_DEVICE_SCREEN_ON_DURATION_POSITION, mDeviceScreenOnDurationPosition); + extras.putIntArray(EXTRA_DEVICE_BRIGHTNESS_DURATION_POSITIONS, + mDeviceBrightnessDurationPositions); + extras.putInt(EXTRA_DEVICE_DOZE_DURATION_POSITION, mDeviceScreenDozeDurationPosition); + extras.putInt(EXTRA_DEVICE_DOZE_POWER_POSITION, mDeviceScreenDozePowerPosition); + extras.putInt(EXTRA_UID_FOREGROUND_DURATION, mUidTopActivityTimePosition); + } + + private void addDeviceScreenUsageDurationSection(int displayCount) { mDisplayCount = displayCount; mDeviceScreenOnDurationPosition = addDeviceSection(displayCount, "on"); mDeviceBrightnessDurationPositions = new int[BatteryStats.NUM_SCREEN_BRIGHTNESS_BINS]; @@ -60,7 +86,7 @@ public class ScreenPowerStatsLayout extends PowerStatsLayout { } @Override - public void addDeviceSectionPowerEstimate() { + protected void addDeviceSectionPowerEstimate() { super.addDeviceSectionPowerEstimate(); // Used by AmbientDisplayPowerStatsProcessor mDeviceScreenDozePowerPosition = addDeviceSection(1, "doze-power", FLAG_HIDDEN); @@ -127,7 +153,7 @@ public class ScreenPowerStatsLayout extends PowerStatsLayout { return stats[mDeviceScreenDozePowerPosition] / MILLI_TO_NANO_MULTIPLIER; } - void addUidTopActivitiyDuration() { + private void addUidTopActivitiyDuration() { mUidTopActivityTimePosition = addUidSection(1, "top"); } @@ -144,28 +170,4 @@ public class ScreenPowerStatsLayout extends PowerStatsLayout { public long getUidTopActivityDuration(long[] stats) { return stats[mUidTopActivityTimePosition]; } - - @Override - public void toExtras(PersistableBundle extras) { - super.toExtras(extras); - extras.putInt(EXTRA_DEVICE_SCREEN_COUNT, mDisplayCount); - extras.putInt(EXTRA_DEVICE_SCREEN_ON_DURATION_POSITION, mDeviceScreenOnDurationPosition); - extras.putIntArray(EXTRA_DEVICE_BRIGHTNESS_DURATION_POSITIONS, - mDeviceBrightnessDurationPositions); - extras.putInt(EXTRA_DEVICE_DOZE_DURATION_POSITION, mDeviceScreenDozeDurationPosition); - extras.putInt(EXTRA_DEVICE_DOZE_POWER_POSITION, mDeviceScreenDozePowerPosition); - extras.putInt(EXTRA_UID_FOREGROUND_DURATION, mUidTopActivityTimePosition); - } - - @Override - public void fromExtras(PersistableBundle extras) { - super.fromExtras(extras); - mDisplayCount = extras.getInt(EXTRA_DEVICE_SCREEN_COUNT, 1); - mDeviceScreenOnDurationPosition = extras.getInt(EXTRA_DEVICE_SCREEN_ON_DURATION_POSITION); - mDeviceBrightnessDurationPositions = extras.getIntArray( - EXTRA_DEVICE_BRIGHTNESS_DURATION_POSITIONS); - mDeviceScreenDozeDurationPosition = extras.getInt(EXTRA_DEVICE_DOZE_DURATION_POSITION); - mDeviceScreenDozePowerPosition = extras.getInt(EXTRA_DEVICE_DOZE_POWER_POSITION); - mUidTopActivityTimePosition = extras.getInt(EXTRA_UID_FOREGROUND_DURATION); - } } diff --git a/services/core/java/com/android/server/power/stats/SensorPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/SensorPowerStatsLayout.java index e66cd3970d2f..e8df3ddfe5e8 100644 --- a/services/core/java/com/android/server/power/stats/SensorPowerStatsLayout.java +++ b/services/core/java/com/android/server/power/stats/format/SensorPowerStatsLayout.java @@ -14,12 +14,17 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.format; import android.os.PersistableBundle; import android.util.Slog; import android.util.SparseIntArray; +import com.android.internal.os.PowerStats; + +import java.util.Arrays; +import java.util.Map; + public class SensorPowerStatsLayout extends PowerStatsLayout { private static final String TAG = "SensorPowerStatsLayout"; private static final String EXTRA_DEVICE_SENSOR_HANDLES = "dsh"; @@ -27,28 +32,29 @@ public class SensorPowerStatsLayout extends PowerStatsLayout { private final SparseIntArray mSensorPositions = new SparseIntArray(); - void addUidSensorSection(int handle, String label) { - mSensorPositions.put(handle, addUidSection(1, label, FLAG_OPTIONAL)); + public SensorPowerStatsLayout(Map<Integer, String> idToLabelMap) { + Integer[] keys = new Integer[idToLabelMap.size()]; + idToLabelMap.keySet().toArray(keys); + Arrays.sort(keys); + for (int i = 0; i < keys.length; i++) { + addUidSensorSection(keys[i], idToLabelMap.get(keys[i])); + } + addUidSectionPowerEstimate(); + addDeviceSectionPowerEstimate(); } - /** - * Returns the position in the uid stats array of the duration element corresponding - * to the specified sensor identified by its handle. - */ - public int getUidSensorDurationPosition(int handle) { - return mSensorPositions.get(handle, UNSUPPORTED); - } + public SensorPowerStatsLayout(PowerStats.Descriptor descriptor) { + super(descriptor); - /** - * Adds the specified duration to the accumulated timer for the specified sensor. - */ - public void addUidSensorDuration(long[] stats, int handle, long durationMs) { - int position = mSensorPositions.get(handle, UNSUPPORTED); - if (position == UNSUPPORTED) { - Slog.e(TAG, "Unknown sensor: " + handle); - return; + PersistableBundle extras = descriptor.extras; + int[] handlers = extras.getIntArray(EXTRA_DEVICE_SENSOR_HANDLES); + int[] uidDurationPositions = extras.getIntArray(EXTRA_UID_SENSOR_POSITIONS); + + if (handlers != null && uidDurationPositions != null) { + for (int i = 0; i < handlers.length; i++) { + mSensorPositions.put(handlers[i], uidDurationPositions[i]); + } } - stats[position] += durationMs; } @Override @@ -67,15 +73,27 @@ public class SensorPowerStatsLayout extends PowerStatsLayout { extras.putIntArray(EXTRA_UID_SENSOR_POSITIONS, uidDurationPositions); } - @Override - public void fromExtras(PersistableBundle extras) { - super.fromExtras(extras); + private void addUidSensorSection(int handle, String label) { + mSensorPositions.put(handle, addUidSection(1, label, FLAG_OPTIONAL)); + } - int[] handlers = extras.getIntArray(EXTRA_DEVICE_SENSOR_HANDLES); - int[] uidDurationPositions = extras.getIntArray(EXTRA_UID_SENSOR_POSITIONS); + /** + * Returns the position in the uid stats array of the duration element corresponding + * to the specified sensor identified by its handle. + */ + public int getUidSensorDurationPosition(int handle) { + return mSensorPositions.get(handle, UNSUPPORTED); + } - for (int i = 0; i < handlers.length; i++) { - mSensorPositions.put(handlers[i], uidDurationPositions[i]); + /** + * Adds the specified duration to the accumulated timer for the specified sensor. + */ + public void addUidSensorDuration(long[] stats, int handle, long durationMs) { + int position = mSensorPositions.get(handle, UNSUPPORTED); + if (position == UNSUPPORTED) { + Slog.e(TAG, "Unknown sensor: " + handle); + return; } + stats[position] += durationMs; } } diff --git a/services/core/java/com/android/server/power/stats/WifiPowerStatsLayout.java b/services/core/java/com/android/server/power/stats/format/WifiPowerStatsLayout.java index e2e822690c55..ce7ef12878e2 100644 --- a/services/core/java/com/android/server/power/stats/WifiPowerStatsLayout.java +++ b/services/core/java/com/android/server/power/stats/format/WifiPowerStatsLayout.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.format; import android.annotation.NonNull; import android.os.PersistableBundle; @@ -22,7 +22,6 @@ import android.os.PersistableBundle; import com.android.internal.os.PowerStats; public class WifiPowerStatsLayout extends PowerStatsLayout { - private static final String TAG = "WifiPowerStatsLayout"; private static final int UNSPECIFIED = -1; private static final String EXTRA_POWER_REPORTING_SUPPORTED = "prs"; private static final String EXTRA_DEVICE_RX_TIME_POSITION = "dt-rx"; @@ -54,14 +53,56 @@ public class WifiPowerStatsLayout extends PowerStatsLayout { private int mUidScanTimePosition; private int mUidBatchScanTimePosition; - WifiPowerStatsLayout() { + public WifiPowerStatsLayout(int energyConsumerCount, boolean powerReportingSupported) { + addDeviceWifiActivity(powerReportingSupported); + addDeviceSectionEnergyConsumers(energyConsumerCount); + addUidNetworkStats(); + addDeviceSectionUsageDuration(); + addDeviceSectionPowerEstimate(); + addUidSectionPowerEstimate(); } - WifiPowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) { + public WifiPowerStatsLayout(@NonNull PowerStats.Descriptor descriptor) { super(descriptor); + PersistableBundle extras = descriptor.extras; + mPowerReportingSupported = extras.getBoolean(EXTRA_POWER_REPORTING_SUPPORTED); + mDeviceRxTimePosition = extras.getInt(EXTRA_DEVICE_RX_TIME_POSITION); + mDeviceTxTimePosition = extras.getInt(EXTRA_DEVICE_TX_TIME_POSITION); + mDeviceScanTimePosition = extras.getInt(EXTRA_DEVICE_SCAN_TIME_POSITION); + mDeviceBasicScanTimePosition = extras.getInt(EXTRA_DEVICE_BASIC_SCAN_TIME_POSITION); + mDeviceBatchedScanTimePosition = extras.getInt(EXTRA_DEVICE_BATCHED_SCAN_TIME_POSITION); + mDeviceIdleTimePosition = extras.getInt(EXTRA_DEVICE_IDLE_TIME_POSITION); + mDeviceActiveTimePosition = extras.getInt(EXTRA_DEVICE_ACTIVE_TIME_POSITION); + mUidRxBytesPosition = extras.getInt(EXTRA_UID_RX_BYTES_POSITION); + mUidTxBytesPosition = extras.getInt(EXTRA_UID_TX_BYTES_POSITION); + mUidRxPacketsPosition = extras.getInt(EXTRA_UID_RX_PACKETS_POSITION); + mUidTxPacketsPosition = extras.getInt(EXTRA_UID_TX_PACKETS_POSITION); + mUidScanTimePosition = extras.getInt(EXTRA_UID_SCAN_TIME_POSITION); + mUidBatchScanTimePosition = extras.getInt(EXTRA_UID_BATCH_SCAN_TIME_POSITION); } - void addDeviceWifiActivity(boolean powerReportingSupported) { + /** + * Copies the elements of the stats array layout into <code>extras</code> + */ + public void toExtras(PersistableBundle extras) { + super.toExtras(extras); + extras.putBoolean(EXTRA_POWER_REPORTING_SUPPORTED, mPowerReportingSupported); + extras.putInt(EXTRA_DEVICE_RX_TIME_POSITION, mDeviceRxTimePosition); + extras.putInt(EXTRA_DEVICE_TX_TIME_POSITION, mDeviceTxTimePosition); + extras.putInt(EXTRA_DEVICE_SCAN_TIME_POSITION, mDeviceScanTimePosition); + extras.putInt(EXTRA_DEVICE_BASIC_SCAN_TIME_POSITION, mDeviceBasicScanTimePosition); + extras.putInt(EXTRA_DEVICE_BATCHED_SCAN_TIME_POSITION, mDeviceBatchedScanTimePosition); + extras.putInt(EXTRA_DEVICE_IDLE_TIME_POSITION, mDeviceIdleTimePosition); + extras.putInt(EXTRA_DEVICE_ACTIVE_TIME_POSITION, mDeviceActiveTimePosition); + extras.putInt(EXTRA_UID_RX_BYTES_POSITION, mUidRxBytesPosition); + extras.putInt(EXTRA_UID_TX_BYTES_POSITION, mUidTxBytesPosition); + extras.putInt(EXTRA_UID_RX_PACKETS_POSITION, mUidRxPacketsPosition); + extras.putInt(EXTRA_UID_TX_PACKETS_POSITION, mUidTxPacketsPosition); + extras.putInt(EXTRA_UID_SCAN_TIME_POSITION, mUidScanTimePosition); + extras.putInt(EXTRA_UID_BATCH_SCAN_TIME_POSITION, mUidBatchScanTimePosition); + } + + private void addDeviceWifiActivity(boolean powerReportingSupported) { mPowerReportingSupported = powerReportingSupported; if (mPowerReportingSupported) { mDeviceActiveTimePosition = UNSPECIFIED; @@ -80,7 +121,7 @@ public class WifiPowerStatsLayout extends PowerStatsLayout { mDeviceBatchedScanTimePosition = addDeviceSection(1, "batched-scan", FLAG_OPTIONAL); } - void addUidNetworkStats() { + private void addUidNetworkStats() { mUidRxPacketsPosition = addUidSection(1, "rx-pkts"); mUidRxBytesPosition = addUidSection(1, "rx-B"); mUidTxPacketsPosition = addUidSection(1, "tx-pkts"); @@ -196,46 +237,4 @@ public class WifiPowerStatsLayout extends PowerStatsLayout { public long getUidBatchedScanTime(long[] stats) { return stats[mUidBatchScanTimePosition]; } - - /** - * Copies the elements of the stats array layout into <code>extras</code> - */ - public void toExtras(PersistableBundle extras) { - super.toExtras(extras); - extras.putBoolean(EXTRA_POWER_REPORTING_SUPPORTED, mPowerReportingSupported); - extras.putInt(EXTRA_DEVICE_RX_TIME_POSITION, mDeviceRxTimePosition); - extras.putInt(EXTRA_DEVICE_TX_TIME_POSITION, mDeviceTxTimePosition); - extras.putInt(EXTRA_DEVICE_SCAN_TIME_POSITION, mDeviceScanTimePosition); - extras.putInt(EXTRA_DEVICE_BASIC_SCAN_TIME_POSITION, mDeviceBasicScanTimePosition); - extras.putInt(EXTRA_DEVICE_BATCHED_SCAN_TIME_POSITION, mDeviceBatchedScanTimePosition); - extras.putInt(EXTRA_DEVICE_IDLE_TIME_POSITION, mDeviceIdleTimePosition); - extras.putInt(EXTRA_DEVICE_ACTIVE_TIME_POSITION, mDeviceActiveTimePosition); - extras.putInt(EXTRA_UID_RX_BYTES_POSITION, mUidRxBytesPosition); - extras.putInt(EXTRA_UID_TX_BYTES_POSITION, mUidTxBytesPosition); - extras.putInt(EXTRA_UID_RX_PACKETS_POSITION, mUidRxPacketsPosition); - extras.putInt(EXTRA_UID_TX_PACKETS_POSITION, mUidTxPacketsPosition); - extras.putInt(EXTRA_UID_SCAN_TIME_POSITION, mUidScanTimePosition); - extras.putInt(EXTRA_UID_BATCH_SCAN_TIME_POSITION, mUidBatchScanTimePosition); - } - - /** - * Retrieves elements of the stats array layout from <code>extras</code> - */ - public void fromExtras(PersistableBundle extras) { - super.fromExtras(extras); - mPowerReportingSupported = extras.getBoolean(EXTRA_POWER_REPORTING_SUPPORTED); - mDeviceRxTimePosition = extras.getInt(EXTRA_DEVICE_RX_TIME_POSITION); - mDeviceTxTimePosition = extras.getInt(EXTRA_DEVICE_TX_TIME_POSITION); - mDeviceScanTimePosition = extras.getInt(EXTRA_DEVICE_SCAN_TIME_POSITION); - mDeviceBasicScanTimePosition = extras.getInt(EXTRA_DEVICE_BASIC_SCAN_TIME_POSITION); - mDeviceBatchedScanTimePosition = extras.getInt(EXTRA_DEVICE_BATCHED_SCAN_TIME_POSITION); - mDeviceIdleTimePosition = extras.getInt(EXTRA_DEVICE_IDLE_TIME_POSITION); - mDeviceActiveTimePosition = extras.getInt(EXTRA_DEVICE_ACTIVE_TIME_POSITION); - mUidRxBytesPosition = extras.getInt(EXTRA_UID_RX_BYTES_POSITION); - mUidTxBytesPosition = extras.getInt(EXTRA_UID_TX_BYTES_POSITION); - mUidRxPacketsPosition = extras.getInt(EXTRA_UID_RX_PACKETS_POSITION); - mUidTxPacketsPosition = extras.getInt(EXTRA_UID_TX_PACKETS_POSITION); - mUidScanTimePosition = extras.getInt(EXTRA_UID_SCAN_TIME_POSITION); - mUidBatchScanTimePosition = extras.getInt(EXTRA_UID_BATCH_SCAN_TIME_POSITION); - } } diff --git a/services/core/java/com/android/server/power/stats/AggregatedPowerStats.java b/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStats.java index 674b4bc29ffa..a4758dd78914 100644 --- a/services/core/java/com/android/server/power/stats/AggregatedPowerStats.java +++ b/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStats.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.annotation.CurrentTimeMillisLong; import android.annotation.DurationMillisLong; @@ -33,7 +33,7 @@ import android.util.TimeUtils; import com.android.internal.os.PowerStats; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; -import com.android.server.power.stats.AggregatedPowerStatsConfig.PowerComponent; +import com.android.server.power.stats.processor.AggregatedPowerStatsConfig.PowerComponent; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -143,7 +143,8 @@ class AggregatedPowerStats { } } - List<ClockUpdate> getClockUpdates() { + // TODO - DO NOT SUBMIT public + public List<ClockUpdate> getClockUpdates() { return mClockUpdates; } @@ -274,7 +275,8 @@ class AggregatedPowerStats { int powerComponentId = parser.getAttributeInt(null, PowerComponentAggregatedPowerStats.XML_ATTR_ID); - PowerComponentAggregatedPowerStats powerComponentStats = + PowerComponentAggregatedPowerStats + powerComponentStats = stats.getPowerComponentStats(powerComponentId); if (powerComponentStats == null) { PowerComponent powerComponent = diff --git a/services/core/java/com/android/server/power/stats/AggregatedPowerStatsConfig.java b/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStatsConfig.java index ec122282e863..eaeda43ef6af 100644 --- a/services/core/java/com/android/server/power/stats/AggregatedPowerStatsConfig.java +++ b/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStatsConfig.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.annotation.IntDef; import android.annotation.NonNull; @@ -32,7 +32,7 @@ import java.util.function.Supplier; * WiFi, etc). Also, it determines which states are tracked globally and which ones on a per-UID * basis. */ -public class AggregatedPowerStatsConfig { +class AggregatedPowerStatsConfig { public static final int STATE_POWER = 0; public static final int STATE_SCREEN = 1; public static final int STATE_PROCESS_STATE = 2; @@ -70,7 +70,7 @@ public class AggregatedPowerStatsConfig { /** * Configuration for a give power component (CPU, WiFi, etc) */ - public static class PowerComponent { + static class PowerComponent { private final int mPowerComponentId; private @TrackedState int[] mTrackedDeviceStates; private @TrackedState int[] mTrackedUidStates; @@ -174,7 +174,7 @@ public class AggregatedPowerStatsConfig { * standard power component IDs, e.g. {@link BatteryConsumer#POWER_COMPONENT_CPU}, or * a custom power component. */ - public PowerComponent trackPowerComponent(int powerComponentId) { + PowerComponent trackPowerComponent(int powerComponentId) { PowerComponent builder = new PowerComponent(powerComponentId); mPowerComponents.add(builder); return builder; @@ -185,7 +185,7 @@ public class AggregatedPowerStatsConfig { * of a different power component. The tracked states will be the same as the parent * component's. */ - public PowerComponent trackPowerComponent(int powerComponentId, + PowerComponent trackPowerComponent(int powerComponentId, int parentPowerComponentId) { PowerComponent parent = null; for (int i = 0; i < mPowerComponents.size(); i++) { @@ -211,7 +211,7 @@ public class AggregatedPowerStatsConfig { * Creates a configuration for custom power components, which are yet to be discovered * dynamically through the integration with PowerStatsService. */ - public PowerComponent trackCustomPowerComponents( + PowerComponent trackCustomPowerComponents( Supplier<PowerStatsProcessor> processorFactory) { mCustomPowerStatsProcessorFactory = processorFactory; mCustomPowerComponent = new PowerComponent(BatteryConsumer.POWER_COMPONENT_ANY); @@ -221,7 +221,7 @@ public class AggregatedPowerStatsConfig { /** * Returns configurations for all registered or dynamically discovered power components. */ - public List<PowerComponent> getPowerComponentsAggregatedStatsConfigs() { + List<PowerComponent> getPowerComponentsAggregatedStatsConfigs() { return mPowerComponents; } @@ -230,7 +230,7 @@ public class AggregatedPowerStatsConfig { * integration with PowerStatsService. */ @Nullable - public PowerComponent createPowerComponent(int powerComponentId) { + PowerComponent createPowerComponent(int powerComponentId) { if (mCustomPowerComponent == null) { return null; } diff --git a/services/core/java/com/android/server/power/stats/AggregatedPowerStatsSection.java b/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStatsSection.java index 7ba433017413..4a9730cefd6c 100644 --- a/services/core/java/com/android/server/power/stats/AggregatedPowerStatsSection.java +++ b/services/core/java/com/android/server/power/stats/processor/AggregatedPowerStatsSection.java @@ -14,11 +14,15 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.util.IndentingPrintWriter; +import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; +import com.android.server.power.stats.PowerStatsSpan; + +import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; @@ -37,7 +41,7 @@ class AggregatedPowerStatsSection extends PowerStatsSpan.Section { } @Override - void write(TypedXmlSerializer serializer) throws IOException { + public void write(TypedXmlSerializer serializer) throws IOException { mAggregatedPowerStats.writeXml(serializer); } @@ -45,4 +49,24 @@ class AggregatedPowerStatsSection extends PowerStatsSpan.Section { public void dump(IndentingPrintWriter ipw) { mAggregatedPowerStats.dump(ipw); } + + static class Reader implements PowerStatsSpan.SectionReader { + private final AggregatedPowerStatsConfig mAggregatedPowerStatsConfig; + + Reader(AggregatedPowerStatsConfig config) { + mAggregatedPowerStatsConfig = config; + } + + @Override + public String getType() { + return TYPE; + } + + @Override + public PowerStatsSpan.Section read(String sectionType, TypedXmlPullParser parser) + throws IOException, XmlPullParserException { + return new AggregatedPowerStatsSection( + AggregatedPowerStats.createFromXml(parser, mAggregatedPowerStatsConfig)); + } + } } diff --git a/services/core/java/com/android/server/power/stats/AmbientDisplayPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessor.java index a42929f6c508..32dfdf915bca 100644 --- a/services/core/java/com/android/server/power/stats/AmbientDisplayPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessor.java @@ -13,24 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.os.BatteryConsumer; import android.os.PersistableBundle; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.AmbientDisplayPowerStatsLayout; +import com.android.server.power.stats.format.ScreenPowerStatsLayout; -public class AmbientDisplayPowerStatsProcessor extends PowerStatsProcessor { - private final PowerStatsLayout mStatsLayout; +class AmbientDisplayPowerStatsProcessor extends PowerStatsProcessor { + private final AmbientDisplayPowerStatsLayout mStatsLayout; private final PowerStats.Descriptor mDescriptor; private final long[] mTmpDeviceStats; private PowerStats.Descriptor mScreenPowerStatsDescriptor; private ScreenPowerStatsLayout mScreenPowerStatsLayout; private long[] mTmpScreenStats; - public AmbientDisplayPowerStatsProcessor() { - mStatsLayout = new PowerStatsLayout(); - mStatsLayout.addDeviceSectionPowerEstimate(); + AmbientDisplayPowerStatsProcessor() { + mStatsLayout = new AmbientDisplayPowerStatsLayout(); PersistableBundle extras = new PersistableBundle(); mStatsLayout.toExtras(extras); mDescriptor = new PowerStats.Descriptor(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, diff --git a/services/core/java/com/android/server/power/stats/AudioPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/AudioPowerStatsProcessor.java index a48f162321dd..ad1b4a7cc487 100644 --- a/services/core/java/com/android/server/power/stats/AudioPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/AudioPowerStatsProcessor.java @@ -14,15 +14,16 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.os.BatteryConsumer; import android.os.BatteryStats; import com.android.internal.os.PowerProfile; +import com.android.server.power.stats.PowerStatsUidResolver; -public class AudioPowerStatsProcessor extends BinaryStatePowerStatsProcessor { - public AudioPowerStatsProcessor(PowerProfile powerProfile, +class AudioPowerStatsProcessor extends BinaryStatePowerStatsProcessor { + AudioPowerStatsProcessor(PowerProfile powerProfile, PowerStatsUidResolver uidResolver) { super(BatteryConsumer.POWER_COMPONENT_AUDIO, uidResolver, powerProfile.getAveragePower(PowerProfile.POWER_AUDIO)); diff --git a/services/core/java/com/android/server/power/stats/BinaryStatePowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessor.java index 03df46aa1701..e45a707bdc8d 100644 --- a/services/core/java/com/android/server/power/stats/BinaryStatePowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessor.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.annotation.IntDef; import android.os.BatteryStats; @@ -22,6 +22,9 @@ import android.os.PersistableBundle; import android.os.Process; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.UsageBasedPowerEstimator; +import com.android.server.power.stats.format.BinaryStatePowerStatsLayout; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/services/core/java/com/android/server/power/stats/BluetoothPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/BluetoothPowerStatsProcessor.java index 077b05718503..4c1a0db02273 100644 --- a/services/core/java/com/android/server/power/stats/BluetoothPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/BluetoothPowerStatsProcessor.java @@ -14,17 +14,17 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.UsageBasedPowerEstimator; +import com.android.server.power.stats.format.BluetoothPowerStatsLayout; import java.util.ArrayList; import java.util.List; -public class BluetoothPowerStatsProcessor extends PowerStatsProcessor { - private static final String TAG = "BluetoothPowerStatsProcessor"; - +class BluetoothPowerStatsProcessor extends PowerStatsProcessor { private final UsageBasedPowerEstimator mRxPowerEstimator; private final UsageBasedPowerEstimator mTxPowerEstimator; private final UsageBasedPowerEstimator mIdlePowerEstimator; @@ -37,7 +37,7 @@ public class BluetoothPowerStatsProcessor extends PowerStatsProcessor { private long[] mTmpDeviceStatsArray; private long[] mTmpUidStatsArray; - public BluetoothPowerStatsProcessor(PowerProfile powerProfile) { + BluetoothPowerStatsProcessor(PowerProfile powerProfile) { mRxPowerEstimator = new UsageBasedPowerEstimator( powerProfile.getAveragePower(PowerProfile.POWER_BLUETOOTH_CONTROLLER_RX)); mTxPowerEstimator = new UsageBasedPowerEstimator( diff --git a/services/core/java/com/android/server/power/stats/CameraPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/CameraPowerStatsProcessor.java index 15c3eb8c0063..830906167ee2 100644 --- a/services/core/java/com/android/server/power/stats/CameraPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/CameraPowerStatsProcessor.java @@ -14,15 +14,16 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.os.BatteryConsumer; import android.os.BatteryStats; import com.android.internal.os.PowerProfile; +import com.android.server.power.stats.PowerStatsUidResolver; -public class CameraPowerStatsProcessor extends BinaryStatePowerStatsProcessor { - public CameraPowerStatsProcessor(PowerProfile powerProfile, +class CameraPowerStatsProcessor extends BinaryStatePowerStatsProcessor { + CameraPowerStatsProcessor(PowerProfile powerProfile, PowerStatsUidResolver uidResolver) { super(BatteryConsumer.POWER_COMPONENT_CAMERA, uidResolver, powerProfile.getAveragePower(PowerProfile.POWER_CAMERA)); diff --git a/services/core/java/com/android/server/power/stats/CpuPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/CpuPowerStatsProcessor.java index 6da0a8fef334..5f7a3dad99e8 100644 --- a/services/core/java/com/android/server/power/stats/CpuPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/CpuPowerStatsProcessor.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.util.ArraySet; import android.util.Log; @@ -22,13 +22,14 @@ import android.util.Log; import com.android.internal.os.CpuScalingPolicies; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.CpuPowerStatsLayout; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; -public class CpuPowerStatsProcessor extends PowerStatsProcessor { +class CpuPowerStatsProcessor extends PowerStatsProcessor { private static final String TAG = "CpuPowerStatsProcessor"; private static final double HOUR_IN_MILLIS = TimeUnit.HOURS.toMillis(1); @@ -72,7 +73,7 @@ public class CpuPowerStatsProcessor extends PowerStatsProcessor { // Temp array for retrieval of UID power stats, to avoid repeated allocations private long[] mTmpUidStatsArray; - public CpuPowerStatsProcessor(PowerProfile powerProfile, CpuScalingPolicies scalingPolicies) { + CpuPowerStatsProcessor(PowerProfile powerProfile, CpuScalingPolicies scalingPolicies) { mCpuScalingPolicies = scalingPolicies; mCpuScalingStepCount = scalingPolicies.getScalingStepCount(); mScalingStepToCluster = new int[mCpuScalingStepCount]; @@ -104,8 +105,7 @@ public class CpuPowerStatsProcessor extends PowerStatsProcessor { } mLastUsedDescriptor = descriptor; - mStatsLayout = new CpuPowerStatsLayout(); - mStatsLayout.fromExtras(descriptor.extras); + mStatsLayout = new CpuPowerStatsLayout(descriptor); mTmpDeviceStatsArray = new long[descriptor.statsArrayLength]; mTmpUidStatsArray = new long[descriptor.uidStatsArrayLength]; @@ -138,7 +138,7 @@ public class CpuPowerStatsProcessor extends PowerStatsProcessor { } @Override - public void finish(PowerComponentAggregatedPowerStats stats, long timestampMs) { + void finish(PowerComponentAggregatedPowerStats stats, long timestampMs) { if (stats.getPowerStatsDescriptor() == null) { return; } diff --git a/services/core/java/com/android/server/power/stats/CustomEnergyConsumerPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/CustomEnergyConsumerPowerStatsProcessor.java index a86242ad0e02..76adc47cc165 100644 --- a/services/core/java/com/android/server/power/stats/CustomEnergyConsumerPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/CustomEnergyConsumerPowerStatsProcessor.java @@ -14,14 +14,15 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.EnergyConsumerPowerStatsLayout; import java.util.ArrayList; import java.util.List; -public class CustomEnergyConsumerPowerStatsProcessor extends PowerStatsProcessor { +class CustomEnergyConsumerPowerStatsProcessor extends PowerStatsProcessor { private static final EnergyConsumerPowerStatsLayout sLayout = new EnergyConsumerPowerStatsLayout(); private long[] mTmpDeviceStatsArray; diff --git a/services/core/java/com/android/server/power/stats/FlashlightPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/FlashlightPowerStatsProcessor.java index f7216c9af9d6..b0bef69dfc49 100644 --- a/services/core/java/com/android/server/power/stats/FlashlightPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/FlashlightPowerStatsProcessor.java @@ -14,15 +14,16 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.os.BatteryConsumer; import android.os.BatteryStats; import com.android.internal.os.PowerProfile; +import com.android.server.power.stats.PowerStatsUidResolver; -public class FlashlightPowerStatsProcessor extends BinaryStatePowerStatsProcessor { - public FlashlightPowerStatsProcessor(PowerProfile powerProfile, +class FlashlightPowerStatsProcessor extends BinaryStatePowerStatsProcessor { + FlashlightPowerStatsProcessor(PowerProfile powerProfile, PowerStatsUidResolver uidResolver) { super(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, uidResolver, powerProfile.getAveragePower(PowerProfile.POWER_FLASHLIGHT)); diff --git a/services/core/java/com/android/server/power/stats/GnssPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/GnssPowerStatsProcessor.java index 0b287109cfa6..f1e3e90e7099 100644 --- a/services/core/java/com/android/server/power/stats/GnssPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/GnssPowerStatsProcessor.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.location.GnssSignalQuality; import android.os.BatteryConsumer; @@ -23,10 +23,13 @@ import android.os.Process; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.UsageBasedPowerEstimator; +import com.android.server.power.stats.format.GnssPowerStatsLayout; import java.util.Arrays; -public class GnssPowerStatsProcessor extends BinaryStatePowerStatsProcessor { +class GnssPowerStatsProcessor extends BinaryStatePowerStatsProcessor { private static final GnssPowerStatsLayout sStatsLayout = new GnssPowerStatsLayout(); private final UsageBasedPowerEstimator[] mSignalLevelEstimators = new UsageBasedPowerEstimator[GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS]; @@ -37,7 +40,7 @@ public class GnssPowerStatsProcessor extends BinaryStatePowerStatsProcessor { private final long[] mGnssSignalDurations = new long[GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS]; - public GnssPowerStatsProcessor(PowerProfile powerProfile, PowerStatsUidResolver uidResolver) { + GnssPowerStatsProcessor(PowerProfile powerProfile, PowerStatsUidResolver uidResolver) { super(BatteryConsumer.POWER_COMPONENT_GNSS, uidResolver, powerProfile.getAveragePower(PowerProfile.POWER_GPS_ON), sStatsLayout); diff --git a/services/core/java/com/android/server/power/stats/MobileRadioPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessor.java index dcce56283df2..b4c40de862b4 100644 --- a/services/core/java/com/android/server/power/stats/MobileRadioPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessor.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.os.BatteryStats; import android.telephony.CellSignalStrength; @@ -26,13 +26,15 @@ import android.util.SparseArray; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; import com.android.internal.power.ModemPowerProfile; +import com.android.server.power.stats.UsageBasedPowerEstimator; +import com.android.server.power.stats.format.MobileRadioPowerStatsLayout; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class MobileRadioPowerStatsProcessor extends PowerStatsProcessor { - private static final String TAG = "MobileRadioPowerStatsProcessor"; +class MobileRadioPowerStatsProcessor extends PowerStatsProcessor { + private static final String TAG = "MobileRadioPowerStats"; private static final boolean DEBUG = false; private static final int NUM_SIGNAL_STRENGTH_LEVELS = @@ -61,7 +63,7 @@ public class MobileRadioPowerStatsProcessor extends PowerStatsProcessor { private long[] mTmpStateStatsArray; private long[] mTmpUidStatsArray; - public MobileRadioPowerStatsProcessor(PowerProfile powerProfile) { + MobileRadioPowerStatsProcessor(PowerProfile powerProfile) { final double sleepDrainRateMa = powerProfile.getAverageBatteryDrainOrDefaultMa( PowerProfile.SUBSYSTEM_MODEM | ModemPowerProfile.MODEM_DRAIN_TYPE_SLEEP, Double.NaN); @@ -101,7 +103,7 @@ public class MobileRadioPowerStatsProcessor extends PowerStatsProcessor { ? ServiceState.FREQUENCY_RANGE_COUNT : 1; for (int freqRange = 0; freqRange < freqCount; freqRange++) { mRxTxPowerEstimators.put( - MobileRadioPowerStatsCollector.makeStateKey(rat, freqRange), + MobileRadioPowerStatsLayout.makeStateKey(rat, freqRange), buildRxTxPowerEstimators(powerProfile, rat, freqRange)); } } @@ -114,8 +116,7 @@ public class MobileRadioPowerStatsProcessor extends PowerStatsProcessor { ModemPowerProfile.MODEM_DRAIN_TYPE_RX, rat, freqRange, IGNORE); double rxDrainRateMa = powerProfile.getAverageBatteryDrainOrDefaultMa(rxKey, Double.NaN); if (Double.isNaN(rxDrainRateMa)) { - Log.w(TAG, "Unavailable Power Profile constant for key 0x" - + Long.toHexString(rxKey)); + Log.w(TAG, "Unavailable Power Profile constant for key 0x" + Long.toHexString(rxKey)); rxDrainRateMa = 0; } estimators.mRxPowerEstimator = new UsageBasedPowerEstimator(rxDrainRateMa); diff --git a/services/core/java/com/android/server/power/stats/processor/MultiStatePowerAttributor.java b/services/core/java/com/android/server/power/stats/processor/MultiStatePowerAttributor.java new file mode 100644 index 000000000000..2ba4a5254c5a --- /dev/null +++ b/services/core/java/com/android/server/power/stats/processor/MultiStatePowerAttributor.java @@ -0,0 +1,310 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.power.stats.processor; + +import android.annotation.NonNull; +import android.content.Context; +import android.hardware.SensorManager; +import android.os.BatteryConsumer; +import android.os.BatteryUsageStats; +import android.util.IndentingPrintWriter; +import android.util.Slog; +import android.util.SparseBooleanArray; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.os.BatteryStatsHistory; +import com.android.internal.os.CpuScalingPolicies; +import com.android.internal.os.PowerProfile; +import com.android.server.power.stats.PowerAttributor; +import com.android.server.power.stats.PowerStatsSpan; +import com.android.server.power.stats.PowerStatsStore; +import com.android.server.power.stats.PowerStatsUidResolver; + +import java.util.List; + +public class MultiStatePowerAttributor implements PowerAttributor { + private static final String TAG = "MultiStatePowerAttributor"; + + private final PowerStatsStore mPowerStatsStore; + private final PowerStatsExporter mPowerStatsExporter; + private final PowerStatsAggregator mPowerStatsAggregator; + private final SparseBooleanArray mPowerStatsExporterEnabled = new SparseBooleanArray(); + + // TODO(b/346371828): remove dependency on PowerStatsUidResolver. At the time of power + // attribution isolates UIDs are supposed to be long forgotten. + public MultiStatePowerAttributor(Context context, PowerStatsStore powerStatsStore, + @NonNull PowerProfile powerProfile, @NonNull CpuScalingPolicies cpuScalingPolicies, + @NonNull PowerStatsUidResolver powerStatsUidResolver) { + this(powerStatsStore, new PowerStatsAggregator( + createAggregatedPowerStatsConfig(context, powerProfile, cpuScalingPolicies, + powerStatsUidResolver))); + } + + @VisibleForTesting + MultiStatePowerAttributor(PowerStatsStore powerStatsStore, + PowerStatsAggregator powerStatsAggregator) { + mPowerStatsStore = powerStatsStore; + mPowerStatsAggregator = powerStatsAggregator; + mPowerStatsStore.addSectionReader( + new AggregatedPowerStatsSection.Reader(mPowerStatsAggregator.getConfig())); + mPowerStatsExporter = new PowerStatsExporter(mPowerStatsStore, mPowerStatsAggregator); + } + + private static AggregatedPowerStatsConfig createAggregatedPowerStatsConfig(Context context, + PowerProfile powerProfile, CpuScalingPolicies cpuScalingPolicies, + PowerStatsUidResolver powerStatsUidResolver) { + AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_CPU) + .trackDeviceStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .trackUidStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN, + AggregatedPowerStatsConfig.STATE_PROCESS_STATE) + .setProcessorSupplier( + () -> new CpuPowerStatsProcessor(powerProfile, cpuScalingPolicies)); + + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_SCREEN) + .trackDeviceStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .trackUidStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .setProcessorSupplier( + () -> new ScreenPowerStatsProcessor(powerProfile)); + + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY, + BatteryConsumer.POWER_COMPONENT_SCREEN) + .setProcessorSupplier(AmbientDisplayPowerStatsProcessor::new); + + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) + .trackDeviceStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .trackUidStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN, + AggregatedPowerStatsConfig.STATE_PROCESS_STATE) + .setProcessorSupplier( + () -> new MobileRadioPowerStatsProcessor(powerProfile)); + + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_PHONE, + BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) + .setProcessorSupplier(PhoneCallPowerStatsProcessor::new); + + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_WIFI) + .trackDeviceStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .trackUidStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN, + AggregatedPowerStatsConfig.STATE_PROCESS_STATE) + .setProcessorSupplier( + () -> new WifiPowerStatsProcessor(powerProfile)); + + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_BLUETOOTH) + .trackDeviceStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .trackUidStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN, + AggregatedPowerStatsConfig.STATE_PROCESS_STATE) + .setProcessorSupplier( + () -> new BluetoothPowerStatsProcessor(powerProfile)); + + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_AUDIO) + .trackDeviceStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .trackUidStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN, + AggregatedPowerStatsConfig.STATE_PROCESS_STATE) + .setProcessorSupplier( + () -> new AudioPowerStatsProcessor(powerProfile, powerStatsUidResolver)); + + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_VIDEO) + .trackDeviceStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .trackUidStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN, + AggregatedPowerStatsConfig.STATE_PROCESS_STATE) + .setProcessorSupplier( + () -> new VideoPowerStatsProcessor(powerProfile, powerStatsUidResolver)); + + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT) + .trackDeviceStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .trackUidStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN, + AggregatedPowerStatsConfig.STATE_PROCESS_STATE) + .setProcessorSupplier( + () -> new FlashlightPowerStatsProcessor(powerProfile, + powerStatsUidResolver)); + + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_CAMERA) + .trackDeviceStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .trackUidStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN, + AggregatedPowerStatsConfig.STATE_PROCESS_STATE) + .setProcessorSupplier( + () -> new CameraPowerStatsProcessor(powerProfile, powerStatsUidResolver)); + + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_GNSS) + .trackDeviceStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .trackUidStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN, + AggregatedPowerStatsConfig.STATE_PROCESS_STATE) + .setProcessorSupplier( + () -> new GnssPowerStatsProcessor(powerProfile, powerStatsUidResolver)); + + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_SENSORS) + .trackDeviceStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .trackUidStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN, + AggregatedPowerStatsConfig.STATE_PROCESS_STATE) + .setProcessorSupplier(() -> new SensorPowerStatsProcessor( + () -> context.getSystemService(SensorManager.class))); + + config.trackCustomPowerComponents(CustomEnergyConsumerPowerStatsProcessor::new) + .trackDeviceStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN) + .trackUidStates( + AggregatedPowerStatsConfig.STATE_POWER, + AggregatedPowerStatsConfig.STATE_SCREEN, + AggregatedPowerStatsConfig.STATE_PROCESS_STATE); + return config; + } + + /** + * Marks the specified power component as supported by this PowerAttributor + */ + public void setPowerComponentSupported(@BatteryConsumer.PowerComponentId int powerComponentId, + boolean enabled) { + mPowerStatsExporterEnabled.put(powerComponentId, enabled); + mPowerStatsExporter.setPowerComponentEnabled(powerComponentId, enabled); + } + + @Override + public boolean isPowerComponentSupported( + @BatteryConsumer.PowerComponentId int powerComponentId) { + return mPowerStatsExporterEnabled.get(powerComponentId); + } + + @Override + public void estimatePowerConsumption(BatteryUsageStats.Builder batteryUsageStatsBuilder, + BatteryStatsHistory batteryHistory, long monotonicStartTime, long monotonicEndTime) { + mPowerStatsExporter.exportAggregatedPowerStats(batteryUsageStatsBuilder, batteryHistory, + monotonicStartTime, monotonicEndTime); + } + + @Override + public void dumpEstimatedPowerConsumption(IndentingPrintWriter ipw, + BatteryStatsHistory batteryStatsHistory, + long startTime, long endTime) { + mPowerStatsAggregator.aggregatePowerStats(batteryStatsHistory, startTime, endTime, + stats -> { + // Create a PowerStatsSpan for consistency of the textual output + PowerStatsSpan span = createPowerStatsSpan(stats); + if (span != null) { + span.dump(ipw); + } + }); + } + + @Override + public long storeEstimatedPowerConsumption(BatteryStatsHistory batteryStatsHistory, + long startTime, long endTimeMs) { + long[] lastSavedMonotonicTime = new long[1]; + mPowerStatsAggregator.aggregatePowerStats(batteryStatsHistory, startTime, endTimeMs, + stats -> { + storeAggregatedPowerStats(stats); + lastSavedMonotonicTime[0] = stats.getStartTime() + stats.getDuration(); + }); + return lastSavedMonotonicTime[0]; + } + + @VisibleForTesting + void storeAggregatedPowerStats(AggregatedPowerStats stats) { + PowerStatsSpan span = createPowerStatsSpan(stats); + if (span == null) { + return; + } + mPowerStatsStore.storePowerStatsSpan(span); + } + + private static PowerStatsSpan createPowerStatsSpan(AggregatedPowerStats stats) { + List<AggregatedPowerStats.ClockUpdate> clockUpdates = stats.getClockUpdates(); + if (clockUpdates.isEmpty()) { + Slog.w(TAG, "No clock updates in aggregated power stats " + stats); + return null; + } + + long monotonicTime = clockUpdates.get(0).monotonicTime; + long durationSum = 0; + PowerStatsSpan span = new PowerStatsSpan(monotonicTime); + for (int i = 0; i < clockUpdates.size(); i++) { + AggregatedPowerStats.ClockUpdate clockUpdate = clockUpdates.get(i); + long duration; + if (i == clockUpdates.size() - 1) { + duration = stats.getDuration() - durationSum; + } else { + duration = clockUpdate.monotonicTime - monotonicTime; + } + span.addTimeFrame(clockUpdate.monotonicTime, clockUpdate.currentTime, duration); + monotonicTime = clockUpdate.monotonicTime; + durationSum += duration; + } + + span.addSection(new AggregatedPowerStatsSection(stats)); + return span; + } + + @Override + public long getLastSavedEstimatesPowerConsumptionTimestamp() { + long timestamp = -1; + for (PowerStatsSpan.Metadata metadata : mPowerStatsStore.getTableOfContents()) { + if (metadata.getSections().contains(AggregatedPowerStatsSection.TYPE)) { + for (PowerStatsSpan.TimeFrame timeFrame : metadata.getTimeFrames()) { + long endMonotonicTime = timeFrame.startMonotonicTime + timeFrame.duration; + if (endMonotonicTime > timestamp) { + timestamp = endMonotonicTime; + } + } + } + } + return timestamp; + } +} diff --git a/services/core/java/com/android/server/power/stats/MultiStateStats.java b/services/core/java/com/android/server/power/stats/processor/MultiStateStats.java index c3a0aeb12c08..28474a554b38 100644 --- a/services/core/java/com/android/server/power/stats/MultiStateStats.java +++ b/services/core/java/com/android/server/power/stats/processor/MultiStateStats.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.util.Slog; @@ -37,7 +37,7 @@ import java.util.function.Consumer; * CPU residency, Network packet counts etc. All metrics must be represented as <code>long</code> * values; */ -public class MultiStateStats { +class MultiStateStats { private static final String TAG = "MultiStateStats"; private static final String XML_TAG_STATS = "stats"; @@ -47,12 +47,12 @@ public class MultiStateStats { * A set of states, e.g. on-battery, screen-on, procstate. The state values are integers * from 0 to States.mLabels.length */ - public static class States { + static class States { final String mName; final boolean mTracked; final String[] mLabels; - public States(String name, boolean tracked, String... labels) { + States(String name, boolean tracked, String... labels) { mName = name; mTracked = tracked; mLabels = labels; @@ -121,7 +121,7 @@ public class MultiStateStats { * Factory for MultiStateStats containers. All generated containers retain their connection * to the Factory and the corresponding configuration. */ - public static class Factory { + static class Factory { private static final int INVALID_SERIAL_STATE = -1; final int mDimensionCount; final States[] mStates; @@ -147,7 +147,7 @@ public class MultiStateStats { final int[] mCompositeToSerialState; final int mSerialStateCount; - public Factory(int dimensionCount, States... states) { + Factory(int dimensionCount, States... states) { mDimensionCount = dimensionCount; mStates = states; @@ -250,7 +250,7 @@ public class MultiStateStats { /** * Allocates a new stats container using this Factory's configuration. */ - public MultiStateStats create() { + MultiStateStats create() { return new MultiStateStats(this, mDimensionCount); } @@ -293,16 +293,16 @@ public class MultiStateStats { private int mCompositeState; private boolean mTracking; - public MultiStateStats(Factory factory, int dimensionCount) { + MultiStateStats(Factory factory, int dimensionCount) { this.mFactory = factory; mCounter = new LongArrayMultiStateCounter(factory.mSerialStateCount, dimensionCount); } - public int getDimensionCount() { + int getDimensionCount() { return mFactory.mDimensionCount; } - public States[] getStates() { + States[] getStates() { return mFactory.mStates; } @@ -310,7 +310,7 @@ public class MultiStateStats { * Copies time-in-state and timestamps from the supplied prototype. Does not * copy accumulated counts. */ - public void copyStatesFrom(MultiStateStats otherStats) { + void copyStatesFrom(MultiStateStats otherStats) { mCounter.copyStatesFrom(otherStats.mCounter); } @@ -322,7 +322,7 @@ public class MultiStateStats { * @param state The new value of the state (e.g. 0 or 1 for "on-battery") * @param timestampMs The time when the state change occurred */ - public void setState(int stateIndex, int state, long timestampMs) { + void setState(int stateIndex, int state, long timestampMs) { if (!mTracking) { mCounter.updateValues(new long[mCounter.getArrayLength()], timestampMs); mTracking = true; @@ -335,7 +335,7 @@ public class MultiStateStats { * Adds the delta to the metrics. The number of values must correspond to the dimension count * supplied to the Factory constructor */ - public void increment(long[] values, long timestampMs) { + void increment(long[] values, long timestampMs) { mCounter.incrementValues(values, timestampMs); mTracking = true; } @@ -343,21 +343,21 @@ public class MultiStateStats { /** * Returns accumulated stats for the specified composite state. */ - public void getStats(long[] outValues, int[] states) { + void getStats(long[] outValues, int[] states) { mCounter.getCounts(outValues, mFactory.getSerialState(states)); } /** * Updates the stats values for the provided combination of states. */ - public void setStats(int[] states, long[] values) { + void setStats(int[] states, long[] values) { mCounter.setValues(mFactory.getSerialState(states), values); } /** * Resets the counters. */ - public void reset() { + void reset() { mCounter.reset(); mTracking = false; } @@ -365,7 +365,7 @@ public class MultiStateStats { /** * Stores contents in an XML doc. */ - public void writeXml(TypedXmlSerializer serializer) throws IOException { + void writeXml(TypedXmlSerializer serializer) throws IOException { long[] tmpArray = new long[mCounter.getArrayLength()]; try { @@ -420,8 +420,7 @@ public class MultiStateStats { * Populates the object with contents in an XML doc. The parser is expected to be * positioned on the opening tag of the corresponding element. */ - public boolean readFromXml(TypedXmlPullParser parser) throws XmlPullParserException, - IOException { + boolean readFromXml(TypedXmlPullParser parser) throws XmlPullParserException, IOException { String outerTag = parser.getName(); long[] tmpArray = new long[mCounter.getArrayLength()]; int eventType = parser.getEventType(); diff --git a/services/core/java/com/android/server/power/stats/PhoneCallPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessor.java index ec23fa000f80..3957ae0862dc 100644 --- a/services/core/java/com/android/server/power/stats/PhoneCallPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessor.java @@ -13,24 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.os.BatteryConsumer; import android.os.PersistableBundle; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.MobileRadioPowerStatsLayout; +import com.android.server.power.stats.format.PhoneCallPowerStatsLayout; -public class PhoneCallPowerStatsProcessor extends PowerStatsProcessor { - private final PowerStatsLayout mStatsLayout; +class PhoneCallPowerStatsProcessor extends PowerStatsProcessor { + private final PhoneCallPowerStatsLayout mStatsLayout; private final PowerStats.Descriptor mDescriptor; private final long[] mTmpDeviceStats; private PowerStats.Descriptor mMobileRadioStatsDescriptor; private MobileRadioPowerStatsLayout mMobileRadioStatsLayout; private long[] mTmpMobileRadioDeviceStats; - public PhoneCallPowerStatsProcessor() { - mStatsLayout = new PowerStatsLayout(); - mStatsLayout.addDeviceSectionPowerEstimate(); + PhoneCallPowerStatsProcessor() { + mStatsLayout = new PhoneCallPowerStatsLayout(); PersistableBundle extras = new PersistableBundle(); mStatsLayout.toExtras(extras); mDescriptor = new PowerStats.Descriptor(BatteryConsumer.POWER_COMPONENT_PHONE, diff --git a/services/core/java/com/android/server/power/stats/PowerComponentAggregatedPowerStats.java b/services/core/java/com/android/server/power/stats/processor/PowerComponentAggregatedPowerStats.java index a92a6fd3e3d5..d04c5baf921f 100644 --- a/services/core/java/com/android/server/power/stats/PowerComponentAggregatedPowerStats.java +++ b/services/core/java/com/android/server/power/stats/processor/PowerComponentAggregatedPowerStats.java @@ -14,9 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; - -import static com.android.server.power.stats.MultiStateStats.STATE_DOES_NOT_EXIST; +package com.android.server.power.stats.processor; import android.annotation.NonNull; import android.annotation.Nullable; @@ -147,7 +145,8 @@ class PowerComponentAggregatedPowerStats { int uidStateId = MultiStateStats.States .findTrackedStateByName(mUidStateConfig, mDeviceStateConfig[stateId].getName()); - if (uidStateId != STATE_DOES_NOT_EXIST && mUidStateConfig[uidStateId].isTracked()) { + if (uidStateId != MultiStateStats.STATE_DOES_NOT_EXIST + && mUidStateConfig[uidStateId].isTracked()) { for (int i = mUidStats.size() - 1; i >= 0; i--) { PowerComponentAggregatedPowerStats.UidStats uidStats = mUidStats.valueAt(i); if (uidStats.stats == null) { @@ -271,7 +270,7 @@ class PowerComponentAggregatedPowerStats { if (mUidStateConfig[stateId].isTracked()) { int deviceStateId = MultiStateStats.States.findTrackedStateByName( mDeviceStateConfig, mUidStateConfig[stateId].getName()); - if (deviceStateId != STATE_DOES_NOT_EXIST + if (deviceStateId != MultiStateStats.STATE_DOES_NOT_EXIST && mDeviceStateConfig[deviceStateId].isTracked()) { uidStats.states[stateId] = mDeviceStates[deviceStateId]; } diff --git a/services/core/java/com/android/server/power/stats/PowerStatsAggregator.java b/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java index c734f683fff0..32c1056908d5 100644 --- a/services/core/java/com/android/server/power/stats/PowerStatsAggregator.java +++ b/services/core/java/com/android/server/power/stats/processor/PowerStatsAggregator.java @@ -13,13 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.annotation.NonNull; import android.os.BatteryConsumer; import android.os.BatteryStats; import android.util.SparseBooleanArray; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BatteryStatsHistory; import com.android.internal.os.BatteryStatsHistoryIterator; @@ -33,20 +34,22 @@ import java.util.function.Consumer; public class PowerStatsAggregator { private static final long UNINITIALIZED = -1; private final AggregatedPowerStatsConfig mAggregatedPowerStatsConfig; - private final BatteryStatsHistory mHistory; private final SparseBooleanArray mEnabledComponents = new SparseBooleanArray(BatteryConsumer.POWER_COMPONENT_COUNT + 10); private AggregatedPowerStats mStats; private int mCurrentBatteryState = AggregatedPowerStatsConfig.POWER_STATE_BATTERY; private int mCurrentScreenState = AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; - public PowerStatsAggregator(@NonNull AggregatedPowerStatsConfig aggregatedPowerStatsConfig, - @NonNull BatteryStatsHistory history) { + @VisibleForTesting + public PowerStatsAggregator() { + this(new AggregatedPowerStatsConfig()); + } + + PowerStatsAggregator(@NonNull AggregatedPowerStatsConfig aggregatedPowerStatsConfig) { mAggregatedPowerStatsConfig = aggregatedPowerStatsConfig; - mHistory = history; } - public AggregatedPowerStatsConfig getConfig() { + AggregatedPowerStatsConfig getConfig() { return mAggregatedPowerStatsConfig; } @@ -71,7 +74,7 @@ public class PowerStatsAggregator { * Note: the AggregatedPowerStats object is reused, so the consumer should fully consume * the stats in the <code>accept</code> method and never cache it. */ - public void aggregatePowerStats(long startTimeMs, long endTimeMs, + public void aggregatePowerStats(BatteryStatsHistory history, long startTimeMs, long endTimeMs, Consumer<AggregatedPowerStats> consumer) { synchronized (this) { if (mStats == null) { @@ -85,7 +88,7 @@ public class PowerStatsAggregator { long lastTime = 0; int lastStates = 0xFFFFFFFF; int lastStates2 = 0xFFFFFFFF; - try (BatteryStatsHistoryIterator iterator = mHistory.iterate(startTimeMs, endTimeMs)) { + try (BatteryStatsHistoryIterator iterator = history.iterate(startTimeMs, endTimeMs)) { while (iterator.hasNext()) { BatteryStats.HistoryItem item = iterator.next(); diff --git a/services/core/java/com/android/server/power/stats/PowerStatsExporter.java b/services/core/java/com/android/server/power/stats/processor/PowerStatsExporter.java index c5bed245e287..fab87d6684e1 100644 --- a/services/core/java/com/android/server/power/stats/PowerStatsExporter.java +++ b/services/core/java/com/android/server/power/stats/processor/PowerStatsExporter.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.annotation.Nullable; import android.os.AggregateBatteryConsumer; @@ -24,7 +24,11 @@ import android.os.UidBatteryConsumer; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.os.BatteryStatsHistory; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.PowerStatsSpan; +import com.android.server.power.stats.PowerStatsStore; +import com.android.server.power.stats.format.PowerStatsLayout; import java.util.ArrayList; import java.util.Arrays; @@ -35,19 +39,18 @@ import java.util.concurrent.TimeUnit; * Given a time range, converts accumulated PowerStats to BatteryUsageStats. Combines * stores spans of PowerStats with the yet-unprocessed tail of battery history. */ -public class PowerStatsExporter { +class PowerStatsExporter { private static final String TAG = "PowerStatsExporter"; private final PowerStatsStore mPowerStatsStore; private final PowerStatsAggregator mPowerStatsAggregator; private final long mBatterySessionTimeSpanSlackMillis; private static final long BATTERY_SESSION_TIME_SPAN_SLACK_MILLIS = TimeUnit.MINUTES.toMillis(2); - public PowerStatsExporter(PowerStatsStore powerStatsStore, - PowerStatsAggregator powerStatsAggregator) { + PowerStatsExporter(PowerStatsStore powerStatsStore, PowerStatsAggregator powerStatsAggregator) { this(powerStatsStore, powerStatsAggregator, BATTERY_SESSION_TIME_SPAN_SLACK_MILLIS); } - public PowerStatsExporter(PowerStatsStore powerStatsStore, + PowerStatsExporter(PowerStatsStore powerStatsStore, PowerStatsAggregator powerStatsAggregator, long batterySessionTimeSpanSlackMillis) { mPowerStatsStore = powerStatsStore; @@ -59,8 +62,8 @@ public class PowerStatsExporter { * Populates the provided BatteryUsageStats.Builder with power estimates from the accumulated * PowerStats, both stored in PowerStatsStore and not-yet processed. */ - public void exportAggregatedPowerStats(BatteryUsageStats.Builder batteryUsageStatsBuilder, - long monotonicStartTime, long monotonicEndTime) { + void exportAggregatedPowerStats(BatteryUsageStats.Builder batteryUsageStatsBuilder, + BatteryStatsHistory history, long monotonicStartTime, long monotonicEndTime) { synchronized (mPowerStatsAggregator) { boolean hasStoredSpans = false; long maxEndTime = monotonicStartTime; @@ -111,7 +114,7 @@ public class PowerStatsExporter { if (!hasStoredSpans || maxEndTime < monotonicEndTime - mBatterySessionTimeSpanSlackMillis) { - mPowerStatsAggregator.aggregatePowerStats(maxEndTime, monotonicEndTime, + mPowerStatsAggregator.aggregatePowerStats(history, maxEndTime, monotonicEndTime, stats -> populateBatteryUsageStatsBuilder(batteryUsageStatsBuilder, stats)); } mPowerStatsAggregator.reset(); @@ -140,9 +143,7 @@ public class PowerStatsExporter { return; } - PowerStatsLayout layout = new PowerStatsLayout(); - layout.fromExtras(descriptor.extras); - + PowerStatsLayout layout = new PowerStatsLayout(descriptor); long[] deviceStats = new long[descriptor.statsArrayLength]; for (int screenState = 0; screenState < BatteryConsumer.SCREEN_STATE_COUNT; screenState++) { if (batteryUsageStatsBuilder.isScreenStateDataNeeded()) { @@ -328,8 +329,8 @@ public class PowerStatsExporter { BatteryConsumer.Key key = getKeyForPartialTotal(batteryUsageStatsBuilder, allAppsScope, powerComponentId, screenState, powerState); if (key != null) { - allAppsScope.addConsumedPower(key, powerAllApps, - BatteryConsumer.POWER_MODEL_UNDEFINED); + allAppsScope.addConsumedPower(key, powerAllApps, + BatteryConsumer.POWER_MODEL_UNDEFINED); } allAppsScope.addConsumedPower(powerComponentId, powerAllApps, BatteryConsumer.POWER_MODEL_UNDEFINED); @@ -393,7 +394,7 @@ public class PowerStatsExporter { return true; } - void setPowerComponentEnabled(int powerComponentId, boolean enabled) { + public void setPowerComponentEnabled(int powerComponentId, boolean enabled) { mPowerStatsAggregator.setPowerComponentEnabled(powerComponentId, enabled); } } diff --git a/services/core/java/com/android/server/power/stats/PowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/PowerStatsProcessor.java index 6a8c6b124674..838fc628ce95 100644 --- a/services/core/java/com/android/server/power/stats/PowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/PowerStatsProcessor.java @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; -import static com.android.server.power.stats.MultiStateStats.STATE_DOES_NOT_EXIST; -import static com.android.server.power.stats.MultiStateStats.States.findTrackedStateByName; +import static com.android.server.power.stats.processor.MultiStateStats.STATE_DOES_NOT_EXIST; +import static com.android.server.power.stats.processor.MultiStateStats.States.findTrackedStateByName; import android.annotation.NonNull; import android.annotation.Nullable; @@ -43,7 +43,7 @@ import java.util.List; * 2. For each UID, compute the proportion of the combined estimates in each state * and attribute the corresponding portion of the total power estimate in that state to the UID. */ -public abstract class PowerStatsProcessor { +abstract class PowerStatsProcessor { private static final String TAG = "PowerStatsProcessor"; private static final double MILLIAMPHOUR_PER_MICROCOULOMB = 1.0 / 1000.0 / 60.0 / 60.0; diff --git a/services/core/java/com/android/server/power/stats/ScreenPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/ScreenPowerStatsProcessor.java index 8fb1fd6aedd3..b295e309d4fb 100644 --- a/services/core/java/com/android/server/power/stats/ScreenPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/ScreenPowerStatsProcessor.java @@ -14,28 +14,30 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static android.os.BatteryConsumer.PROCESS_STATE_UNSPECIFIED; import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_AMBIENT; import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_SCREEN_FULL; import static com.android.internal.os.PowerProfile.POWER_GROUP_DISPLAY_SCREEN_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import android.os.BatteryStats; import android.util.Slog; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.UsageBasedPowerEstimator; +import com.android.server.power.stats.format.ScreenPowerStatsLayout; import java.util.ArrayList; import java.util.List; -public class ScreenPowerStatsProcessor extends PowerStatsProcessor { +class ScreenPowerStatsProcessor extends PowerStatsProcessor { private static final String TAG = "ScreenPowerStatsProcessor"; private final int mDisplayCount; private final UsageBasedPowerEstimator[] mScreenOnPowerEstimators; @@ -51,7 +53,7 @@ public class ScreenPowerStatsProcessor extends PowerStatsProcessor { public double power; } - public ScreenPowerStatsProcessor(PowerProfile powerProfile) { + ScreenPowerStatsProcessor(PowerProfile powerProfile) { mDisplayCount = powerProfile.getNumDisplays(); mScreenOnPowerEstimators = new UsageBasedPowerEstimator[mDisplayCount]; mScreenDozePowerEstimators = new UsageBasedPowerEstimator[mDisplayCount]; diff --git a/services/core/java/com/android/server/power/stats/SensorPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/SensorPowerStatsProcessor.java index 79d807679970..67013ea65aa3 100644 --- a/services/core/java/com/android/server/power/stats/SensorPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/SensorPowerStatsProcessor.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.hardware.Sensor; import android.hardware.SensorManager; @@ -25,14 +25,16 @@ import android.util.Slog; import android.util.SparseArray; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.PowerStatsLayout; +import com.android.server.power.stats.format.SensorPowerStatsLayout; import java.util.ArrayList; import java.util.Arrays; -import java.util.Comparator; import java.util.List; import java.util.function.Supplier; +import java.util.stream.Collectors; -public class SensorPowerStatsProcessor extends PowerStatsProcessor { +class SensorPowerStatsProcessor extends PowerStatsProcessor { private static final String TAG = "SensorPowerStatsProcessor"; private static final String ANDROID_SENSOR_TYPE_PREFIX = "android.sensor."; @@ -64,7 +66,7 @@ public class SensorPowerStatsProcessor extends PowerStatsProcessor { private long[] mTmpDeviceStatsArray; private long[] mTmpUidStatsArray; - public SensorPowerStatsProcessor(Supplier<SensorManager> sensorManagerSupplier) { + SensorPowerStatsProcessor(Supplier<SensorManager> sensorManagerSupplier) { mSensorManagerSupplier = sensorManagerSupplier; } @@ -78,16 +80,9 @@ public class SensorPowerStatsProcessor extends PowerStatsProcessor { return false; } - mStatsLayout = new SensorPowerStatsLayout(); - List<Sensor> sensorList = new ArrayList<>(mSensorManager.getSensorList(Sensor.TYPE_ALL)); - sensorList.sort(Comparator.comparingInt(Sensor::getId)); - for (int i = 0; i < sensorList.size(); i++) { - Sensor sensor = sensorList.get(i); - String label = makeLabel(sensor, sensorList); - mStatsLayout.addUidSensorSection(sensor.getHandle(), label); - } - mStatsLayout.addUidSectionPowerEstimate(); - mStatsLayout.addDeviceSectionPowerEstimate(); + List<Sensor> sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL); + mStatsLayout = new SensorPowerStatsLayout(sensorList.stream().collect( + Collectors.toMap(Sensor::getHandle, sensor -> makeLabel(sensor, sensorList)))); PersistableBundle extras = new PersistableBundle(); mStatsLayout.toExtras(extras); @@ -231,7 +226,8 @@ public class SensorPowerStatsProcessor extends PowerStatsProcessor { sensorState.startTime = time; } - private void flushPowerStats(PowerComponentAggregatedPowerStats stats, long timestamp) { + private void flushPowerStats( + PowerComponentAggregatedPowerStats stats, long timestamp) { mPowerStats.durationMs = timestamp - mLastUpdateTimestamp; stats.addProcessedPowerStats(mPowerStats, timestamp); @@ -240,7 +236,8 @@ public class SensorPowerStatsProcessor extends PowerStatsProcessor { mLastUpdateTimestamp = timestamp; } - private void computeUidPowerEstimates(PowerComponentAggregatedPowerStats stats, + private void computeUidPowerEstimates( + PowerComponentAggregatedPowerStats stats, List<Integer> uids) { List<Sensor> sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL); int[] uidSensorDurationPositions = new int[sensorList.size()]; @@ -292,7 +289,8 @@ public class SensorPowerStatsProcessor extends PowerStatsProcessor { } } - private void computeDevicePowerEstimates(PowerComponentAggregatedPowerStats stats) { + private void computeDevicePowerEstimates( + PowerComponentAggregatedPowerStats stats) { for (int i = mPlan.combinedDeviceStateEstimations.size() - 1; i >= 0; i--) { CombinedDeviceStateEstimate estimation = mPlan.combinedDeviceStateEstimations.get(i); diff --git a/services/core/java/com/android/server/power/stats/VideoPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/VideoPowerStatsProcessor.java index 48dac8a8a970..a6c380725fa5 100644 --- a/services/core/java/com/android/server/power/stats/VideoPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/VideoPowerStatsProcessor.java @@ -14,16 +14,16 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.os.BatteryConsumer; import android.os.BatteryStats; import com.android.internal.os.PowerProfile; +import com.android.server.power.stats.PowerStatsUidResolver; -public class VideoPowerStatsProcessor extends BinaryStatePowerStatsProcessor { - public VideoPowerStatsProcessor(PowerProfile powerProfile, - PowerStatsUidResolver uidResolver) { +class VideoPowerStatsProcessor extends BinaryStatePowerStatsProcessor { + VideoPowerStatsProcessor(PowerProfile powerProfile, PowerStatsUidResolver uidResolver) { super(BatteryConsumer.POWER_COMPONENT_VIDEO, uidResolver, powerProfile.getAveragePower(PowerProfile.POWER_VIDEO)); } diff --git a/services/core/java/com/android/server/power/stats/WifiPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/WifiPowerStatsProcessor.java index 4e035c31f3c5..0df01cf7e5d1 100644 --- a/services/core/java/com/android/server/power/stats/WifiPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/WifiPowerStatsProcessor.java @@ -14,18 +14,20 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import android.util.Slog; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.UsageBasedPowerEstimator; +import com.android.server.power.stats.format.WifiPowerStatsLayout; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -public class WifiPowerStatsProcessor extends PowerStatsProcessor { +class WifiPowerStatsProcessor extends PowerStatsProcessor { private static final String TAG = "WifiPowerStatsProcessor"; private static final boolean DEBUG = false; @@ -46,7 +48,7 @@ public class WifiPowerStatsProcessor extends PowerStatsProcessor { private long[] mTmpUidStatsArray; private boolean mHasWifiPowerController; - public WifiPowerStatsProcessor(PowerProfile powerProfile) { + WifiPowerStatsProcessor(PowerProfile powerProfile) { mRxPowerEstimator = new UsageBasedPowerEstimator( powerProfile.getAveragePower(PowerProfile.POWER_WIFI_CONTROLLER_RX)); mTxPowerEstimator = new UsageBasedPowerEstimator( diff --git a/services/tests/powerstatstests/Android.bp b/services/tests/powerstatstests/Android.bp index b2a5b02c49e1..91c62be3d88a 100644 --- a/services/tests/powerstatstests/Android.bp +++ b/services/tests/powerstatstests/Android.bp @@ -71,6 +71,8 @@ android_ravenwood_test { ], srcs: [ "src/com/android/server/power/stats/*.java", + "src/com/android/server/power/stats/format/*.java", + "src/com/android/server/power/stats/processor/*.java", ], java_resources: [ "res/xml/power_profile*.xml", 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 a1101cd0f0bc..1d20538724a8 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 @@ -117,7 +117,7 @@ public class BatteryStatsImplTest { private PowerStatsStore mPowerStatsStore; private BatteryUsageStatsProvider mBatteryUsageStatsProvider; @Mock - private PowerStatsExporter mPowerStatsExporter; + private PowerAttributor mPowerAttributor; @Before public void setUp() throws IOException { @@ -149,9 +149,8 @@ public class BatteryStatsImplTest { } else { context = InstrumentationRegistry.getContext(); } - mPowerStatsStore = new PowerStatsStore(systemDir, mHandler, - new AggregatedPowerStatsConfig()); - mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context, mPowerStatsExporter, + mPowerStatsStore = new PowerStatsStore(systemDir, mHandler); + mBatteryUsageStatsProvider = new BatteryUsageStatsProvider(context, mPowerAttributor, mPowerProfile, mBatteryStatsImpl.getCpuScalingPolicies(), mPowerStatsStore, mMockClock); } 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 17c7efa94869..fde84e967c98 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 @@ -94,8 +94,9 @@ public class BatteryUsageStatsProviderTest { public void test_getBatteryUsageStats() { BatteryStatsImpl batteryStats = prepareBatteryStats(); - BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, null, - mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), null, mMockClock); + BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, + mock(PowerAttributor.class), mStatsRule.getPowerProfile(), + mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), mMockClock); final BatteryUsageStats batteryUsageStats = provider.getBatteryUsageStats(batteryStats, BatteryUsageStatsQuery.DEFAULT); @@ -130,8 +131,9 @@ public class BatteryUsageStatsProviderTest { public void test_selectPowerComponents() { BatteryStatsImpl batteryStats = prepareBatteryStats(); - BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, null, - mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), null, mMockClock); + BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, + mock(PowerAttributor.class), mStatsRule.getPowerProfile(), + mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), mMockClock); final BatteryUsageStats batteryUsageStats = provider.getBatteryUsageStats(batteryStats, @@ -235,8 +237,9 @@ public class BatteryUsageStatsProviderTest { batteryStats.noteAlarmFinishLocked("foo", null, APP_UID, 3_001_000, 2_001_000); } - BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, null, - mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), null, mMockClock); + BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, + mock(PowerAttributor.class), mStatsRule.getPowerProfile(), + mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), mMockClock); final BatteryUsageStats batteryUsageStats = provider.getBatteryUsageStats(batteryStats, @@ -323,8 +326,9 @@ public class BatteryUsageStatsProviderTest { } } - BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, null, - mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), null, mMockClock); + BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, + mock(PowerAttributor.class), mStatsRule.getPowerProfile(), + mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), mMockClock); final BatteryUsageStats batteryUsageStats = provider.getBatteryUsageStats(batteryStats, @@ -408,12 +412,12 @@ public class BatteryUsageStatsProviderTest { PowerStatsStore powerStatsStore = new PowerStatsStore( new File(mStatsRule.getHistoryDir(), "powerstatsstore"), - mStatsRule.getHandler(), null); + mStatsRule.getHandler()); powerStatsStore.reset(); - BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, null, - mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), powerStatsStore, - mMockClock); + BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, + mock(PowerAttributor.class), mStatsRule.getPowerProfile(), + mStatsRule.getCpuScalingPolicies(), powerStatsStore, mMockClock); batteryStats.saveBatteryUsageStatsOnReset(provider, powerStatsStore); synchronized (batteryStats) { @@ -522,8 +526,9 @@ public class BatteryUsageStatsProviderTest { batteryStats.updateCustomEnergyConsumerStatsLocked(1, 200_000_000, uidEnergies); } - BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, null, - mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), null, mMockClock); + BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, + mock(PowerAttributor.class), mStatsRule.getPowerProfile(), + mStatsRule.getCpuScalingPolicies(), mock(PowerStatsStore.class), mMockClock); PowerStatsStore powerStatsStore = mock(PowerStatsStore.class); doAnswer(invocation -> { @@ -584,9 +589,9 @@ public class BatteryUsageStatsProviderTest { when(powerStatsStore.loadPowerStatsSpan(1, BatteryUsageStatsSection.TYPE)) .thenReturn(span1); - BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, null, - mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), powerStatsStore, - mMockClock); + BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, + mock(PowerAttributor.class), mStatsRule.getPowerProfile(), + mStatsRule.getCpuScalingPolicies(), powerStatsStore, mMockClock); BatteryUsageStatsQuery query = new BatteryUsageStatsQuery.Builder() .aggregateSnapshots(0, 3000) diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BluetoothPowerStatsCollectorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BluetoothPowerStatsCollectorTest.java index 02c7b745b24c..cfcbfca71b3b 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BluetoothPowerStatsCollectorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BluetoothPowerStatsCollectorTest.java @@ -37,6 +37,7 @@ import android.util.SparseLongArray; import com.android.internal.os.Clock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.BluetoothPowerStatsLayout; import org.junit.Before; import org.junit.Rule; diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/CpuPowerStatsCollectorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/CpuPowerStatsCollectorTest.java index d1105a4a9077..d995227cfec3 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/CpuPowerStatsCollectorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/CpuPowerStatsCollectorTest.java @@ -42,6 +42,7 @@ import com.android.internal.os.Clock; import com.android.internal.os.CpuScalingPolicies; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.CpuPowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -228,9 +229,7 @@ public class CpuPowerStatsCollectorTest { assertThat(descriptor.name).isEqualTo("cpu"); assertThat(descriptor.statsArrayLength).isEqualTo(13); assertThat(descriptor.uidStatsArrayLength).isEqualTo(5); - CpuPowerStatsLayout layout = - new CpuPowerStatsLayout(); - layout.fromExtras(descriptor.extras); + CpuPowerStatsLayout layout = new CpuPowerStatsLayout(descriptor); long[] deviceStats = new long[descriptor.statsArrayLength]; layout.setTimeByScalingStep(deviceStats, 2, 42); @@ -267,8 +266,7 @@ public class CpuPowerStatsCollectorTest { mockEnergyConsumers(); CpuPowerStatsCollector collector = createCollector(8, 0); - CpuPowerStatsLayout layout = new CpuPowerStatsLayout(); - layout.fromExtras(collector.getPowerStatsDescriptor().extras); + CpuPowerStatsLayout layout = new CpuPowerStatsLayout(collector.getPowerStatsDescriptor()); mockKernelCpuStats(new long[]{1111, 2222, 3333}, new SparseArray<>() {{ @@ -338,8 +336,7 @@ public class CpuPowerStatsCollectorTest { mockEnergyConsumers(); CpuPowerStatsCollector collector = createCollector(8, 0); - CpuPowerStatsLayout layout = new CpuPowerStatsLayout(); - layout.fromExtras(collector.getPowerStatsDescriptor().extras); + CpuPowerStatsLayout layout = new CpuPowerStatsLayout(collector.getPowerStatsDescriptor()); mockKernelCpuStats(new long[]{1111, 2222, 3333}, new SparseArray<>() {{ @@ -470,9 +467,7 @@ public class CpuPowerStatsCollectorTest { } private static int[] getScalingStepToPowerBracketMap(CpuPowerStatsCollector collector) { - CpuPowerStatsLayout layout = - new CpuPowerStatsLayout(); - layout.fromExtras(collector.getPowerStatsDescriptor().extras); + CpuPowerStatsLayout layout = new CpuPowerStatsLayout(collector.getPowerStatsDescriptor()); return layout.getScalingStepToPowerBracketMap(); } diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/MobileRadioPowerStatsCollectorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/MobileRadioPowerStatsCollectorTest.java index ef209463c0d1..2e4f32b45c4a 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/MobileRadioPowerStatsCollectorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/MobileRadioPowerStatsCollectorTest.java @@ -51,6 +51,7 @@ import android.util.IndentingPrintWriter; import com.android.internal.os.Clock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.MobileRadioPowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -242,8 +243,7 @@ public class MobileRadioPowerStatsCollectorTest { assertThat(powerStats.durationMs).isEqualTo(100); PowerStats.Descriptor descriptor = powerStats.descriptor; - MobileRadioPowerStatsLayout layout = - new MobileRadioPowerStatsLayout(descriptor); + MobileRadioPowerStatsLayout layout = new MobileRadioPowerStatsLayout(descriptor); assertThat(layout.getDeviceSleepTime(powerStats.stats)).isEqualTo(200); assertThat(layout.getDeviceIdleTime(powerStats.stats)).isEqualTo(300); assertThat(layout.getDeviceCallTime(powerStats.stats)).isEqualTo(40000); @@ -252,7 +252,7 @@ public class MobileRadioPowerStatsCollectorTest { .isEqualTo((64321 - 10000) * 1000 / 3500); assertThat(powerStats.stateStats.size()).isEqualTo(2); - long[] state1 = powerStats.stateStats.get(MobileRadioPowerStatsCollector.makeStateKey( + long[] state1 = powerStats.stateStats.get(MobileRadioPowerStatsLayout.makeStateKey( BatteryStats.RADIO_ACCESS_TECHNOLOGY_NR, ServiceState.FREQUENCY_RANGE_MMWAVE )); @@ -263,7 +263,7 @@ public class MobileRadioPowerStatsCollectorTest { assertThat(layout.getStateTxTime(state1, 3)).isEqualTo(4000); assertThat(layout.getStateTxTime(state1, 4)).isEqualTo(5000); - long[] state2 = powerStats.stateStats.get(MobileRadioPowerStatsCollector.makeStateKey( + long[] state2 = powerStats.stateStats.get(MobileRadioPowerStatsLayout.makeStateKey( BatteryStats.RADIO_ACCESS_TECHNOLOGY_LTE, ServiceState.FREQUENCY_RANGE_LOW )); @@ -298,15 +298,14 @@ public class MobileRadioPowerStatsCollectorTest { assertThat(powerStats.durationMs).isEqualTo(100); PowerStats.Descriptor descriptor = powerStats.descriptor; - MobileRadioPowerStatsLayout layout = - new MobileRadioPowerStatsLayout(descriptor); + MobileRadioPowerStatsLayout layout = new MobileRadioPowerStatsLayout(descriptor); assertThat(layout.getDeviceSleepTime(powerStats.stats)).isEqualTo(200); assertThat(layout.getDeviceIdleTime(powerStats.stats)).isEqualTo(300); assertThat(layout.getConsumedEnergy(powerStats.stats, 0)) .isEqualTo((64321 - 10000) * 1000 / 3500); assertThat(powerStats.stateStats.size()).isEqualTo(1); - long[] stateStats = powerStats.stateStats.get(MobileRadioPowerStatsCollector.makeStateKey( + long[] stateStats = powerStats.stateStats.get(MobileRadioPowerStatsLayout.makeStateKey( AccessNetworkConstants.AccessNetworkType.UNKNOWN, ServiceState.FREQUENCY_RANGE_UNKNOWN )); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsSchedulerTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsSchedulerTest.java index beec66156fe4..143d046add32 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsSchedulerTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsSchedulerTest.java @@ -18,36 +18,18 @@ package com.android.server.power.stats; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import android.os.ConditionVariable; -import android.os.Handler; -import android.os.HandlerThread; import android.platform.test.ravenwood.RavenwoodRule; import androidx.test.runner.AndroidJUnit4; -import com.android.internal.os.MonotonicClock; - -import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; -import java.io.IOException; -import java.nio.file.Files; import java.time.Duration; import java.time.Instant; -import java.util.ArrayList; -import java.util.List; import java.util.TimeZone; import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; @RunWith(AndroidJUnit4.class) public class PowerStatsSchedulerTest { @@ -56,134 +38,10 @@ public class PowerStatsSchedulerTest { .setProvideMainThread(true) .build(); - private PowerStatsStore mPowerStatsStore; - private Handler mHandler; - private MockClock mClock = new MockClock(); - private MonotonicClock mMonotonicClock = new MonotonicClock(0, mClock); - private PowerStatsScheduler mPowerStatsScheduler; - private PowerStatsAggregator mPowerStatsAggregator; - private AggregatedPowerStatsConfig mAggregatedPowerStatsConfig; - private List<Long> mScheduledAlarms = new ArrayList<>(); - private boolean mPowerStatsCollectionOccurred; - - private static final int START_REALTIME = 7654321; - - @Before - @SuppressWarnings("GuardedBy") - public void setup() throws IOException { - TimeZone.setDefault(TimeZone.getTimeZone("UTC")); - - mClock.currentTime = Instant.parse("2023-01-02T03:04:05.00Z").toEpochMilli(); - mClock.realtime = START_REALTIME; - - HandlerThread bgThread = new HandlerThread("bg thread"); - bgThread.start(); - mHandler = new Handler(bgThread.getLooper()); - mAggregatedPowerStatsConfig = new AggregatedPowerStatsConfig(); - mPowerStatsStore = new PowerStatsStore( - Files.createTempDirectory("PowerStatsSchedulerTest").toFile(), - mHandler, mAggregatedPowerStatsConfig); - mPowerStatsAggregator = mock(PowerStatsAggregator.class); - mPowerStatsScheduler = new PowerStatsScheduler( - () -> mPowerStatsCollectionOccurred = true, - mPowerStatsAggregator, TimeUnit.MINUTES.toMillis(30), TimeUnit.HOURS.toMillis(1), - mPowerStatsStore, - ((triggerAtMillis, tag, onAlarmListener, handler) -> - mScheduledAlarms.add(triggerAtMillis)), - mClock, mMonotonicClock, () -> 12345L, mHandler); - } - - @Test - @SuppressWarnings("unchecked") - public void storeAggregatePowerStats() { - mPowerStatsStore.reset(); - - assertThat(mPowerStatsStore.getTableOfContents()).isEmpty(); - - mPowerStatsStore.storeAggregatedPowerStats( - createAggregatedPowerStats(mMonotonicClock.monotonicTime(), mClock.currentTime, - 123)); - - long delayBeforeAggregating = TimeUnit.MINUTES.toMillis(90); - mClock.realtime += delayBeforeAggregating; - mClock.currentTime += delayBeforeAggregating; - - doAnswer(invocation -> { - // The first span is longer than 30 min, because the end time is being aligned with - // the wall clock. Subsequent spans should be precisely 30 minutes. - long startTime = invocation.getArgument(0); - long endTime = invocation.getArgument(1); - Consumer<AggregatedPowerStats> consumer = invocation.getArgument(2); - - long startTimeWallClock = - mClock.currentTime - (mMonotonicClock.monotonicTime() - startTime); - long endTimeWallClock = - mClock.currentTime - (mMonotonicClock.monotonicTime() - endTime); - - assertThat(startTime).isEqualTo(START_REALTIME + 123); - assertThat(endTime - startTime).isAtLeast(TimeUnit.MINUTES.toMillis(30)); - assertThat(Instant.ofEpochMilli(endTimeWallClock)) - .isEqualTo(Instant.parse("2023-01-02T04:00:00Z")); - - consumer.accept( - createAggregatedPowerStats(startTime, startTimeWallClock, endTime - startTime)); - return null; - }).doAnswer(invocation -> { - long startTime = invocation.getArgument(0); - long endTime = invocation.getArgument(1); - Consumer<AggregatedPowerStats> consumer = invocation.getArgument(2); - - long startTimeWallClock = - mClock.currentTime - (mMonotonicClock.monotonicTime() - startTime); - long endTimeWallClock = - mClock.currentTime - (mMonotonicClock.monotonicTime() - endTime); - - assertThat(Instant.ofEpochMilli(startTimeWallClock)) - .isEqualTo(Instant.parse("2023-01-02T04:00:00Z")); - assertThat(Instant.ofEpochMilli(endTimeWallClock)) - .isEqualTo(Instant.parse("2023-01-02T04:30:00Z")); - - consumer.accept( - createAggregatedPowerStats(startTime, startTimeWallClock, endTime - startTime)); - return null; - }).when(mPowerStatsAggregator).aggregatePowerStats(anyLong(), anyLong(), - any(Consumer.class)); - - mPowerStatsScheduler.start(/*enabled*/ true); - ConditionVariable done = new ConditionVariable(); - mHandler.post(done::open); - done.block(); - - assertThat(mPowerStatsCollectionOccurred).isTrue(); - assertThat(mScheduledAlarms).containsExactly( - START_REALTIME + TimeUnit.MINUTES.toMillis(90) + TimeUnit.HOURS.toMillis(1)); - - verify(mPowerStatsAggregator, times(2)) - .aggregatePowerStats(anyLong(), anyLong(), any(Consumer.class)); - - List<PowerStatsSpan.Metadata> contents = mPowerStatsStore.getTableOfContents(); - assertThat(contents).hasSize(3); - // Skip the first entry, which was placed in the store at the beginning of this test - PowerStatsSpan.TimeFrame timeFrame1 = contents.get(1).getTimeFrames().get(0); - PowerStatsSpan.TimeFrame timeFrame2 = contents.get(2).getTimeFrames().get(0); - assertThat(timeFrame1.startMonotonicTime).isEqualTo(START_REALTIME + 123); - assertThat(timeFrame2.startMonotonicTime) - .isEqualTo(timeFrame1.startMonotonicTime + timeFrame1.duration); - assertThat(Instant.ofEpochMilli(timeFrame2.startTime)) - .isEqualTo(Instant.parse("2023-01-02T04:00:00Z")); - assertThat(Duration.ofMillis(timeFrame2.duration)).isEqualTo(Duration.ofMinutes(30)); - } - - private AggregatedPowerStats createAggregatedPowerStats(long monotonicTime, long currentTime, - long duration) { - AggregatedPowerStats stats = new AggregatedPowerStats(mAggregatedPowerStatsConfig); - stats.addClockUpdate(monotonicTime, currentTime); - stats.setDuration(duration); - return stats; - } - @Test public void alignToWallClock() { + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + // Expect the aligned value to be adjusted by 1 min 30 sec - rounded to the next 15 min assertThat(PowerStatsScheduler.alignToWallClock(123, TimeUnit.MINUTES.toMillis(15), 123 + TimeUnit.HOURS.toMillis(2), diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsStoreTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsStoreTest.java index 36d7af500ac3..dc8d92032b57 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsStoreTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsStoreTest.java @@ -59,14 +59,7 @@ public class PowerStatsStoreTest { clearDirectory(mStoreDirectory); mPowerStatsStore = new PowerStatsStore(mStoreDirectory, - MAX_BATTERY_STATS_SNAPSHOT_STORAGE_BYTES, - new TestHandler(), - (sectionType, parser) -> { - if (sectionType.equals(TestSection.TYPE)) { - return TestSection.readXml(parser); - } - return null; - }); + MAX_BATTERY_STATS_SNAPSHOT_STORAGE_BYTES, new TestHandler()); } @Test @@ -144,7 +137,7 @@ public class PowerStatsStoreTest { } @Override - void write(TypedXmlSerializer serializer) throws IOException { + public void write(TypedXmlSerializer serializer) throws IOException { StringBuilder sb = new StringBuilder(); for (int i = 0; i < mSize; i++) { sb.append("X"); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/ScreenPowerStatsCollectorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/ScreenPowerStatsCollectorTest.java index 817fdcb10577..8fd3f4dd00a1 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/ScreenPowerStatsCollectorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/ScreenPowerStatsCollectorTest.java @@ -32,6 +32,7 @@ import android.platform.test.ravenwood.RavenwoodRule; import com.android.internal.os.Clock; import com.android.internal.os.PowerStats; import com.android.server.power.stats.ScreenPowerStatsCollector.Injector; +import com.android.server.power.stats.format.ScreenPowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -171,8 +172,7 @@ public class ScreenPowerStatsCollectorTest { PowerStats powerStats = collector.collectStats(); - ScreenPowerStatsLayout layout = new ScreenPowerStatsLayout(); - layout.fromExtras(powerStats.descriptor.extras); + ScreenPowerStatsLayout layout = new ScreenPowerStatsLayout(powerStats.descriptor); // (45000 - 10000) / 3500 assertThat(layout.getConsumedEnergy(powerStats.stats, 0)) diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsCollectorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsCollectorTest.java index b13fc530399b..f887d83f9f60 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsCollectorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsCollectorTest.java @@ -47,6 +47,7 @@ import android.util.SparseArray; import com.android.internal.os.Clock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.format.WifiPowerStatsLayout; import org.junit.Before; import org.junit.Rule; diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/AggregatedPowerStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/AggregatedPowerStatsTest.java index 04d53dec2a09..0e73329dcfe5 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/AggregatedPowerStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/AggregatedPowerStatsTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static com.google.common.truth.Truth.assertThat; @@ -49,7 +49,8 @@ public class AggregatedPowerStatsTest { private static final int COMPONENT_STATE_1 = 1; private static final int COMPONENT_STATE_2 = 2; - private AggregatedPowerStatsConfig mAggregatedPowerStatsConfig; + private AggregatedPowerStatsConfig + mAggregatedPowerStatsConfig; private PowerStats.Descriptor mPowerComponentDescriptor; @Before @@ -67,7 +68,8 @@ public class AggregatedPowerStatsTest { mAggregatedPowerStatsConfig.trackCustomPowerComponents( () -> new PowerStatsProcessor() { @Override - void finish(PowerComponentAggregatedPowerStats stats, + void finish( + PowerComponentAggregatedPowerStats stats, long timestampMs) { } }) @@ -103,8 +105,8 @@ public class AggregatedPowerStatsTest { TypedXmlPullParser parser = Xml.newFastPullParser(); parser.setInput(new ByteArrayInputStream(baos.toByteArray()), "UTF-8"); - AggregatedPowerStats actualStats = AggregatedPowerStats.createFromXml(parser, - mAggregatedPowerStatsConfig); + AggregatedPowerStats actualStats = + AggregatedPowerStats.createFromXml(parser, mAggregatedPowerStatsConfig); verifyAggregatedPowerStats(actualStats); } @@ -163,7 +165,8 @@ public class AggregatedPowerStatsTest { return stats; } - private void verifyAggregatedPowerStats(AggregatedPowerStats stats) { + private void verifyAggregatedPowerStats( + AggregatedPowerStats stats) { PowerStats.Descriptor descriptor = stats.getPowerComponentStats(TEST_POWER_COMPONENT) .getPowerStatsDescriptor(); assertThat(descriptor.powerComponentId).isEqualTo(TEST_POWER_COMPONENT); @@ -277,7 +280,8 @@ public class AggregatedPowerStatsTest { .isEqualTo(new long[]{250, 300}); } - private static long[] getDeviceStats(AggregatedPowerStats stats, int powerComponentId, + private static long[] getDeviceStats( + AggregatedPowerStats stats, int powerComponentId, int... states) { PowerComponentAggregatedPowerStats powerComponentStats = stats.getPowerComponentStats(powerComponentId); @@ -286,7 +290,8 @@ public class AggregatedPowerStatsTest { return out; } - private static long[] getStateStats(AggregatedPowerStats stats, int key, int... states) { + private static long[] getStateStats( + AggregatedPowerStats stats, int key, int... states) { PowerComponentAggregatedPowerStats powerComponentStats = stats.getPowerComponentStats(TEST_POWER_COMPONENT); long[] out = new long[powerComponentStats.getPowerStatsDescriptor().stateStatsArrayLength]; @@ -294,7 +299,8 @@ public class AggregatedPowerStatsTest { return out; } - private static long[] getUidDeviceStats(AggregatedPowerStats stats, int powerComponentId, + private static long[] getUidDeviceStats( + AggregatedPowerStats stats, int powerComponentId, int uid, int... states) { PowerComponentAggregatedPowerStats powerComponentStats = stats.getPowerComponentStats(powerComponentId); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/AmbientDisplayPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessorTest.java index a2a7e00a39b4..6477b26b90e8 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/AmbientDisplayPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessorTest.java @@ -14,14 +14,14 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_BATTERY; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_BATTERY; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; @@ -35,7 +35,12 @@ import android.platform.test.ravenwood.RavenwoodRule; import com.android.internal.os.Clock; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; -import com.android.server.power.stats.ScreenPowerStatsCollector.Injector; +import com.android.server.power.stats.BatteryUsageStatsRule; +import com.android.server.power.stats.PowerStatsCollector; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.ScreenPowerStatsCollector; +import com.android.server.power.stats.ScreenPowerStatsCollector.ScreenUsageTimeRetriever; +import com.android.server.power.stats.format.PowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -64,49 +69,50 @@ public class AmbientDisplayPowerStatsProcessorTest { @Mock private PowerStatsCollector.ConsumedEnergyRetriever mConsumedEnergyRetriever; @Mock - private ScreenPowerStatsCollector.ScreenUsageTimeRetriever mScreenUsageTimeRetriever; - - private final Injector mInjector = new Injector() { - @Override - public Handler getHandler() { - return mStatsRule.getHandler(); - } - - @Override - public Clock getClock() { - return mStatsRule.getMockClock(); - } - - @Override - public PowerStatsUidResolver getUidResolver() { - return new PowerStatsUidResolver(); - } - - @Override - public long getPowerStatsCollectionThrottlePeriod(String powerComponentName) { - return 0; - } - - @Override - public PowerStatsCollector.ConsumedEnergyRetriever getConsumedEnergyRetriever() { - return mConsumedEnergyRetriever; - } - - @Override - public IntSupplier getVoltageSupplier() { - return () -> VOLTAGE_MV; - } - - @Override - public int getDisplayCount() { - return 2; - } - - @Override - public ScreenPowerStatsCollector.ScreenUsageTimeRetriever getScreenUsageTimeRetriever() { - return mScreenUsageTimeRetriever; - } - }; + private ScreenUsageTimeRetriever mScreenUsageTimeRetriever; + + private final ScreenPowerStatsCollector.Injector mInjector = + new ScreenPowerStatsCollector.Injector() { + @Override + public Handler getHandler() { + return mStatsRule.getHandler(); + } + + @Override + public Clock getClock() { + return mStatsRule.getMockClock(); + } + + @Override + public PowerStatsUidResolver getUidResolver() { + return new PowerStatsUidResolver(); + } + + @Override + public long getPowerStatsCollectionThrottlePeriod(String powerComponentName) { + return 0; + } + + @Override + public PowerStatsCollector.ConsumedEnergyRetriever getConsumedEnergyRetriever() { + return mConsumedEnergyRetriever; + } + + @Override + public IntSupplier getVoltageSupplier() { + return () -> VOLTAGE_MV; + } + + @Override + public int getDisplayCount() { + return 2; + } + + @Override + public ScreenUsageTimeRetriever getScreenUsageTimeRetriever() { + return mScreenUsageTimeRetriever; + } + }; @Before public void setup() { @@ -167,7 +173,8 @@ public class AmbientDisplayPowerStatsProcessorTest { return stats.getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_AMBIENT_DISPLAY); } - private void assertPowerEstimate(PowerComponentAggregatedPowerStats aggregatedStats, + private void assertPowerEstimate( + PowerComponentAggregatedPowerStats aggregatedStats, int powerState, int screenState, double expectedPowerEstimate) { PowerStats.Descriptor descriptor = aggregatedStats.getPowerStatsDescriptor(); PowerStatsLayout layout = new PowerStatsLayout(descriptor); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BinaryStatePowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessorTest.java index 4b40f6897c88..b412ad6edbca 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BinaryStatePowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessorTest.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_CACHED; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; @@ -40,6 +40,9 @@ import androidx.annotation.NonNull; import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.MockClock; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.format.BinaryStatePowerStatsLayout; import org.junit.Rule; import org.junit.Test; @@ -146,7 +149,8 @@ public class BinaryStatePowerStatsProcessorTest { @Test public void energyConsumerModel() { - BinaryStatePowerStatsLayout statsLayout = new BinaryStatePowerStatsLayout(); + BinaryStatePowerStatsLayout + statsLayout = new BinaryStatePowerStatsLayout(); PersistableBundle extras = new PersistableBundle(); statsLayout.toExtras(extras); PowerStats.Descriptor descriptor = new PowerStats.Descriptor(POWER_COMPONENT, @@ -270,9 +274,8 @@ public class BinaryStatePowerStatsProcessorTest { .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE) .setProcessorSupplier(processorSupplier); - AggregatedPowerStats aggregatedPowerStats = new AggregatedPowerStats(config); PowerComponentAggregatedPowerStats powerComponentStats = - aggregatedPowerStats.getPowerComponentStats(POWER_COMPONENT); + new AggregatedPowerStats(config).getPowerComponentStats(POWER_COMPONENT); powerComponentStats.start(0); powerComponentStats.setState(STATE_POWER, POWER_STATE_OTHER, 0); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BluetoothPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java index 4a8125f8b4c2..371c6c925b87 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BluetoothPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BluetoothPowerStatsProcessorTest.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_CACHED; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; @@ -48,7 +48,12 @@ import android.util.SparseLongArray; import com.android.internal.os.Clock; import com.android.internal.os.PowerProfile; +import com.android.server.power.stats.BatteryUsageStatsRule; +import com.android.server.power.stats.BluetoothPowerStatsCollector; import com.android.server.power.stats.BluetoothPowerStatsCollector.BluetoothStatsRetriever; +import com.android.server.power.stats.PowerStatsCollector; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.format.BluetoothPowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -468,16 +473,15 @@ public class BluetoothPowerStatsProcessorTest { private static PowerComponentAggregatedPowerStats createAggregatedPowerStats( Supplier<PowerStatsProcessor> processorSupplier) { - AggregatedPowerStatsConfig.PowerComponent config = - new AggregatedPowerStatsConfig.PowerComponent( - BatteryConsumer.POWER_COMPONENT_BLUETOOTH) - .trackDeviceStates(STATE_POWER, STATE_SCREEN) - .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE) - .setProcessorSupplier(processorSupplier); + AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_BLUETOOTH) + .trackDeviceStates(STATE_POWER, STATE_SCREEN) + .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE) + .setProcessorSupplier(processorSupplier); PowerComponentAggregatedPowerStats aggregatedStats = - new PowerComponentAggregatedPowerStats( - new AggregatedPowerStats(mock(AggregatedPowerStatsConfig.class)), config); + new AggregatedPowerStats(config).getPowerComponentStats( + BatteryConsumer.POWER_COMPONENT_BLUETOOTH); aggregatedStats.setState(STATE_POWER, POWER_STATE_OTHER, 0); aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_ON, 0); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/CameraPowerStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CameraPowerStatsTest.java index 88a4f5e7891e..4c60e0af4ba6 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/CameraPowerStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CameraPowerStatsTest.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_CACHED; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; @@ -46,6 +46,12 @@ import com.android.internal.os.Clock; import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.BatteryUsageStatsRule; +import com.android.server.power.stats.CameraPowerStatsCollector; +import com.android.server.power.stats.EnergyConsumerPowerStatsCollector; +import com.android.server.power.stats.PowerStatsCollector; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.format.BinaryStatePowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -161,8 +167,7 @@ public class CameraPowerStatsTest { stats.finish(11_000); PowerStats.Descriptor descriptor = stats.getPowerStatsDescriptor(); - BinaryStatePowerStatsLayout statsLayout = new BinaryStatePowerStatsLayout(); - statsLayout.fromExtras(descriptor.extras); + BinaryStatePowerStatsLayout statsLayout = new BinaryStatePowerStatsLayout(descriptor); // Total estimated power = 3,600,000 uC = 1.0 mAh // of which 3,000,000 is distributed: @@ -243,7 +248,8 @@ public class CameraPowerStatsTest { private static PowerComponentAggregatedPowerStats createAggregatedPowerStats( Supplier<PowerStatsProcessor> processorSupplier) { - AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); + AggregatedPowerStatsConfig + config = new AggregatedPowerStatsConfig(); config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_CAMERA) .trackDeviceStates( AggregatedPowerStatsConfig.STATE_POWER, @@ -254,9 +260,8 @@ public class CameraPowerStatsTest { AggregatedPowerStatsConfig.STATE_PROCESS_STATE) .setProcessorSupplier(processorSupplier); - AggregatedPowerStats aggregatedPowerStats = new AggregatedPowerStats(config); - PowerComponentAggregatedPowerStats powerComponentStats = - aggregatedPowerStats.getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_CAMERA); + PowerComponentAggregatedPowerStats powerComponentStats = new AggregatedPowerStats(config) + .getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_CAMERA); powerComponentStats.start(0); powerComponentStats.setState(STATE_POWER, POWER_STATE_OTHER, 0); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/CpuPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CpuPowerStatsProcessorTest.java index ab2e631453ef..693861539922 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/CpuPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CpuPowerStatsProcessorTest.java @@ -13,24 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_CACHED; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_BATTERY; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_BATTERY; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; -import static org.mockito.Mockito.mock; import android.os.BatteryConsumer; import android.os.PersistableBundle; @@ -42,6 +41,8 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.BatteryUsageStatsRule; +import com.android.server.power.stats.format.CpuPowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -202,26 +203,18 @@ public class CpuPowerStatsProcessorTest { PowerComponentAggregatedPowerStats { private final CpuPowerStatsLayout mStatsLayout; private final PowerStats.Descriptor mDescriptor; - private HashMap<String, long[]> mDeviceStats = new HashMap<>(); - private HashMap<String, long[]> mUidStats = new HashMap<>(); - private HashSet<Integer> mUids = new HashSet<>(); - private HashMap<String, Double> mExpectedDevicePower = new HashMap<>(); - private HashMap<String, Double> mExpectedUidPower = new HashMap<>(); - - MockPowerComponentAggregatedPowerStats(AggregatedPowerStatsConfig.PowerComponent config, + private final HashMap<String, long[]> mDeviceStats = new HashMap<>(); + private final HashMap<String, long[]> mUidStats = new HashMap<>(); + private final HashSet<Integer> mUids = new HashSet<>(); + private final HashMap<String, Double> mExpectedDevicePower = new HashMap<>(); + private final HashMap<String, Double> mExpectedUidPower = new HashMap<>(); + + MockPowerComponentAggregatedPowerStats( + AggregatedPowerStatsConfig.PowerComponent config, boolean useEnergyConsumers) { - super(new AggregatedPowerStats(mock(AggregatedPowerStatsConfig.class)), config); - mStatsLayout = new CpuPowerStatsLayout(); - mStatsLayout.addDeviceSectionCpuTimeByScalingStep(3); - mStatsLayout.addDeviceSectionCpuTimeByCluster(2); - mStatsLayout.addDeviceSectionUsageDuration(); - if (useEnergyConsumers) { - mStatsLayout.addDeviceSectionEnergyConsumers(2); - } - mStatsLayout.addDeviceSectionPowerEstimate(); - mStatsLayout.addUidSectionCpuTimeByPowerBracket(new int[]{0, 1, 2}); - mStatsLayout.addUidSectionPowerEstimate(); - + super(new AggregatedPowerStats(new AggregatedPowerStatsConfig()), config); + mStatsLayout = new CpuPowerStatsLayout(useEnergyConsumers ? 2 : 0, 2, + new int[]{0, 1, 2}); PersistableBundle extras = new PersistableBundle(); mStatsLayout.toExtras(extras); mDescriptor = new PowerStats.Descriptor(BatteryConsumer.POWER_COMPONENT_CPU, diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/CustomEnergyConsumerPowerStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CustomEnergyConsumerPowerStatsTest.java index 8239fdbd04e9..1c03b56614c8 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/CustomEnergyConsumerPowerStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CustomEnergyConsumerPowerStatsTest.java @@ -14,20 +14,20 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_CACHED; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_BATTERY; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_BATTERY; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; @@ -42,6 +42,12 @@ import android.platform.test.ravenwood.RavenwoodRule; import com.android.internal.os.Clock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.BatteryUsageStatsRule; +import com.android.server.power.stats.CustomEnergyConsumerPowerStatsCollector; +import com.android.server.power.stats.EnergyConsumerPowerStatsCollector; +import com.android.server.power.stats.PowerStatsCollector; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.format.EnergyConsumerPowerStatsLayout; import org.junit.Before; import org.junit.Rule; diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/GnssPowerStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/GnssPowerStatsTest.java index f22279a88a50..2440287739bc 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/GnssPowerStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/GnssPowerStatsTest.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_CACHED; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; @@ -47,6 +47,12 @@ import com.android.internal.os.Clock; import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.BatteryUsageStatsRule; +import com.android.server.power.stats.EnergyConsumerPowerStatsCollector; +import com.android.server.power.stats.GnssPowerStatsCollector; +import com.android.server.power.stats.PowerStatsCollector; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.format.BinaryStatePowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -165,8 +171,7 @@ public class GnssPowerStatsTest { stats.finish(START_TIME + 11_000); PowerStats.Descriptor descriptor = stats.getPowerStatsDescriptor(); - BinaryStatePowerStatsLayout statsLayout = new BinaryStatePowerStatsLayout(); - statsLayout.fromExtras(descriptor.extras); + BinaryStatePowerStatsLayout statsLayout = new BinaryStatePowerStatsLayout(descriptor); // scr-on, GNSS-good: 2500 * 100 = 250000 mA-ms = 0.06944 mAh // scr-off GNSS=good: 4500 * 100 = 0.12500 mAh @@ -245,8 +250,7 @@ public class GnssPowerStatsTest { stats.finish(START_TIME + 11_000); PowerStats.Descriptor descriptor = stats.getPowerStatsDescriptor(); - BinaryStatePowerStatsLayout statsLayout = new BinaryStatePowerStatsLayout(); - statsLayout.fromExtras(descriptor.extras); + BinaryStatePowerStatsLayout statsLayout = new BinaryStatePowerStatsLayout(descriptor); // scr-on, GNSS-good: 2500 * 100 = 250000 mA-ms = 0.06944 mAh // scr-off GNSS=good: 4500 * 100 = 0.12500 mAh @@ -339,8 +343,7 @@ public class GnssPowerStatsTest { stats.finish(START_TIME + 11_000); PowerStats.Descriptor descriptor = stats.getPowerStatsDescriptor(); - BinaryStatePowerStatsLayout statsLayout = new BinaryStatePowerStatsLayout(); - statsLayout.fromExtras(descriptor.extras); + BinaryStatePowerStatsLayout statsLayout = new BinaryStatePowerStatsLayout(descriptor); // Total estimated power = 3,600,000 uC = 1.0 mAh // of which 3,000,000 is distributed: @@ -442,7 +445,8 @@ public class GnssPowerStatsTest { private static PowerComponentAggregatedPowerStats createAggregatedPowerStats( Supplier<PowerStatsProcessor> processorSupplier) { - AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); + AggregatedPowerStatsConfig + config = new AggregatedPowerStatsConfig(); config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_GNSS) .trackDeviceStates( AggregatedPowerStatsConfig.STATE_POWER, @@ -453,9 +457,8 @@ public class GnssPowerStatsTest { AggregatedPowerStatsConfig.STATE_PROCESS_STATE) .setProcessorSupplier(processorSupplier); - AggregatedPowerStats aggregatedPowerStats = new AggregatedPowerStats(config); - PowerComponentAggregatedPowerStats powerComponentStats = - aggregatedPowerStats.getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_GNSS); + PowerComponentAggregatedPowerStats powerComponentStats = new AggregatedPowerStats(config) + .getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_GNSS); powerComponentStats.start(START_TIME); powerComponentStats.setState(STATE_POWER, POWER_STATE_OTHER, START_TIME); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/MobileRadioPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java index 89d59a9be14f..33f407444ce0 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/MobileRadioPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MobileRadioPowerStatsProcessorTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static android.net.NetworkStats.DEFAULT_NETWORK_NO; import static android.net.NetworkStats.METERED_NO; @@ -23,12 +23,12 @@ import static android.os.BatteryConsumer.PROCESS_STATE_CACHED; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; @@ -53,6 +53,11 @@ import android.telephony.TelephonyManager; import com.android.internal.os.Clock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.BatteryUsageStatsRule; +import com.android.server.power.stats.MobileRadioPowerStatsCollector; +import com.android.server.power.stats.PowerStatsCollector; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.format.MobileRadioPowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -172,17 +177,15 @@ public class MobileRadioPowerStatsProcessorTest { mStatsRule.setTestPowerProfile("power_profile_test_modem_calculator"); - AggregatedPowerStatsConfig.PowerComponent config = - new AggregatedPowerStatsConfig.PowerComponent( - BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) - .trackDeviceStates(STATE_POWER, STATE_SCREEN) - .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE) - .setProcessorSupplier(() -> new MobileRadioPowerStatsProcessor( - mStatsRule.getPowerProfile())); + AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) + .trackDeviceStates(STATE_POWER, STATE_SCREEN) + .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE) + .setProcessorSupplier( + () -> new MobileRadioPowerStatsProcessor(mStatsRule.getPowerProfile())); - PowerComponentAggregatedPowerStats aggregatedStats = - new PowerComponentAggregatedPowerStats( - new AggregatedPowerStats(mock(AggregatedPowerStatsConfig.class)), config); + PowerComponentAggregatedPowerStats aggregatedStats = new AggregatedPowerStats(config) + .getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO); aggregatedStats.setState(STATE_POWER, POWER_STATE_OTHER, 0); aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_ON, 0); @@ -232,8 +235,7 @@ public class MobileRadioPowerStatsProcessorTest { aggregatedStats.finish(10_000); MobileRadioPowerStatsLayout statsLayout = - new MobileRadioPowerStatsLayout( - aggregatedStats.getPowerStatsDescriptor()); + new MobileRadioPowerStatsLayout(aggregatedStats.getPowerStatsDescriptor()); // 720 mA * 100 ms (level 0 TX drain rate * level 0 TX duration) // + 1080 mA * 200 ms (level 1 TX drain rate * level 1 TX duration) @@ -316,8 +318,7 @@ public class MobileRadioPowerStatsProcessorTest { prepareAggregatedStats_energyConsumerModel(); MobileRadioPowerStatsLayout statsLayout = - new MobileRadioPowerStatsLayout( - aggregatedStats.getPowerStatsDescriptor()); + new MobileRadioPowerStatsLayout(aggregatedStats.getPowerStatsDescriptor()); // 10_000_000 micro-Coulomb * 1/1000 milli/micro * 1/3600 hour/second = 2.77778 mAh double totalPower = 0; @@ -412,17 +413,15 @@ public class MobileRadioPowerStatsProcessorTest { mStatsRule.setTestPowerProfile("power_profile_test_legacy_modem") .initMeasuredEnergyStatsLocked(); - AggregatedPowerStatsConfig.PowerComponent config = - new AggregatedPowerStatsConfig.PowerComponent( - BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) - .trackDeviceStates(STATE_POWER, STATE_SCREEN) - .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE) - .setProcessorSupplier(() -> new MobileRadioPowerStatsProcessor( - mStatsRule.getPowerProfile())); + AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) + .trackDeviceStates(STATE_POWER, STATE_SCREEN) + .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE) + .setProcessorSupplier( + () -> new MobileRadioPowerStatsProcessor(mStatsRule.getPowerProfile())); - PowerComponentAggregatedPowerStats aggregatedStats = - new PowerComponentAggregatedPowerStats( - new AggregatedPowerStats(mock(AggregatedPowerStatsConfig.class)), config); + PowerComponentAggregatedPowerStats aggregatedStats = new AggregatedPowerStats(config) + .getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO); aggregatedStats.setState(STATE_POWER, POWER_STATE_OTHER, 0); aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_ON, 0); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MultiStatePowerAttributorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MultiStatePowerAttributorTest.java new file mode 100644 index 000000000000..704ee62f764f --- /dev/null +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MultiStatePowerAttributorTest.java @@ -0,0 +1,183 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.server.power.stats.processor; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +import android.os.ConditionVariable; +import android.os.Handler; +import android.os.HandlerThread; +import android.platform.test.ravenwood.RavenwoodRule; + +import com.android.internal.os.BatteryStatsHistory; +import com.android.internal.os.MonotonicClock; +import com.android.server.power.stats.MockClock; +import com.android.server.power.stats.PowerStatsScheduler; +import com.android.server.power.stats.PowerStatsSpan; +import com.android.server.power.stats.PowerStatsStore; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; + +import java.io.IOException; +import java.nio.file.Files; +import java.time.Duration; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.TimeZone; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; + +public class MultiStatePowerAttributorTest { + + @Rule + public final RavenwoodRule mRavenwood = new RavenwoodRule.Builder() + .setProvideMainThread(true) + .build(); + + private PowerStatsStore mPowerStatsStore; + private Handler mHandler; + private final MockClock mClock = new MockClock(); + private final MonotonicClock mMonotonicClock = new MonotonicClock(0, mClock); + private PowerStatsScheduler mPowerStatsScheduler; + private PowerStatsAggregator mPowerStatsAggregator; + private MultiStatePowerAttributor mPowerAttributor; + private final List<Long> mScheduledAlarms = new ArrayList<>(); + private boolean mPowerStatsCollectionOccurred; + + private static final int START_REALTIME = 7654321; + + @Before + public void setup() throws IOException { + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + + mClock.currentTime = Instant.parse("2023-01-02T03:04:05.00Z").toEpochMilli(); + mClock.realtime = START_REALTIME; + + HandlerThread bgThread = new HandlerThread("bg thread"); + bgThread.start(); + mHandler = new Handler(bgThread.getLooper()); + mPowerStatsStore = new PowerStatsStore( + Files.createTempDirectory("MultiStatePowerAttributorTest").toFile(), mHandler); + mPowerStatsAggregator = mock(PowerStatsAggregator.class); + mPowerAttributor = new MultiStatePowerAttributor(mPowerStatsStore, mPowerStatsAggregator); + mPowerStatsScheduler = new PowerStatsScheduler( + () -> mPowerStatsCollectionOccurred = true, + mock(BatteryStatsHistory.class), + mPowerAttributor, TimeUnit.MINUTES.toMillis(30), TimeUnit.HOURS.toMillis(1), + mPowerStatsStore, + ((triggerAtMillis, tag, onAlarmListener, handler) -> + mScheduledAlarms.add(triggerAtMillis)), + mClock, mMonotonicClock, () -> 12345L, mHandler); + } + + @Test + public void storeAggregatedPowerStats() { + mPowerStatsStore.reset(); + + assertThat(mPowerStatsStore.getTableOfContents()).isEmpty(); + + mPowerAttributor.storeAggregatedPowerStats( + createAggregatedPowerStats(mMonotonicClock.monotonicTime(), mClock.currentTime, + 123)); + + long delayBeforeAggregating = TimeUnit.MINUTES.toMillis(90); + mClock.realtime += delayBeforeAggregating; + mClock.currentTime += delayBeforeAggregating; + + doAnswer(invocation -> { + // The first span is longer than 30 min, because the end time is being aligned with + // the wall clock. Subsequent spans should be precisely 30 minutes. + long startTime = invocation.getArgument(1); + long endTime = invocation.getArgument(2); + Consumer<AggregatedPowerStats> consumer = invocation.getArgument(3); + + long startTimeWallClock = + mClock.currentTime - (mMonotonicClock.monotonicTime() - startTime); + long endTimeWallClock = + mClock.currentTime - (mMonotonicClock.monotonicTime() - endTime); + + assertThat(startTime).isEqualTo(START_REALTIME + 123); + assertThat(endTime - startTime).isAtLeast(TimeUnit.MINUTES.toMillis(30)); + assertThat(Instant.ofEpochMilli(endTimeWallClock)) + .isEqualTo(Instant.parse("2023-01-02T04:00:00Z")); + + consumer.accept( + createAggregatedPowerStats(startTime, startTimeWallClock, endTime - startTime)); + return null; + }).doAnswer(invocation -> { + long startTime = invocation.getArgument(1); + long endTime = invocation.getArgument(2); + Consumer<AggregatedPowerStats> consumer = invocation.getArgument(3); + + long startTimeWallClock = + mClock.currentTime - (mMonotonicClock.monotonicTime() - startTime); + long endTimeWallClock = + mClock.currentTime - (mMonotonicClock.monotonicTime() - endTime); + + assertThat(Instant.ofEpochMilli(startTimeWallClock)) + .isEqualTo(Instant.parse("2023-01-02T04:00:00Z")); + assertThat(Instant.ofEpochMilli(endTimeWallClock)) + .isEqualTo(Instant.parse("2023-01-02T04:30:00Z")); + + consumer.accept( + createAggregatedPowerStats(startTime, startTimeWallClock, endTime - startTime)); + return null; + }).when(mPowerStatsAggregator).aggregatePowerStats(any(BatteryStatsHistory.class), + anyLong(), anyLong(), any(Consumer.class)); + + mPowerStatsScheduler.start(/*enabled*/ true); + ConditionVariable done = new ConditionVariable(); + mHandler.post(done::open); + done.block(); + + assertThat(mPowerStatsCollectionOccurred).isTrue(); + assertThat(mScheduledAlarms).containsExactly( + START_REALTIME + TimeUnit.MINUTES.toMillis(90) + TimeUnit.HOURS.toMillis(1)); + + verify(mPowerStatsAggregator, times(2)).aggregatePowerStats( + any(BatteryStatsHistory.class), anyLong(), anyLong(), any(Consumer.class)); + + List<PowerStatsSpan.Metadata> contents = mPowerStatsStore.getTableOfContents(); + assertThat(contents).hasSize(3); + // Skip the first entry, which was placed in the store at the beginning of this test + PowerStatsSpan.TimeFrame timeFrame1 = contents.get(1).getTimeFrames().get(0); + PowerStatsSpan.TimeFrame timeFrame2 = contents.get(2).getTimeFrames().get(0); + assertThat(timeFrame1.startMonotonicTime).isEqualTo(START_REALTIME + 123); + assertThat(timeFrame2.startMonotonicTime) + .isEqualTo(timeFrame1.startMonotonicTime + timeFrame1.duration); + assertThat(Instant.ofEpochMilli(timeFrame2.startTime)) + .isEqualTo(Instant.parse("2023-01-02T04:00:00Z")); + assertThat(Duration.ofMillis(timeFrame2.duration)).isEqualTo(Duration.ofMinutes(30)); + } + + private AggregatedPowerStats createAggregatedPowerStats(long monotonicTime, long currentTime, + long duration) { + AggregatedPowerStats stats = new AggregatedPowerStats(new AggregatedPowerStatsConfig()); + stats.addClockUpdate(monotonicTime, currentTime); + stats.setDuration(duration); + return stats; + } +} diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/MultiStateStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MultiStateStatsTest.java index ae258cd3c234..a232c0c7aec9 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/MultiStateStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/MultiStateStatsTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; @@ -198,8 +198,7 @@ public class MultiStateStatsTest { new MultiStateStats.States("scr", trackScreenState, "screen-off", "plugged-in")); } - private FactorySubject assertThatCpuPerformanceStatsFactory( - MultiStateStats.Factory factory) { + private FactorySubject assertThatCpuPerformanceStatsFactory(MultiStateStats.Factory factory) { FactorySubject subject = new FactorySubject(); subject.mFactory = factory; return subject; diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/PhoneCallPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessorTest.java index cb1bcfe2cb2b..2744ceb2e7e7 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/PhoneCallPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PhoneCallPowerStatsProcessorTest.java @@ -13,14 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; @@ -41,6 +41,11 @@ import android.telephony.ModemActivityInfo; import android.telephony.TelephonyManager; import com.android.internal.os.Clock; +import com.android.server.power.stats.BatteryUsageStatsRule; +import com.android.server.power.stats.MobileRadioPowerStatsCollector; +import com.android.server.power.stats.PowerStatsCollector; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.format.PowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -156,19 +161,17 @@ public class PhoneCallPowerStatsProcessorTest { @Test public void copyEstimatesFromMobileRadioPowerStats() { - - AggregatedPowerStatsConfig aggregatedPowerStatsConfig = new AggregatedPowerStatsConfig(); - aggregatedPowerStatsConfig.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) + AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) .trackDeviceStates(STATE_POWER, STATE_SCREEN) .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE) .setProcessorSupplier( () -> new MobileRadioPowerStatsProcessor(mStatsRule.getPowerProfile())); - aggregatedPowerStatsConfig.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_PHONE, + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_PHONE, BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO) .setProcessorSupplier(PhoneCallPowerStatsProcessor::new); - AggregatedPowerStats aggregatedPowerStats = - new AggregatedPowerStats(aggregatedPowerStatsConfig); + AggregatedPowerStats aggregatedPowerStats = new AggregatedPowerStats(config); PowerComponentAggregatedPowerStats mobileRadioStats = aggregatedPowerStats.getPowerComponentStats( BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO); @@ -208,8 +211,7 @@ public class PhoneCallPowerStatsProcessorTest { aggregatedPowerStats.getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_PHONE); stats.finish(10_000); - PowerStatsLayout statsLayout = - new PowerStatsLayout(stats.getPowerStatsDescriptor()); + PowerStatsLayout statsLayout = new PowerStatsLayout(stats.getPowerStatsDescriptor()); long[] deviceStats = new long[stats.getPowerStatsDescriptor().statsArrayLength]; stats.getDeviceStats(deviceStats, states(POWER_STATE_OTHER, SCREEN_STATE_ON)); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsAggregatorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsAggregatorTest.java index 3929137fa8c3..f312bedca82c 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsAggregatorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsAggregatorTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static com.google.common.truth.Truth.assertThat; @@ -32,6 +32,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.os.BatteryStatsHistory; import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.MockClock; import org.junit.Before; import org.junit.Test; @@ -53,7 +54,7 @@ public class PowerStatsAggregatorTest { private final MockClock mClock = new MockClock(); private final MonotonicClock mMonotonicClock = new MonotonicClock(START_TIME, mClock); private BatteryStatsHistory mHistory; - private PowerStatsAggregator mAggregator; + private com.android.server.power.stats.processor.PowerStatsAggregator mAggregator; private int mAggregatedStatsCount; @Before @@ -71,7 +72,7 @@ public class PowerStatsAggregatorTest { AggregatedPowerStatsConfig.STATE_POWER, AggregatedPowerStatsConfig.STATE_SCREEN, AggregatedPowerStatsConfig.STATE_PROCESS_STATE); - mAggregator = new PowerStatsAggregator(config, mHistory); + mAggregator = new PowerStatsAggregator(config); } @Test @@ -119,7 +120,7 @@ public class PowerStatsAggregatorTest { powerStats.uidStats.put(TEST_UID, new long[]{4444}); mHistory.recordPowerStats(mClock.realtime, mClock.uptime, powerStats); - mAggregator.aggregatePowerStats(0, MonotonicClock.UNDEFINED, stats -> { + mAggregator.aggregatePowerStats(mHistory, 0, MonotonicClock.UNDEFINED, stats -> { assertThat(mAggregatedStatsCount++).isEqualTo(0); assertThat(stats.getStartTime()).isEqualTo(START_TIME); @@ -138,7 +139,8 @@ public class PowerStatsAggregatorTest { long[] values = new long[1]; - PowerComponentAggregatedPowerStats powerComponentStats = stats.getPowerComponentStats( + PowerComponentAggregatedPowerStats + powerComponentStats = stats.getPowerComponentStats( TEST_POWER_COMPONENT); assertThat(powerComponentStats.getDeviceStats(values, new int[]{ @@ -218,7 +220,7 @@ public class PowerStatsAggregatorTest { mHistory.recordBatteryState(mClock.realtime, mClock.uptime, 50, /* plugged */ true); - mAggregator.aggregatePowerStats(0, MonotonicClock.UNDEFINED, stats -> { + mAggregator.aggregatePowerStats(mHistory, 0, MonotonicClock.UNDEFINED, stats -> { long[] values = new long[1]; PowerComponentAggregatedPowerStats powerComponentStats = diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsExporterTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java index 96203a5b6f47..024743d9e098 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsExporterTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; @@ -22,6 +22,7 @@ import static com.google.common.truth.Truth.assertWithMessage; import static org.mockito.Mockito.mock; import android.annotation.NonNull; +import android.content.Context; import android.os.AggregateBatteryConsumer; import android.os.BatteryConsumer; import android.os.BatteryStats; @@ -37,9 +38,16 @@ import android.platform.test.ravenwood.RavenwoodRule; import androidx.test.runner.AndroidJUnit4; import com.android.internal.os.BatteryStatsHistory; +import com.android.internal.os.CpuScalingPolicies; import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.BatteryUsageStatsRule; +import com.android.server.power.stats.MockClock; +import com.android.server.power.stats.PowerStatsStore; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.format.CpuPowerStatsLayout; +import com.android.server.power.stats.format.EnergyConsumerPowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -76,6 +84,7 @@ public class PowerStatsExporterTest { private MonotonicClock mMonotonicClock = new MonotonicClock(0, mClock); private PowerStatsStore mPowerStatsStore; private PowerStatsAggregator mPowerStatsAggregator; + private MultiStatePowerAttributor mPowerAttributor; private BatteryStatsHistory mHistory; private CpuPowerStatsLayout mCpuStatsArrayLayout; private PowerStats.Descriptor mPowerStatsDescriptor; @@ -108,25 +117,23 @@ public class PowerStatsExporterTest { AggregatedPowerStatsConfig.STATE_SCREEN, AggregatedPowerStatsConfig.STATE_PROCESS_STATE); - mPowerStatsStore = new PowerStatsStore(storeDirectory, new TestHandler(), config); + mPowerStatsStore = new PowerStatsStore(storeDirectory, new TestHandler()); mHistory = new BatteryStatsHistory(Parcel.obtain(), storeDirectory, 0, 10000, mock(BatteryStatsHistory.HistoryStepDetailsCalculator.class), mClock, mMonotonicClock, null, null); - mPowerStatsAggregator = new PowerStatsAggregator(config, mHistory); - - mCpuStatsArrayLayout = new CpuPowerStatsLayout(); - mCpuStatsArrayLayout.addDeviceSectionCpuTimeByScalingStep(1); - mCpuStatsArrayLayout.addDeviceSectionCpuTimeByCluster(1); - mCpuStatsArrayLayout.addDeviceSectionUsageDuration(); - mCpuStatsArrayLayout.addDeviceSectionPowerEstimate(); - mCpuStatsArrayLayout.addUidSectionCpuTimeByPowerBracket(new int[]{0}); - mCpuStatsArrayLayout.addUidSectionPowerEstimate(); + mPowerStatsAggregator = new PowerStatsAggregator(config); + + mCpuStatsArrayLayout = new CpuPowerStatsLayout(0, 1, new int[]{0}); PersistableBundle extras = new PersistableBundle(); mCpuStatsArrayLayout.toExtras(extras); mPowerStatsDescriptor = new PowerStats.Descriptor(BatteryConsumer.POWER_COMPONENT_CPU, mCpuStatsArrayLayout.getDeviceStatsArrayLength(), null, 0, mCpuStatsArrayLayout.getUidStatsArrayLength(), extras); + + mPowerAttributor = new MultiStatePowerAttributor(mock(Context.class), mPowerStatsStore, + mock(PowerProfile.class), mock(CpuScalingPolicies.class), + mock(PowerStatsUidResolver.class)); } @Test @@ -329,10 +336,12 @@ public class PowerStatsExporterTest { includeScreenStateData, includesPowerStateData); } - private @NonNull BatteryUsageStats exportToBatteryUsageStats(AggregatedPowerStats aps, + private @NonNull BatteryUsageStats exportToBatteryUsageStats( + AggregatedPowerStats aps, boolean includeProcessStateData, boolean includeScreenStateData, boolean includesPowerStateData) { - PowerStatsExporter exporter = new PowerStatsExporter(mPowerStatsStore, + PowerStatsExporter + exporter = new PowerStatsExporter(mPowerStatsStore, mPowerStatsAggregator, /* batterySessionTimeSpanSlackMillis */ 0); BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(new String[0], false, @@ -508,8 +517,8 @@ public class PowerStatsExporterTest { mCpuStatsArrayLayout.setUidTimeByPowerBracket(uidStats2, 0, 2469); mHistory.recordPowerStats(3000, 3000, powerStats); - mPowerStatsAggregator.aggregatePowerStats(0, 3500, - stats -> mPowerStatsStore.storeAggregatedPowerStats(stats)); + mPowerStatsAggregator.aggregatePowerStats(mHistory, 0, 3500, + stats -> mPowerAttributor.storeAggregatedPowerStats(stats)); mHistory.recordProcessStateChange(4000, 4000, APP_UID1, BatteryConsumer.PROCESS_STATE_BACKGROUND); @@ -525,9 +534,8 @@ public class PowerStatsExporterTest { mEnergyConsumerPowerStatsLayout.setUidConsumedEnergy(customUidStats, 0, 360_000); mHistory.recordPowerStats(6010, 6010, customPowerStats); - mPowerStatsAggregator.aggregatePowerStats(3500, 6500, stats -> { - mPowerStatsStore.storeAggregatedPowerStats(stats); - }); + mPowerStatsAggregator.aggregatePowerStats(mHistory, 3500, 6500, + stats -> mPowerAttributor.storeAggregatedPowerStats(stats)); mHistory.recordStateStartEvent(7000, 7000, BatteryStats.HistoryItem.STATE_SCREEN_ON_FLAG); mHistory.recordProcessStateChange(7000, 7000, APP_UID1, @@ -548,7 +556,8 @@ public class PowerStatsExporterTest { recordBatteryHistory(); PowerStatsExporter exporter = new PowerStatsExporter(mPowerStatsStore, mPowerStatsAggregator, /* batterySessionTimeSpanSlackMillis */ 0); - exporter.exportAggregatedPowerStats(builder, monotonicStartTime, monotonicEndTime); + exporter.exportAggregatedPowerStats(builder, mHistory, monotonicStartTime, + monotonicEndTime); } private void assertAggregatedPowerEstimate(String message, BatteryUsageStats bus, int scope, diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsProcessorTest.java index 02e446aa1859..13e0d9da3f16 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsProcessorTest.java @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/ScreenPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/ScreenPowerStatsProcessorTest.java index 94f5662a032f..412f0c8fe737 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/ScreenPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/ScreenPowerStatsProcessorTest.java @@ -14,20 +14,19 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_BATTERY; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_BATTERY; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.hardware.power.stats.EnergyConsumerType; @@ -40,7 +39,12 @@ import android.platform.test.ravenwood.RavenwoodRule; import com.android.internal.os.Clock; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.BatteryUsageStatsRule; +import com.android.server.power.stats.PowerStatsCollector; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.ScreenPowerStatsCollector; import com.android.server.power.stats.ScreenPowerStatsCollector.Injector; +import com.android.server.power.stats.format.ScreenPowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -243,16 +247,14 @@ public class ScreenPowerStatsProcessorTest { private static PowerComponentAggregatedPowerStats createAggregatedPowerStats( Supplier<PowerStatsProcessor> processorSupplier) { - AggregatedPowerStatsConfig.PowerComponent config = - new AggregatedPowerStatsConfig.PowerComponent( - BatteryConsumer.POWER_COMPONENT_SCREEN) + AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_SCREEN) .trackDeviceStates(STATE_POWER, STATE_SCREEN) .trackUidStates(STATE_POWER, STATE_SCREEN) .setProcessorSupplier(processorSupplier); - PowerComponentAggregatedPowerStats aggregatedStats = - new PowerComponentAggregatedPowerStats( - new AggregatedPowerStats(mock(AggregatedPowerStatsConfig.class)), config); + PowerComponentAggregatedPowerStats aggregatedStats = new AggregatedPowerStats(config) + .getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_SCREEN); aggregatedStats.setState(STATE_POWER, POWER_STATE_OTHER, 0); aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_ON, 0); @@ -260,7 +262,8 @@ public class ScreenPowerStatsProcessorTest { return aggregatedStats; } - private void assertDevicePowerEstimate(PowerComponentAggregatedPowerStats aggregatedStats, + private void assertDevicePowerEstimate( + PowerComponentAggregatedPowerStats aggregatedStats, int powerState, int screenState, double expectedScreenPowerEstimate, double expectedDozePowerEstimate) { PowerStats.Descriptor descriptor = aggregatedStats.getPowerStatsDescriptor(); @@ -273,7 +276,8 @@ public class ScreenPowerStatsProcessorTest { .of(expectedDozePowerEstimate); } - private void assertUidPowerEstimate(PowerComponentAggregatedPowerStats aggregatedStats, int uid, + private void assertUidPowerEstimate( + PowerComponentAggregatedPowerStats aggregatedStats, int uid, int powerState, int screenState, double expectedScreenPowerEstimate) { PowerStats.Descriptor descriptor = aggregatedStats.getPowerStatsDescriptor(); ScreenPowerStatsLayout layout = new ScreenPowerStatsLayout(descriptor); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/SensorPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/SensorPowerStatsProcessorTest.java index 687d70be74f4..d97260455bdd 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/SensorPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/SensorPowerStatsProcessorTest.java @@ -14,19 +14,19 @@ * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static android.os.BatteryConsumer.PROCESS_STATE_BACKGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_CACHED; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; @@ -43,6 +43,8 @@ import android.platform.test.ravenwood.RavenwoodRule; import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerStats; +import com.android.server.power.stats.BatteryUsageStatsRule; +import com.android.server.power.stats.format.SensorPowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -109,8 +111,7 @@ public class SensorPowerStatsProcessorTest { stats.finish(10000); PowerStats.Descriptor descriptor = stats.getPowerStatsDescriptor(); - SensorPowerStatsLayout statsLayout = new SensorPowerStatsLayout(); - statsLayout.fromExtras(descriptor.extras); + SensorPowerStatsLayout statsLayout = new SensorPowerStatsLayout(descriptor); String dump = stats.toString(); assertThat(dump).contains(" step_counter: "); @@ -207,10 +208,8 @@ public class SensorPowerStatsProcessorTest { AggregatedPowerStatsConfig.STATE_PROCESS_STATE) .setProcessorSupplier(processorSupplier); - AggregatedPowerStats aggregatedPowerStats = new AggregatedPowerStats(config); - PowerComponentAggregatedPowerStats powerComponentStats = - aggregatedPowerStats.getPowerComponentStats( - BatteryConsumer.POWER_COMPONENT_SENSORS); + PowerComponentAggregatedPowerStats powerComponentStats = new AggregatedPowerStats(config) + .getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_SENSORS); powerComponentStats.start(0); powerComponentStats.setState(STATE_POWER, POWER_STATE_OTHER, 0); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java index 11c09bc78ad2..43023f8b9ce7 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/WifiPowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/WifiPowerStatsProcessorTest.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.power.stats; +package com.android.server.power.stats.processor; import static android.net.NetworkStats.DEFAULT_NETWORK_NO; import static android.net.NetworkStats.METERED_NO; @@ -23,12 +23,12 @@ import static android.os.BatteryConsumer.PROCESS_STATE_CACHED; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND; import static android.os.BatteryConsumer.PROCESS_STATE_FOREGROUND_SERVICE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.POWER_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_ON; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_POWER; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; -import static com.android.server.power.stats.AggregatedPowerStatsConfig.STATE_SCREEN; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.POWER_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_ON; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.SCREEN_STATE_OTHER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_POWER; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_PROCESS_STATE; +import static com.android.server.power.stats.processor.AggregatedPowerStatsConfig.STATE_SCREEN; import static com.google.common.truth.Truth.assertThat; @@ -53,6 +53,13 @@ import android.util.SparseArray; import com.android.internal.os.Clock; import com.android.internal.os.PowerProfile; +import com.android.server.power.stats.BatteryUsageStatsRule; +import com.android.server.power.stats.MockBatteryStatsImpl; +import com.android.server.power.stats.PowerStatsCollector; +import com.android.server.power.stats.PowerStatsUidResolver; +import com.android.server.power.stats.WifiPowerStatsCollector; +import com.android.server.power.stats.WifiPowerStatsCollector.WifiStatsRetriever; +import com.android.server.power.stats.format.WifiPowerStatsLayout; import org.junit.Before; import org.junit.Rule; @@ -109,8 +116,7 @@ public class WifiPowerStatsProcessorTest { private final SparseArray<ScanTimes> mScanTimes = new SparseArray<>(); private long mWifiActiveDuration; - private final WifiPowerStatsCollector.WifiStatsRetriever mWifiStatsRetriever = - new WifiPowerStatsCollector.WifiStatsRetriever() { + private final WifiStatsRetriever mWifiStatsRetriever = new WifiStatsRetriever() { @Override public void retrieveWifiScanTimes(Callback callback) { for (int i = 0; i < mScanTimes.size(); i++) { @@ -174,7 +180,7 @@ public class WifiPowerStatsProcessorTest { } @Override - public WifiPowerStatsCollector.WifiStatsRetriever getWifiStatsRetriever() { + public WifiStatsRetriever getWifiStatsRetriever() { return mWifiStatsRetriever; } }; @@ -525,15 +531,14 @@ public class WifiPowerStatsProcessorTest { private static PowerComponentAggregatedPowerStats createAggregatedPowerStats( Supplier<PowerStatsProcessor> processorSupplier) { - AggregatedPowerStatsConfig.PowerComponent config = - new AggregatedPowerStatsConfig.PowerComponent(BatteryConsumer.POWER_COMPONENT_WIFI) - .trackDeviceStates(STATE_POWER, STATE_SCREEN) - .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE) - .setProcessorSupplier(processorSupplier); - - PowerComponentAggregatedPowerStats aggregatedStats = - new PowerComponentAggregatedPowerStats( - new AggregatedPowerStats(mock(AggregatedPowerStatsConfig.class)), config); + AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); + config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_WIFI) + .trackDeviceStates(STATE_POWER, STATE_SCREEN) + .trackUidStates(STATE_POWER, STATE_SCREEN, STATE_PROCESS_STATE) + .setProcessorSupplier(processorSupplier); + + PowerComponentAggregatedPowerStats aggregatedStats = new AggregatedPowerStats(config) + .getPowerComponentStats(BatteryConsumer.POWER_COMPONENT_WIFI); aggregatedStats.setState(STATE_POWER, POWER_STATE_OTHER, 0); aggregatedStats.setState(STATE_SCREEN, SCREEN_STATE_ON, 0); |