Loading core/java/com/android/internal/os/BatteryStatsHistory.java +14 −49 Original line number Original line Diff line number Diff line Loading @@ -582,23 +582,6 @@ public class BatteryStatsHistory { * @param maxHistoryFiles the largest number of history buffer files to keep * @param maxHistoryFiles the largest number of history buffer files to keep * @param maxHistoryBufferSize the most amount of RAM to used for buffering of history steps * @param maxHistoryBufferSize the most amount of RAM to used for buffering of history steps */ */ public BatteryStatsHistory(File systemDir, int maxHistoryFiles, int maxHistoryBufferSize, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, MonotonicClock monotonicClock) { this(systemDir, maxHistoryFiles, maxHistoryBufferSize, stepDetailsCalculator, clock, monotonicClock, new TraceDelegate(), new EventLogger()); } public BatteryStatsHistory(File systemDir, int maxHistoryFiles, int maxHistoryBufferSize, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, MonotonicClock monotonicClock, TraceDelegate tracer, EventLogger eventLogger) { this(Parcel.obtain(), systemDir, maxHistoryFiles, maxHistoryBufferSize, stepDetailsCalculator, clock, monotonicClock, tracer, eventLogger); initHistoryBuffer(); } @VisibleForTesting public BatteryStatsHistory(Parcel historyBuffer, File systemDir, public BatteryStatsHistory(Parcel historyBuffer, File systemDir, int maxHistoryFiles, int maxHistoryBufferSize, int maxHistoryFiles, int maxHistoryBufferSize, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, Loading @@ -607,12 +590,11 @@ public class BatteryStatsHistory { clock, monotonicClock, tracer, eventLogger, null); clock, monotonicClock, tracer, eventLogger, null); } } private BatteryStatsHistory(Parcel historyBuffer, File systemDir, private BatteryStatsHistory(@Nullable Parcel historyBuffer, @Nullable File systemDir, int maxHistoryFiles, int maxHistoryBufferSize, int maxHistoryFiles, int maxHistoryBufferSize, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, @NonNull HistoryStepDetailsCalculator stepDetailsCalculator, @NonNull Clock clock, MonotonicClock monotonicClock, TraceDelegate tracer, EventLogger eventLogger, @NonNull MonotonicClock monotonicClock, @NonNull TraceDelegate tracer, BatteryStatsHistory writableHistory) { @NonNull EventLogger eventLogger, @Nullable BatteryStatsHistory writableHistory) { mHistoryBuffer = historyBuffer; mSystemDir = systemDir; mSystemDir = systemDir; mMaxHistoryBufferSize = maxHistoryBufferSize; mMaxHistoryBufferSize = maxHistoryBufferSize; mStepDetailsCalculator = stepDetailsCalculator; mStepDetailsCalculator = stepDetailsCalculator; Loading @@ -625,9 +607,16 @@ public class BatteryStatsHistory { mMutable = false; mMutable = false; } } if (historyBuffer != null) { mHistoryBuffer = historyBuffer; } else { mHistoryBuffer = Parcel.obtain(); initHistoryBuffer(); } if (writableHistory != null) { if (writableHistory != null) { mHistoryDir = writableHistory.mHistoryDir; mHistoryDir = writableHistory.mHistoryDir; } else { } else if (systemDir != null) { mHistoryDir = new BatteryHistoryDirectory(new File(systemDir, HISTORY_DIR), mHistoryDir = new BatteryHistoryDirectory(new File(systemDir, HISTORY_DIR), monotonicClock, maxHistoryFiles); monotonicClock, maxHistoryFiles); mHistoryDir.load(); mHistoryDir.load(); Loading @@ -636,33 +625,9 @@ public class BatteryStatsHistory { activeFile = mHistoryDir.makeBatteryHistoryFile(); activeFile = mHistoryDir.makeBatteryHistoryFile(); } } setActiveFile(activeFile); setActiveFile(activeFile); } } else { } public BatteryStatsHistory(int maxHistoryBufferSize, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, MonotonicClock monotonicClock) { this(maxHistoryBufferSize, stepDetailsCalculator, clock, monotonicClock, new TraceDelegate(), new EventLogger()); } @VisibleForTesting public BatteryStatsHistory(int maxHistoryBufferSize, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, MonotonicClock monotonicClock, TraceDelegate traceDelegate, EventLogger eventLogger) { mMaxHistoryBufferSize = maxHistoryBufferSize; mStepDetailsCalculator = stepDetailsCalculator; mTracer = traceDelegate; mClock = clock; mMonotonicClock = monotonicClock; mEventLogger = eventLogger; mHistoryBuffer = Parcel.obtain(); mSystemDir = null; mHistoryDir = null; mHistoryDir = null; mWritableHistory = null; } initHistoryBuffer(); } } /** /** Loading services/core/java/com/android/server/power/stats/BatteryStatsImpl.java +63 −84 Original line number Original line Diff line number Diff line Loading @@ -290,8 +290,8 @@ public class BatteryStatsImpl extends BatteryStats { private KernelMemoryBandwidthStats mKernelMemoryBandwidthStats; private KernelMemoryBandwidthStats mKernelMemoryBandwidthStats; private final LongSparseArray<SamplingTimer> mKernelMemoryStats = new LongSparseArray<>(); private final LongSparseArray<SamplingTimer> mKernelMemoryStats = new LongSparseArray<>(); private int[] mCpuPowerBracketMap; private int[] mCpuPowerBracketMap; private CpuPowerStatsCollector mCpuPowerStatsCollector; private final CpuPowerStatsCollector mCpuPowerStatsCollector; private MobileRadioPowerStatsCollector mMobileRadioPowerStatsCollector; private final MobileRadioPowerStatsCollector mMobileRadioPowerStatsCollector; private final SparseBooleanArray mPowerStatsCollectorEnabled = new SparseBooleanArray(); private final SparseBooleanArray mPowerStatsCollectorEnabled = new SparseBooleanArray(); public LongSparseArray<SamplingTimer> getKernelMemoryStats() { public LongSparseArray<SamplingTimer> getKernelMemoryStats() { Loading Loading @@ -1777,7 +1777,7 @@ public class BatteryStatsImpl extends BatteryStats { return mMaxLearnedBatteryCapacityUah; return mMaxLearnedBatteryCapacityUah; } } public class FrameworkStatsLogger { public static class FrameworkStatsLogger { public void uidProcessStateChanged(int uid, int state) { public void uidProcessStateChanged(int uid, int state) { // TODO(b/155216561): It is possible for isolated uids to be in a higher // TODO(b/155216561): It is possible for isolated uids to be in a higher // state than its parent uid. We should track the highest state within the union of host // state than its parent uid. We should track the highest state within the union of host Loading @@ -1786,25 +1786,24 @@ public class BatteryStatsImpl extends BatteryStats { ActivityManager.processStateAmToProto(state)); ActivityManager.processStateAmToProto(state)); } } public void wakelockStateChanged(int uid, WorkChain wc, String name, int type, public void wakelockStateChanged(int uid, WorkChain wc, String name, int procState, boolean acquired) { int procState, boolean acquired, int powerManagerWakeLockLevel) { int event = acquired int event = acquired ? FrameworkStatsLog.WAKELOCK_STATE_CHANGED__STATE__ACQUIRE ? FrameworkStatsLog.WAKELOCK_STATE_CHANGED__STATE__ACQUIRE : FrameworkStatsLog.WAKELOCK_STATE_CHANGED__STATE__RELEASE; : FrameworkStatsLog.WAKELOCK_STATE_CHANGED__STATE__RELEASE; if (wc != null) { if (wc != null) { FrameworkStatsLog.write(FrameworkStatsLog.WAKELOCK_STATE_CHANGED, wc.getUids(), FrameworkStatsLog.write(FrameworkStatsLog.WAKELOCK_STATE_CHANGED, wc.getUids(), wc.getTags(), getPowerManagerWakeLockLevel(type), name, wc.getTags(), powerManagerWakeLockLevel, name, event, procState); event, procState); } else { } else { FrameworkStatsLog.write_non_chained(FrameworkStatsLog.WAKELOCK_STATE_CHANGED, FrameworkStatsLog.write_non_chained(FrameworkStatsLog.WAKELOCK_STATE_CHANGED, uid, mapIsolatedUid(uid), null, getPowerManagerWakeLockLevel(type), name, null, powerManagerWakeLockLevel, name, event, procState); event, procState); } } } } public void kernelWakeupReported(long deltaUptimeUs) { public void kernelWakeupReported(long deltaUptimeUs, String lastWakeupReason, FrameworkStatsLog.write(FrameworkStatsLog.KERNEL_WAKEUP_REPORTED, mLastWakeupReason, long lastWakeupElapsedTimeMs) { /* duration_usec */ deltaUptimeUs, mLastWakeupElapsedTimeMs); FrameworkStatsLog.write(FrameworkStatsLog.KERNEL_WAKEUP_REPORTED, lastWakeupReason, /* duration_usec */ deltaUptimeUs, lastWakeupElapsedTimeMs); } } public void gpsScanStateChanged(int uid, WorkChain workChain, boolean stateOn) { public void gpsScanStateChanged(int uid, WorkChain workChain, boolean stateOn) { Loading Loading @@ -1868,41 +1867,6 @@ public class BatteryStatsImpl extends BatteryStats { private final FrameworkStatsLogger mFrameworkStatsLogger; private final FrameworkStatsLogger mFrameworkStatsLogger; @VisibleForTesting public BatteryStatsImpl(@NonNull BatteryStatsConfig config, Clock clock, File historyDirectory, @NonNull Handler handler, @NonNull PowerStatsUidResolver powerStatsUidResolver, @NonNull FrameworkStatsLogger frameworkStatsLogger, @NonNull BatteryStatsHistory.TraceDelegate traceDelegate, @NonNull BatteryStatsHistory.EventLogger eventLogger) { mBatteryStatsConfig = config; mClock = clock; initKernelStatsReaders(); mHandler = handler; mPowerStatsUidResolver = powerStatsUidResolver; mFrameworkStatsLogger = frameworkStatsLogger; mConstants = new Constants(mHandler); mStartClockTimeMs = clock.currentTimeMillis(); mDailyFile = null; mMonotonicClock = new MonotonicClock(0, mClock); if (historyDirectory == null) { mCheckinFile = null; mStatsFile = null; mHistory = new BatteryStatsHistory(mConstants.MAX_HISTORY_BUFFER, mStepDetailsCalculator, mClock, mMonotonicClock, traceDelegate, eventLogger); } else { mCheckinFile = new AtomicFile(new File(historyDirectory, "batterystats-checkin.bin")); mStatsFile = new AtomicFile(new File(historyDirectory, "batterystats.bin")); mHistory = new BatteryStatsHistory(historyDirectory, mConstants.MAX_HISTORY_FILES, mConstants.MAX_HISTORY_BUFFER, mStepDetailsCalculator, mClock, mMonotonicClock, traceDelegate, eventLogger); } mPlatformIdleStateCallback = null; mEnergyConsumerRetriever = null; mUserInfoProvider = null; initPowerStatsCollectors(); } private void initKernelStatsReaders() { private void initKernelStatsReaders() { if (!isKernelStatsAvailable()) { if (!isKernelStatsAvailable()) { return; return; Loading Loading @@ -2006,19 +1970,6 @@ public class BatteryStatsImpl extends BatteryStats { private final PowerStatsCollectorInjector mPowerStatsCollectorInjector = private final PowerStatsCollectorInjector mPowerStatsCollectorInjector = new PowerStatsCollectorInjector(); new PowerStatsCollectorInjector(); @SuppressWarnings("GuardedBy") // Accessed from constructor only private void initPowerStatsCollectors() { mCpuPowerStatsCollector = new CpuPowerStatsCollector(mPowerStatsCollectorInjector, mBatteryStatsConfig.getPowerStatsThrottlePeriod( BatteryConsumer.POWER_COMPONENT_CPU)); mCpuPowerStatsCollector.addConsumer(this::recordPowerStats); mMobileRadioPowerStatsCollector = new MobileRadioPowerStatsCollector( mPowerStatsCollectorInjector, mBatteryStatsConfig.getPowerStatsThrottlePeriod( BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)); mMobileRadioPowerStatsCollector.addConsumer(this::recordPowerStats); } /** /** * TimeBase observer. * TimeBase observer. */ */ Loading Loading @@ -4975,8 +4926,9 @@ public class BatteryStatsImpl extends BatteryStats { Uid uidStats = getUidStatsLocked(mappedUid, elapsedRealtimeMs, uptimeMs); Uid uidStats = getUidStatsLocked(mappedUid, elapsedRealtimeMs, uptimeMs); uidStats.noteStartWakeLocked(pid, name, type, elapsedRealtimeMs); uidStats.noteStartWakeLocked(pid, name, type, elapsedRealtimeMs); mFrameworkStatsLogger.wakelockStateChanged(mapIsolatedUid(uid), wc, name, type, mFrameworkStatsLogger.wakelockStateChanged(mapIsolatedUid(uid), wc, name, uidStats.mProcessState, true /* acquired */); uidStats.mProcessState, true /* acquired */, getPowerManagerWakeLockLevel(type)); } } } } Loading Loading @@ -5019,8 +4971,9 @@ public class BatteryStatsImpl extends BatteryStats { Uid uidStats = getUidStatsLocked(mappedUid, elapsedRealtimeMs, uptimeMs); Uid uidStats = getUidStatsLocked(mappedUid, elapsedRealtimeMs, uptimeMs); uidStats.noteStopWakeLocked(pid, name, type, elapsedRealtimeMs); uidStats.noteStopWakeLocked(pid, name, type, elapsedRealtimeMs); mFrameworkStatsLogger.wakelockStateChanged(mapIsolatedUid(uid), wc, name, type, mFrameworkStatsLogger.wakelockStateChanged(mapIsolatedUid(uid), wc, name, uidStats.mProcessState, false /* acquired */); uidStats.mProcessState, false/* acquired */, getPowerManagerWakeLockLevel(type)); if (mappedUid != uid) { if (mappedUid != uid) { // Decrement the ref count for the isolated uid and delete the mapping if uneeded. // Decrement the ref count for the isolated uid and delete the mapping if uneeded. Loading @@ -5036,8 +4989,8 @@ public class BatteryStatsImpl extends BatteryStats { * TODO: Delete this. Instead, FrameworkStatsLog.write should be called from * TODO: Delete this. Instead, FrameworkStatsLog.write should be called from * PowerManager's Notifier. * PowerManager's Notifier. */ */ private int getPowerManagerWakeLockLevel(int battertStatsWakelockType) { private int getPowerManagerWakeLockLevel(int batteryStatsWakelockType) { switch (battertStatsWakelockType) { switch (batteryStatsWakelockType) { // PowerManager.PARTIAL_WAKE_LOCK or PROXIMITY_SCREEN_OFF_WAKE_LOCK // PowerManager.PARTIAL_WAKE_LOCK or PROXIMITY_SCREEN_OFF_WAKE_LOCK case BatteryStats.WAKE_TYPE_PARTIAL: case BatteryStats.WAKE_TYPE_PARTIAL: return PowerManager.PARTIAL_WAKE_LOCK; return PowerManager.PARTIAL_WAKE_LOCK; Loading @@ -5055,7 +5008,7 @@ public class BatteryStatsImpl extends BatteryStats { return -1; return -1; default: default: Slog.e(TAG, "Illegal wakelock type in batterystats: " + battertStatsWakelockType); Slog.e(TAG, "Illegal wakelock type in batterystats: " + batteryStatsWakelockType); return -1; return -1; } } } } Loading Loading @@ -5257,7 +5210,8 @@ public class BatteryStatsImpl extends BatteryStats { long deltaUptimeMs = uptimeMs - mLastWakeupUptimeMs; long deltaUptimeMs = uptimeMs - mLastWakeupUptimeMs; SamplingTimer timer = getWakeupReasonTimerLocked(mLastWakeupReason); SamplingTimer timer = getWakeupReasonTimerLocked(mLastWakeupReason); timer.add(deltaUptimeMs * 1000, 1, elapsedRealtimeMs); // time in in microseconds timer.add(deltaUptimeMs * 1000, 1, elapsedRealtimeMs); // time in in microseconds mFrameworkStatsLogger.kernelWakeupReported(deltaUptimeMs * 1000); mFrameworkStatsLogger.kernelWakeupReported(deltaUptimeMs * 1000, mLastWakeupReason, mLastWakeupElapsedTimeMs); mLastWakeupReason = null; mLastWakeupReason = null; } } } } Loading Loading @@ -11094,11 +11048,27 @@ public class BatteryStatsImpl extends BatteryStats { public BatteryStatsImpl(@NonNull BatteryStatsConfig config, @NonNull Clock clock, public BatteryStatsImpl(@NonNull BatteryStatsConfig config, @NonNull Clock clock, @NonNull MonotonicClock monotonicClock, @Nullable File systemDir, @NonNull MonotonicClock monotonicClock, @Nullable File systemDir, @NonNull Handler handler, @Nullable PlatformIdleStateCallback cb, @NonNull Handler handler, @Nullable PlatformIdleStateCallback platformIdleStateCallback, @Nullable EnergyStatsRetriever energyStatsCb, @Nullable EnergyStatsRetriever energyStatsRetriever, @NonNull UserInfoProvider userInfoProvider, @NonNull PowerProfile powerProfile, @NonNull UserInfoProvider userInfoProvider, @NonNull PowerProfile powerProfile, @NonNull CpuScalingPolicies cpuScalingPolicies, @NonNull CpuScalingPolicies cpuScalingPolicies, @NonNull PowerStatsUidResolver powerStatsUidResolver) { @NonNull PowerStatsUidResolver powerStatsUidResolver) { this(config, clock, monotonicClock, systemDir, handler, platformIdleStateCallback, energyStatsRetriever, userInfoProvider, powerProfile, cpuScalingPolicies, powerStatsUidResolver, new FrameworkStatsLogger(), new BatteryStatsHistory.TraceDelegate(), new BatteryStatsHistory.EventLogger()); } public BatteryStatsImpl(@NonNull BatteryStatsConfig config, @NonNull Clock clock, @NonNull MonotonicClock monotonicClock, @Nullable File systemDir, @NonNull Handler handler, @Nullable PlatformIdleStateCallback platformIdleStateCallback, @Nullable EnergyStatsRetriever energyStatsRetriever, @NonNull UserInfoProvider userInfoProvider, @NonNull PowerProfile powerProfile, @NonNull CpuScalingPolicies cpuScalingPolicies, @NonNull PowerStatsUidResolver powerStatsUidResolver, @NonNull FrameworkStatsLogger frameworkStatsLogger, @NonNull BatteryStatsHistory.TraceDelegate traceDelegate, @NonNull BatteryStatsHistory.EventLogger eventLogger) { mClock = clock; mClock = clock; initKernelStatsReaders(); initKernelStatsReaders(); Loading @@ -11110,25 +11080,34 @@ public class BatteryStatsImpl extends BatteryStats { mPowerProfile = powerProfile; mPowerProfile = powerProfile; mCpuScalingPolicies = cpuScalingPolicies; mCpuScalingPolicies = cpuScalingPolicies; mPowerStatsUidResolver = powerStatsUidResolver; mPowerStatsUidResolver = powerStatsUidResolver; mFrameworkStatsLogger = new FrameworkStatsLogger(); mFrameworkStatsLogger = frameworkStatsLogger; initPowerProfile(); initPowerProfile(); if (systemDir == null) { if (systemDir != null) { mStatsFile = null; mCheckinFile = null; mDailyFile = null; mHistory = new BatteryStatsHistory(mConstants.MAX_HISTORY_BUFFER, mStepDetailsCalculator, mClock, mMonotonicClock); } else { mStatsFile = new AtomicFile(new File(systemDir, "batterystats.bin")); mStatsFile = new AtomicFile(new File(systemDir, "batterystats.bin")); mCheckinFile = new AtomicFile(new File(systemDir, "batterystats-checkin.bin")); mCheckinFile = new AtomicFile(new File(systemDir, "batterystats-checkin.bin")); mDailyFile = new AtomicFile(new File(systemDir, "batterystats-daily.xml")); mDailyFile = new AtomicFile(new File(systemDir, "batterystats-daily.xml")); mHistory = new BatteryStatsHistory(systemDir, mConstants.MAX_HISTORY_FILES, } else { mConstants.MAX_HISTORY_BUFFER, mStepDetailsCalculator, mClock, mMonotonicClock); mStatsFile = null; mCheckinFile = null; mDailyFile = null; } } initPowerStatsCollectors(); mHistory = new BatteryStatsHistory(null /* historyBuffer */, systemDir, mConstants.MAX_HISTORY_FILES, mConstants.MAX_HISTORY_BUFFER, mStepDetailsCalculator, mClock, mMonotonicClock, traceDelegate, eventLogger); mCpuPowerStatsCollector = new CpuPowerStatsCollector(mPowerStatsCollectorInjector, mBatteryStatsConfig.getPowerStatsThrottlePeriod( BatteryConsumer.POWER_COMPONENT_CPU)); mCpuPowerStatsCollector.addConsumer(this::recordPowerStats); mMobileRadioPowerStatsCollector = new MobileRadioPowerStatsCollector( mPowerStatsCollectorInjector, mBatteryStatsConfig.getPowerStatsThrottlePeriod( BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)); mMobileRadioPowerStatsCollector.addConsumer(this::recordPowerStats); mStartCount++; mStartCount++; initTimersAndCounters(); initTimersAndCounters(); mOnBattery = mOnBatteryInternal = false; mOnBattery = mOnBatteryInternal = false; Loading @@ -11138,8 +11117,8 @@ public class BatteryStatsImpl extends BatteryStats { mStartPlatformVersion = mEndPlatformVersion = Build.ID; mStartPlatformVersion = mEndPlatformVersion = Build.ID; initDischarge(realtimeUs); initDischarge(realtimeUs); updateDailyDeadlineLocked(); updateDailyDeadlineLocked(); mPlatformIdleStateCallback = cb; mPlatformIdleStateCallback = platformIdleStateCallback; mEnergyConsumerRetriever = energyStatsCb; mEnergyConsumerRetriever = energyStatsRetriever; mUserInfoProvider = userInfoProvider; mUserInfoProvider = userInfoProvider; mPowerStatsUidResolver.addListener(new PowerStatsUidResolver.Listener() { mPowerStatsUidResolver.addListener(new PowerStatsUidResolver.Listener() { Loading services/tests/powerstatstests/src/com/android/server/power/stats/BatteryExternalStatsWorkerTest.java +21 −21 Original line number Original line Diff line number Diff line Loading @@ -36,6 +36,8 @@ import android.hardware.power.stats.EnergyConsumerType; import android.hardware.power.stats.EnergyMeasurement; import android.hardware.power.stats.EnergyMeasurement; import android.hardware.power.stats.PowerEntity; import android.hardware.power.stats.PowerEntity; import android.hardware.power.stats.StateResidencyResult; import android.hardware.power.stats.StateResidencyResult; import android.os.Handler; import android.os.Looper; import android.platform.test.ravenwood.RavenwoodRule; import android.platform.test.ravenwood.RavenwoodRule; import android.power.PowerStatsInternal; import android.power.PowerStatsInternal; import android.util.IntArray; import android.util.IntArray; Loading @@ -45,6 +47,7 @@ import androidx.test.InstrumentationRegistry; import com.android.internal.os.Clock; import com.android.internal.os.Clock; import com.android.internal.os.CpuScalingPolicies; import com.android.internal.os.CpuScalingPolicies; import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerProfile; import org.junit.Before; import org.junit.Before; Loading @@ -65,18 +68,23 @@ import java.util.concurrent.CompletableFuture; public class BatteryExternalStatsWorkerTest { public class BatteryExternalStatsWorkerTest { @Rule @Rule public final RavenwoodRule mRavenwood = new RavenwoodRule(); public final RavenwoodRule mRavenwood = new RavenwoodRule(); private BatteryExternalStatsWorker mBatteryExternalStatsWorker; private BatteryExternalStatsWorker mBatteryExternalStatsWorker; private TestBatteryStatsImpl mBatteryStatsImpl; private TestPowerStatsInternal mPowerStatsInternal; private TestPowerStatsInternal mPowerStatsInternal; @Before @Before public void setUp() { public void setUp() { final Context context = InstrumentationRegistry.getContext(); final Context context = InstrumentationRegistry.getContext(); mBatteryStatsImpl = new TestBatteryStatsImpl(context); BatteryStatsImpl batteryStats = new BatteryStatsImpl( new BatteryStatsImpl.BatteryStatsConfig.Builder().build(), Clock.SYSTEM_CLOCK, new MonotonicClock(0, Clock.SYSTEM_CLOCK), null, new Handler(Looper.getMainLooper()), null, null, null, new PowerProfile(context, true /* forTest */), buildScalingPolicies(), new PowerStatsUidResolver()); mPowerStatsInternal = new TestPowerStatsInternal(); mPowerStatsInternal = new TestPowerStatsInternal(); mBatteryExternalStatsWorker = new BatteryExternalStatsWorker(new TestInjector(context), mBatteryExternalStatsWorker = mBatteryStatsImpl); new BatteryExternalStatsWorker(new TestInjector(context), batteryStats); } } @Test @Test Loading Loading @@ -218,25 +226,17 @@ public class BatteryExternalStatsWorkerTest { } } } } public class TestBatteryStatsImpl extends BatteryStatsImpl { private static CpuScalingPolicies buildScalingPolicies() { public TestBatteryStatsImpl(Context context) { super(new BatteryStatsConfig.Builder().build(), Clock.SYSTEM_CLOCK, null, null, null, null, null, null); mPowerProfile = new PowerProfile(context, true /* forTest */); SparseArray<int[]> cpusByPolicy = new SparseArray<>(); SparseArray<int[]> cpusByPolicy = new SparseArray<>(); cpusByPolicy.put(0, new int[]{0, 1, 2, 3}); cpusByPolicy.put(0, new int[]{0, 1, 2, 3}); cpusByPolicy.put(4, new int[]{4, 5, 6, 7}); cpusByPolicy.put(4, new int[]{4, 5, 6, 7}); SparseArray<int[]> freqsByPolicy = new SparseArray<>(); SparseArray<int[]> freqsByPolicy = new SparseArray<>(); freqsByPolicy.put(0, new int[]{300000, 1000000, 2000000}); freqsByPolicy.put(0, new int[]{300000, 1000000, 2000000}); freqsByPolicy.put(4, new int[]{300000, 1000000, 2500000, 3000000}); freqsByPolicy.put(4, new int[]{300000, 1000000, 2500000, 3000000}); mCpuScalingPolicies = new CpuScalingPolicies(freqsByPolicy, freqsByPolicy); return new CpuScalingPolicies(freqsByPolicy, freqsByPolicy); initTimersAndCounters(); } } } public class TestPowerStatsInternal extends PowerStatsInternal { private static class TestPowerStatsInternal extends PowerStatsInternal { private final SparseArray<EnergyConsumer> mEnergyConsumers = new SparseArray(); private final SparseArray<EnergyConsumer> mEnergyConsumers = new SparseArray(); private final SparseArray<EnergyConsumerResult> mEnergyConsumerResults = new SparseArray(); private final SparseArray<EnergyConsumerResult> mEnergyConsumerResults = new SparseArray(); private final int mTimeSinceBoot = 0; private final int mTimeSinceBoot = 0; Loading services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java +7 −3 Original line number Original line Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeRea import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader; import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader; import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader; import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader; import com.android.internal.os.KernelSingleUidTimeReader; import com.android.internal.os.KernelSingleUidTimeReader; import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerProfile; import com.android.internal.power.EnergyConsumerStats; import com.android.internal.power.EnergyConsumerStats; Loading Loading @@ -73,10 +74,13 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, File historyDirectory, MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, File historyDirectory, Handler handler, PowerStatsUidResolver powerStatsUidResolver) { Handler handler, PowerStatsUidResolver powerStatsUidResolver) { super(config, clock, historyDirectory, handler, powerStatsUidResolver, super(config, clock, new MonotonicClock(0, clock), historyDirectory, handler, mock(FrameworkStatsLogger.class), mock(BatteryStatsHistory.TraceDelegate.class), mock(PlatformIdleStateCallback.class), mock(EnergyStatsRetriever.class), mock(UserInfoProvider.class), mock(PowerProfile.class), new CpuScalingPolicies(new SparseArray<>(), new SparseArray<>()), powerStatsUidResolver, mock(FrameworkStatsLogger.class), mock(BatteryStatsHistory.TraceDelegate.class), mock(BatteryStatsHistory.EventLogger.class)); mock(BatteryStatsHistory.EventLogger.class)); initTimersAndCounters(); setMaxHistoryBuffer(128 * 1024); setMaxHistoryBuffer(128 * 1024); setExternalStatsSyncLocked(mExternalStatsSync); setExternalStatsSyncLocked(mExternalStatsSync); Loading services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsAggregatorTest.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -58,7 +58,7 @@ public class PowerStatsAggregatorTest { @Before @Before public void setup() throws ParseException { public void setup() throws ParseException { mHistory = new BatteryStatsHistory(1024, mHistory = new BatteryStatsHistory(null, null, 0, 1024, mock(BatteryStatsHistory.HistoryStepDetailsCalculator.class), mClock, mock(BatteryStatsHistory.HistoryStepDetailsCalculator.class), mClock, mMonotonicClock, mock(BatteryStatsHistory.TraceDelegate.class), null); mMonotonicClock, mock(BatteryStatsHistory.TraceDelegate.class), null); Loading Loading
core/java/com/android/internal/os/BatteryStatsHistory.java +14 −49 Original line number Original line Diff line number Diff line Loading @@ -582,23 +582,6 @@ public class BatteryStatsHistory { * @param maxHistoryFiles the largest number of history buffer files to keep * @param maxHistoryFiles the largest number of history buffer files to keep * @param maxHistoryBufferSize the most amount of RAM to used for buffering of history steps * @param maxHistoryBufferSize the most amount of RAM to used for buffering of history steps */ */ public BatteryStatsHistory(File systemDir, int maxHistoryFiles, int maxHistoryBufferSize, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, MonotonicClock monotonicClock) { this(systemDir, maxHistoryFiles, maxHistoryBufferSize, stepDetailsCalculator, clock, monotonicClock, new TraceDelegate(), new EventLogger()); } public BatteryStatsHistory(File systemDir, int maxHistoryFiles, int maxHistoryBufferSize, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, MonotonicClock monotonicClock, TraceDelegate tracer, EventLogger eventLogger) { this(Parcel.obtain(), systemDir, maxHistoryFiles, maxHistoryBufferSize, stepDetailsCalculator, clock, monotonicClock, tracer, eventLogger); initHistoryBuffer(); } @VisibleForTesting public BatteryStatsHistory(Parcel historyBuffer, File systemDir, public BatteryStatsHistory(Parcel historyBuffer, File systemDir, int maxHistoryFiles, int maxHistoryBufferSize, int maxHistoryFiles, int maxHistoryBufferSize, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, Loading @@ -607,12 +590,11 @@ public class BatteryStatsHistory { clock, monotonicClock, tracer, eventLogger, null); clock, monotonicClock, tracer, eventLogger, null); } } private BatteryStatsHistory(Parcel historyBuffer, File systemDir, private BatteryStatsHistory(@Nullable Parcel historyBuffer, @Nullable File systemDir, int maxHistoryFiles, int maxHistoryBufferSize, int maxHistoryFiles, int maxHistoryBufferSize, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, @NonNull HistoryStepDetailsCalculator stepDetailsCalculator, @NonNull Clock clock, MonotonicClock monotonicClock, TraceDelegate tracer, EventLogger eventLogger, @NonNull MonotonicClock monotonicClock, @NonNull TraceDelegate tracer, BatteryStatsHistory writableHistory) { @NonNull EventLogger eventLogger, @Nullable BatteryStatsHistory writableHistory) { mHistoryBuffer = historyBuffer; mSystemDir = systemDir; mSystemDir = systemDir; mMaxHistoryBufferSize = maxHistoryBufferSize; mMaxHistoryBufferSize = maxHistoryBufferSize; mStepDetailsCalculator = stepDetailsCalculator; mStepDetailsCalculator = stepDetailsCalculator; Loading @@ -625,9 +607,16 @@ public class BatteryStatsHistory { mMutable = false; mMutable = false; } } if (historyBuffer != null) { mHistoryBuffer = historyBuffer; } else { mHistoryBuffer = Parcel.obtain(); initHistoryBuffer(); } if (writableHistory != null) { if (writableHistory != null) { mHistoryDir = writableHistory.mHistoryDir; mHistoryDir = writableHistory.mHistoryDir; } else { } else if (systemDir != null) { mHistoryDir = new BatteryHistoryDirectory(new File(systemDir, HISTORY_DIR), mHistoryDir = new BatteryHistoryDirectory(new File(systemDir, HISTORY_DIR), monotonicClock, maxHistoryFiles); monotonicClock, maxHistoryFiles); mHistoryDir.load(); mHistoryDir.load(); Loading @@ -636,33 +625,9 @@ public class BatteryStatsHistory { activeFile = mHistoryDir.makeBatteryHistoryFile(); activeFile = mHistoryDir.makeBatteryHistoryFile(); } } setActiveFile(activeFile); setActiveFile(activeFile); } } else { } public BatteryStatsHistory(int maxHistoryBufferSize, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, MonotonicClock monotonicClock) { this(maxHistoryBufferSize, stepDetailsCalculator, clock, monotonicClock, new TraceDelegate(), new EventLogger()); } @VisibleForTesting public BatteryStatsHistory(int maxHistoryBufferSize, HistoryStepDetailsCalculator stepDetailsCalculator, Clock clock, MonotonicClock monotonicClock, TraceDelegate traceDelegate, EventLogger eventLogger) { mMaxHistoryBufferSize = maxHistoryBufferSize; mStepDetailsCalculator = stepDetailsCalculator; mTracer = traceDelegate; mClock = clock; mMonotonicClock = monotonicClock; mEventLogger = eventLogger; mHistoryBuffer = Parcel.obtain(); mSystemDir = null; mHistoryDir = null; mHistoryDir = null; mWritableHistory = null; } initHistoryBuffer(); } } /** /** Loading
services/core/java/com/android/server/power/stats/BatteryStatsImpl.java +63 −84 Original line number Original line Diff line number Diff line Loading @@ -290,8 +290,8 @@ public class BatteryStatsImpl extends BatteryStats { private KernelMemoryBandwidthStats mKernelMemoryBandwidthStats; private KernelMemoryBandwidthStats mKernelMemoryBandwidthStats; private final LongSparseArray<SamplingTimer> mKernelMemoryStats = new LongSparseArray<>(); private final LongSparseArray<SamplingTimer> mKernelMemoryStats = new LongSparseArray<>(); private int[] mCpuPowerBracketMap; private int[] mCpuPowerBracketMap; private CpuPowerStatsCollector mCpuPowerStatsCollector; private final CpuPowerStatsCollector mCpuPowerStatsCollector; private MobileRadioPowerStatsCollector mMobileRadioPowerStatsCollector; private final MobileRadioPowerStatsCollector mMobileRadioPowerStatsCollector; private final SparseBooleanArray mPowerStatsCollectorEnabled = new SparseBooleanArray(); private final SparseBooleanArray mPowerStatsCollectorEnabled = new SparseBooleanArray(); public LongSparseArray<SamplingTimer> getKernelMemoryStats() { public LongSparseArray<SamplingTimer> getKernelMemoryStats() { Loading Loading @@ -1777,7 +1777,7 @@ public class BatteryStatsImpl extends BatteryStats { return mMaxLearnedBatteryCapacityUah; return mMaxLearnedBatteryCapacityUah; } } public class FrameworkStatsLogger { public static class FrameworkStatsLogger { public void uidProcessStateChanged(int uid, int state) { public void uidProcessStateChanged(int uid, int state) { // TODO(b/155216561): It is possible for isolated uids to be in a higher // TODO(b/155216561): It is possible for isolated uids to be in a higher // state than its parent uid. We should track the highest state within the union of host // state than its parent uid. We should track the highest state within the union of host Loading @@ -1786,25 +1786,24 @@ public class BatteryStatsImpl extends BatteryStats { ActivityManager.processStateAmToProto(state)); ActivityManager.processStateAmToProto(state)); } } public void wakelockStateChanged(int uid, WorkChain wc, String name, int type, public void wakelockStateChanged(int uid, WorkChain wc, String name, int procState, boolean acquired) { int procState, boolean acquired, int powerManagerWakeLockLevel) { int event = acquired int event = acquired ? FrameworkStatsLog.WAKELOCK_STATE_CHANGED__STATE__ACQUIRE ? FrameworkStatsLog.WAKELOCK_STATE_CHANGED__STATE__ACQUIRE : FrameworkStatsLog.WAKELOCK_STATE_CHANGED__STATE__RELEASE; : FrameworkStatsLog.WAKELOCK_STATE_CHANGED__STATE__RELEASE; if (wc != null) { if (wc != null) { FrameworkStatsLog.write(FrameworkStatsLog.WAKELOCK_STATE_CHANGED, wc.getUids(), FrameworkStatsLog.write(FrameworkStatsLog.WAKELOCK_STATE_CHANGED, wc.getUids(), wc.getTags(), getPowerManagerWakeLockLevel(type), name, wc.getTags(), powerManagerWakeLockLevel, name, event, procState); event, procState); } else { } else { FrameworkStatsLog.write_non_chained(FrameworkStatsLog.WAKELOCK_STATE_CHANGED, FrameworkStatsLog.write_non_chained(FrameworkStatsLog.WAKELOCK_STATE_CHANGED, uid, mapIsolatedUid(uid), null, getPowerManagerWakeLockLevel(type), name, null, powerManagerWakeLockLevel, name, event, procState); event, procState); } } } } public void kernelWakeupReported(long deltaUptimeUs) { public void kernelWakeupReported(long deltaUptimeUs, String lastWakeupReason, FrameworkStatsLog.write(FrameworkStatsLog.KERNEL_WAKEUP_REPORTED, mLastWakeupReason, long lastWakeupElapsedTimeMs) { /* duration_usec */ deltaUptimeUs, mLastWakeupElapsedTimeMs); FrameworkStatsLog.write(FrameworkStatsLog.KERNEL_WAKEUP_REPORTED, lastWakeupReason, /* duration_usec */ deltaUptimeUs, lastWakeupElapsedTimeMs); } } public void gpsScanStateChanged(int uid, WorkChain workChain, boolean stateOn) { public void gpsScanStateChanged(int uid, WorkChain workChain, boolean stateOn) { Loading Loading @@ -1868,41 +1867,6 @@ public class BatteryStatsImpl extends BatteryStats { private final FrameworkStatsLogger mFrameworkStatsLogger; private final FrameworkStatsLogger mFrameworkStatsLogger; @VisibleForTesting public BatteryStatsImpl(@NonNull BatteryStatsConfig config, Clock clock, File historyDirectory, @NonNull Handler handler, @NonNull PowerStatsUidResolver powerStatsUidResolver, @NonNull FrameworkStatsLogger frameworkStatsLogger, @NonNull BatteryStatsHistory.TraceDelegate traceDelegate, @NonNull BatteryStatsHistory.EventLogger eventLogger) { mBatteryStatsConfig = config; mClock = clock; initKernelStatsReaders(); mHandler = handler; mPowerStatsUidResolver = powerStatsUidResolver; mFrameworkStatsLogger = frameworkStatsLogger; mConstants = new Constants(mHandler); mStartClockTimeMs = clock.currentTimeMillis(); mDailyFile = null; mMonotonicClock = new MonotonicClock(0, mClock); if (historyDirectory == null) { mCheckinFile = null; mStatsFile = null; mHistory = new BatteryStatsHistory(mConstants.MAX_HISTORY_BUFFER, mStepDetailsCalculator, mClock, mMonotonicClock, traceDelegate, eventLogger); } else { mCheckinFile = new AtomicFile(new File(historyDirectory, "batterystats-checkin.bin")); mStatsFile = new AtomicFile(new File(historyDirectory, "batterystats.bin")); mHistory = new BatteryStatsHistory(historyDirectory, mConstants.MAX_HISTORY_FILES, mConstants.MAX_HISTORY_BUFFER, mStepDetailsCalculator, mClock, mMonotonicClock, traceDelegate, eventLogger); } mPlatformIdleStateCallback = null; mEnergyConsumerRetriever = null; mUserInfoProvider = null; initPowerStatsCollectors(); } private void initKernelStatsReaders() { private void initKernelStatsReaders() { if (!isKernelStatsAvailable()) { if (!isKernelStatsAvailable()) { return; return; Loading Loading @@ -2006,19 +1970,6 @@ public class BatteryStatsImpl extends BatteryStats { private final PowerStatsCollectorInjector mPowerStatsCollectorInjector = private final PowerStatsCollectorInjector mPowerStatsCollectorInjector = new PowerStatsCollectorInjector(); new PowerStatsCollectorInjector(); @SuppressWarnings("GuardedBy") // Accessed from constructor only private void initPowerStatsCollectors() { mCpuPowerStatsCollector = new CpuPowerStatsCollector(mPowerStatsCollectorInjector, mBatteryStatsConfig.getPowerStatsThrottlePeriod( BatteryConsumer.POWER_COMPONENT_CPU)); mCpuPowerStatsCollector.addConsumer(this::recordPowerStats); mMobileRadioPowerStatsCollector = new MobileRadioPowerStatsCollector( mPowerStatsCollectorInjector, mBatteryStatsConfig.getPowerStatsThrottlePeriod( BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)); mMobileRadioPowerStatsCollector.addConsumer(this::recordPowerStats); } /** /** * TimeBase observer. * TimeBase observer. */ */ Loading Loading @@ -4975,8 +4926,9 @@ public class BatteryStatsImpl extends BatteryStats { Uid uidStats = getUidStatsLocked(mappedUid, elapsedRealtimeMs, uptimeMs); Uid uidStats = getUidStatsLocked(mappedUid, elapsedRealtimeMs, uptimeMs); uidStats.noteStartWakeLocked(pid, name, type, elapsedRealtimeMs); uidStats.noteStartWakeLocked(pid, name, type, elapsedRealtimeMs); mFrameworkStatsLogger.wakelockStateChanged(mapIsolatedUid(uid), wc, name, type, mFrameworkStatsLogger.wakelockStateChanged(mapIsolatedUid(uid), wc, name, uidStats.mProcessState, true /* acquired */); uidStats.mProcessState, true /* acquired */, getPowerManagerWakeLockLevel(type)); } } } } Loading Loading @@ -5019,8 +4971,9 @@ public class BatteryStatsImpl extends BatteryStats { Uid uidStats = getUidStatsLocked(mappedUid, elapsedRealtimeMs, uptimeMs); Uid uidStats = getUidStatsLocked(mappedUid, elapsedRealtimeMs, uptimeMs); uidStats.noteStopWakeLocked(pid, name, type, elapsedRealtimeMs); uidStats.noteStopWakeLocked(pid, name, type, elapsedRealtimeMs); mFrameworkStatsLogger.wakelockStateChanged(mapIsolatedUid(uid), wc, name, type, mFrameworkStatsLogger.wakelockStateChanged(mapIsolatedUid(uid), wc, name, uidStats.mProcessState, false /* acquired */); uidStats.mProcessState, false/* acquired */, getPowerManagerWakeLockLevel(type)); if (mappedUid != uid) { if (mappedUid != uid) { // Decrement the ref count for the isolated uid and delete the mapping if uneeded. // Decrement the ref count for the isolated uid and delete the mapping if uneeded. Loading @@ -5036,8 +4989,8 @@ public class BatteryStatsImpl extends BatteryStats { * TODO: Delete this. Instead, FrameworkStatsLog.write should be called from * TODO: Delete this. Instead, FrameworkStatsLog.write should be called from * PowerManager's Notifier. * PowerManager's Notifier. */ */ private int getPowerManagerWakeLockLevel(int battertStatsWakelockType) { private int getPowerManagerWakeLockLevel(int batteryStatsWakelockType) { switch (battertStatsWakelockType) { switch (batteryStatsWakelockType) { // PowerManager.PARTIAL_WAKE_LOCK or PROXIMITY_SCREEN_OFF_WAKE_LOCK // PowerManager.PARTIAL_WAKE_LOCK or PROXIMITY_SCREEN_OFF_WAKE_LOCK case BatteryStats.WAKE_TYPE_PARTIAL: case BatteryStats.WAKE_TYPE_PARTIAL: return PowerManager.PARTIAL_WAKE_LOCK; return PowerManager.PARTIAL_WAKE_LOCK; Loading @@ -5055,7 +5008,7 @@ public class BatteryStatsImpl extends BatteryStats { return -1; return -1; default: default: Slog.e(TAG, "Illegal wakelock type in batterystats: " + battertStatsWakelockType); Slog.e(TAG, "Illegal wakelock type in batterystats: " + batteryStatsWakelockType); return -1; return -1; } } } } Loading Loading @@ -5257,7 +5210,8 @@ public class BatteryStatsImpl extends BatteryStats { long deltaUptimeMs = uptimeMs - mLastWakeupUptimeMs; long deltaUptimeMs = uptimeMs - mLastWakeupUptimeMs; SamplingTimer timer = getWakeupReasonTimerLocked(mLastWakeupReason); SamplingTimer timer = getWakeupReasonTimerLocked(mLastWakeupReason); timer.add(deltaUptimeMs * 1000, 1, elapsedRealtimeMs); // time in in microseconds timer.add(deltaUptimeMs * 1000, 1, elapsedRealtimeMs); // time in in microseconds mFrameworkStatsLogger.kernelWakeupReported(deltaUptimeMs * 1000); mFrameworkStatsLogger.kernelWakeupReported(deltaUptimeMs * 1000, mLastWakeupReason, mLastWakeupElapsedTimeMs); mLastWakeupReason = null; mLastWakeupReason = null; } } } } Loading Loading @@ -11094,11 +11048,27 @@ public class BatteryStatsImpl extends BatteryStats { public BatteryStatsImpl(@NonNull BatteryStatsConfig config, @NonNull Clock clock, public BatteryStatsImpl(@NonNull BatteryStatsConfig config, @NonNull Clock clock, @NonNull MonotonicClock monotonicClock, @Nullable File systemDir, @NonNull MonotonicClock monotonicClock, @Nullable File systemDir, @NonNull Handler handler, @Nullable PlatformIdleStateCallback cb, @NonNull Handler handler, @Nullable PlatformIdleStateCallback platformIdleStateCallback, @Nullable EnergyStatsRetriever energyStatsCb, @Nullable EnergyStatsRetriever energyStatsRetriever, @NonNull UserInfoProvider userInfoProvider, @NonNull PowerProfile powerProfile, @NonNull UserInfoProvider userInfoProvider, @NonNull PowerProfile powerProfile, @NonNull CpuScalingPolicies cpuScalingPolicies, @NonNull CpuScalingPolicies cpuScalingPolicies, @NonNull PowerStatsUidResolver powerStatsUidResolver) { @NonNull PowerStatsUidResolver powerStatsUidResolver) { this(config, clock, monotonicClock, systemDir, handler, platformIdleStateCallback, energyStatsRetriever, userInfoProvider, powerProfile, cpuScalingPolicies, powerStatsUidResolver, new FrameworkStatsLogger(), new BatteryStatsHistory.TraceDelegate(), new BatteryStatsHistory.EventLogger()); } public BatteryStatsImpl(@NonNull BatteryStatsConfig config, @NonNull Clock clock, @NonNull MonotonicClock monotonicClock, @Nullable File systemDir, @NonNull Handler handler, @Nullable PlatformIdleStateCallback platformIdleStateCallback, @Nullable EnergyStatsRetriever energyStatsRetriever, @NonNull UserInfoProvider userInfoProvider, @NonNull PowerProfile powerProfile, @NonNull CpuScalingPolicies cpuScalingPolicies, @NonNull PowerStatsUidResolver powerStatsUidResolver, @NonNull FrameworkStatsLogger frameworkStatsLogger, @NonNull BatteryStatsHistory.TraceDelegate traceDelegate, @NonNull BatteryStatsHistory.EventLogger eventLogger) { mClock = clock; mClock = clock; initKernelStatsReaders(); initKernelStatsReaders(); Loading @@ -11110,25 +11080,34 @@ public class BatteryStatsImpl extends BatteryStats { mPowerProfile = powerProfile; mPowerProfile = powerProfile; mCpuScalingPolicies = cpuScalingPolicies; mCpuScalingPolicies = cpuScalingPolicies; mPowerStatsUidResolver = powerStatsUidResolver; mPowerStatsUidResolver = powerStatsUidResolver; mFrameworkStatsLogger = new FrameworkStatsLogger(); mFrameworkStatsLogger = frameworkStatsLogger; initPowerProfile(); initPowerProfile(); if (systemDir == null) { if (systemDir != null) { mStatsFile = null; mCheckinFile = null; mDailyFile = null; mHistory = new BatteryStatsHistory(mConstants.MAX_HISTORY_BUFFER, mStepDetailsCalculator, mClock, mMonotonicClock); } else { mStatsFile = new AtomicFile(new File(systemDir, "batterystats.bin")); mStatsFile = new AtomicFile(new File(systemDir, "batterystats.bin")); mCheckinFile = new AtomicFile(new File(systemDir, "batterystats-checkin.bin")); mCheckinFile = new AtomicFile(new File(systemDir, "batterystats-checkin.bin")); mDailyFile = new AtomicFile(new File(systemDir, "batterystats-daily.xml")); mDailyFile = new AtomicFile(new File(systemDir, "batterystats-daily.xml")); mHistory = new BatteryStatsHistory(systemDir, mConstants.MAX_HISTORY_FILES, } else { mConstants.MAX_HISTORY_BUFFER, mStepDetailsCalculator, mClock, mMonotonicClock); mStatsFile = null; mCheckinFile = null; mDailyFile = null; } } initPowerStatsCollectors(); mHistory = new BatteryStatsHistory(null /* historyBuffer */, systemDir, mConstants.MAX_HISTORY_FILES, mConstants.MAX_HISTORY_BUFFER, mStepDetailsCalculator, mClock, mMonotonicClock, traceDelegate, eventLogger); mCpuPowerStatsCollector = new CpuPowerStatsCollector(mPowerStatsCollectorInjector, mBatteryStatsConfig.getPowerStatsThrottlePeriod( BatteryConsumer.POWER_COMPONENT_CPU)); mCpuPowerStatsCollector.addConsumer(this::recordPowerStats); mMobileRadioPowerStatsCollector = new MobileRadioPowerStatsCollector( mPowerStatsCollectorInjector, mBatteryStatsConfig.getPowerStatsThrottlePeriod( BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO)); mMobileRadioPowerStatsCollector.addConsumer(this::recordPowerStats); mStartCount++; mStartCount++; initTimersAndCounters(); initTimersAndCounters(); mOnBattery = mOnBatteryInternal = false; mOnBattery = mOnBatteryInternal = false; Loading @@ -11138,8 +11117,8 @@ public class BatteryStatsImpl extends BatteryStats { mStartPlatformVersion = mEndPlatformVersion = Build.ID; mStartPlatformVersion = mEndPlatformVersion = Build.ID; initDischarge(realtimeUs); initDischarge(realtimeUs); updateDailyDeadlineLocked(); updateDailyDeadlineLocked(); mPlatformIdleStateCallback = cb; mPlatformIdleStateCallback = platformIdleStateCallback; mEnergyConsumerRetriever = energyStatsCb; mEnergyConsumerRetriever = energyStatsRetriever; mUserInfoProvider = userInfoProvider; mUserInfoProvider = userInfoProvider; mPowerStatsUidResolver.addListener(new PowerStatsUidResolver.Listener() { mPowerStatsUidResolver.addListener(new PowerStatsUidResolver.Listener() { Loading
services/tests/powerstatstests/src/com/android/server/power/stats/BatteryExternalStatsWorkerTest.java +21 −21 Original line number Original line Diff line number Diff line Loading @@ -36,6 +36,8 @@ import android.hardware.power.stats.EnergyConsumerType; import android.hardware.power.stats.EnergyMeasurement; import android.hardware.power.stats.EnergyMeasurement; import android.hardware.power.stats.PowerEntity; import android.hardware.power.stats.PowerEntity; import android.hardware.power.stats.StateResidencyResult; import android.hardware.power.stats.StateResidencyResult; import android.os.Handler; import android.os.Looper; import android.platform.test.ravenwood.RavenwoodRule; import android.platform.test.ravenwood.RavenwoodRule; import android.power.PowerStatsInternal; import android.power.PowerStatsInternal; import android.util.IntArray; import android.util.IntArray; Loading @@ -45,6 +47,7 @@ import androidx.test.InstrumentationRegistry; import com.android.internal.os.Clock; import com.android.internal.os.Clock; import com.android.internal.os.CpuScalingPolicies; import com.android.internal.os.CpuScalingPolicies; import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerProfile; import org.junit.Before; import org.junit.Before; Loading @@ -65,18 +68,23 @@ import java.util.concurrent.CompletableFuture; public class BatteryExternalStatsWorkerTest { public class BatteryExternalStatsWorkerTest { @Rule @Rule public final RavenwoodRule mRavenwood = new RavenwoodRule(); public final RavenwoodRule mRavenwood = new RavenwoodRule(); private BatteryExternalStatsWorker mBatteryExternalStatsWorker; private BatteryExternalStatsWorker mBatteryExternalStatsWorker; private TestBatteryStatsImpl mBatteryStatsImpl; private TestPowerStatsInternal mPowerStatsInternal; private TestPowerStatsInternal mPowerStatsInternal; @Before @Before public void setUp() { public void setUp() { final Context context = InstrumentationRegistry.getContext(); final Context context = InstrumentationRegistry.getContext(); mBatteryStatsImpl = new TestBatteryStatsImpl(context); BatteryStatsImpl batteryStats = new BatteryStatsImpl( new BatteryStatsImpl.BatteryStatsConfig.Builder().build(), Clock.SYSTEM_CLOCK, new MonotonicClock(0, Clock.SYSTEM_CLOCK), null, new Handler(Looper.getMainLooper()), null, null, null, new PowerProfile(context, true /* forTest */), buildScalingPolicies(), new PowerStatsUidResolver()); mPowerStatsInternal = new TestPowerStatsInternal(); mPowerStatsInternal = new TestPowerStatsInternal(); mBatteryExternalStatsWorker = new BatteryExternalStatsWorker(new TestInjector(context), mBatteryExternalStatsWorker = mBatteryStatsImpl); new BatteryExternalStatsWorker(new TestInjector(context), batteryStats); } } @Test @Test Loading Loading @@ -218,25 +226,17 @@ public class BatteryExternalStatsWorkerTest { } } } } public class TestBatteryStatsImpl extends BatteryStatsImpl { private static CpuScalingPolicies buildScalingPolicies() { public TestBatteryStatsImpl(Context context) { super(new BatteryStatsConfig.Builder().build(), Clock.SYSTEM_CLOCK, null, null, null, null, null, null); mPowerProfile = new PowerProfile(context, true /* forTest */); SparseArray<int[]> cpusByPolicy = new SparseArray<>(); SparseArray<int[]> cpusByPolicy = new SparseArray<>(); cpusByPolicy.put(0, new int[]{0, 1, 2, 3}); cpusByPolicy.put(0, new int[]{0, 1, 2, 3}); cpusByPolicy.put(4, new int[]{4, 5, 6, 7}); cpusByPolicy.put(4, new int[]{4, 5, 6, 7}); SparseArray<int[]> freqsByPolicy = new SparseArray<>(); SparseArray<int[]> freqsByPolicy = new SparseArray<>(); freqsByPolicy.put(0, new int[]{300000, 1000000, 2000000}); freqsByPolicy.put(0, new int[]{300000, 1000000, 2000000}); freqsByPolicy.put(4, new int[]{300000, 1000000, 2500000, 3000000}); freqsByPolicy.put(4, new int[]{300000, 1000000, 2500000, 3000000}); mCpuScalingPolicies = new CpuScalingPolicies(freqsByPolicy, freqsByPolicy); return new CpuScalingPolicies(freqsByPolicy, freqsByPolicy); initTimersAndCounters(); } } } public class TestPowerStatsInternal extends PowerStatsInternal { private static class TestPowerStatsInternal extends PowerStatsInternal { private final SparseArray<EnergyConsumer> mEnergyConsumers = new SparseArray(); private final SparseArray<EnergyConsumer> mEnergyConsumers = new SparseArray(); private final SparseArray<EnergyConsumerResult> mEnergyConsumerResults = new SparseArray(); private final SparseArray<EnergyConsumerResult> mEnergyConsumerResults = new SparseArray(); private final int mTimeSinceBoot = 0; private final int mTimeSinceBoot = 0; Loading
services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java +7 −3 Original line number Original line Diff line number Diff line Loading @@ -35,6 +35,7 @@ import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidClusterTimeRea import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader; import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidFreqTimeReader; import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader; import com.android.internal.os.KernelCpuUidTimeReader.KernelCpuUidUserSysTimeReader; import com.android.internal.os.KernelSingleUidTimeReader; import com.android.internal.os.KernelSingleUidTimeReader; import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerProfile; import com.android.internal.power.EnergyConsumerStats; import com.android.internal.power.EnergyConsumerStats; Loading Loading @@ -73,10 +74,13 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, File historyDirectory, MockBatteryStatsImpl(BatteryStatsConfig config, Clock clock, File historyDirectory, Handler handler, PowerStatsUidResolver powerStatsUidResolver) { Handler handler, PowerStatsUidResolver powerStatsUidResolver) { super(config, clock, historyDirectory, handler, powerStatsUidResolver, super(config, clock, new MonotonicClock(0, clock), historyDirectory, handler, mock(FrameworkStatsLogger.class), mock(BatteryStatsHistory.TraceDelegate.class), mock(PlatformIdleStateCallback.class), mock(EnergyStatsRetriever.class), mock(UserInfoProvider.class), mock(PowerProfile.class), new CpuScalingPolicies(new SparseArray<>(), new SparseArray<>()), powerStatsUidResolver, mock(FrameworkStatsLogger.class), mock(BatteryStatsHistory.TraceDelegate.class), mock(BatteryStatsHistory.EventLogger.class)); mock(BatteryStatsHistory.EventLogger.class)); initTimersAndCounters(); setMaxHistoryBuffer(128 * 1024); setMaxHistoryBuffer(128 * 1024); setExternalStatsSyncLocked(mExternalStatsSync); setExternalStatsSyncLocked(mExternalStatsSync); Loading
services/tests/powerstatstests/src/com/android/server/power/stats/PowerStatsAggregatorTest.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -58,7 +58,7 @@ public class PowerStatsAggregatorTest { @Before @Before public void setup() throws ParseException { public void setup() throws ParseException { mHistory = new BatteryStatsHistory(1024, mHistory = new BatteryStatsHistory(null, null, 0, 1024, mock(BatteryStatsHistory.HistoryStepDetailsCalculator.class), mClock, mock(BatteryStatsHistory.HistoryStepDetailsCalculator.class), mClock, mMonotonicClock, mock(BatteryStatsHistory.TraceDelegate.class), null); mMonotonicClock, mock(BatteryStatsHistory.TraceDelegate.class), null); Loading