Loading core/java/android/os/BatteryUsageStats.java +50 −1 Original line number Diff line number Diff line Loading @@ -75,8 +75,10 @@ public final class BatteryUsageStats implements Parcelable { public static final int AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT = 2; private final int mDischargePercentage; private final long mStatsStartTimestampMs; private final double mBatteryCapacityMah; private final long mStatsStartTimestampMs; private final long mStatsEndTimestampMs; private final long mStatsDurationMs; private final double mDischargedPowerLowerBound; private final double mDischargedPowerUpperBound; private final long mBatteryTimeRemainingMs; Loading @@ -90,6 +92,12 @@ public final class BatteryUsageStats implements Parcelable { private BatteryUsageStats(@NonNull Builder builder) { mStatsStartTimestampMs = builder.mStatsStartTimestampMs; mStatsEndTimestampMs = builder.mStatsEndTimestampMs; if (builder.mStatsDurationMs != -1) { mStatsDurationMs = builder.mStatsDurationMs; } else { mStatsDurationMs = mStatsEndTimestampMs - mStatsStartTimestampMs; } mBatteryCapacityMah = builder.mBatteryCapacityMah; mDischargePercentage = builder.mDischargePercentage; mDischargedPowerLowerBound = builder.mDischargedPowerLowerBoundMah; Loading Loading @@ -140,6 +148,24 @@ public final class BatteryUsageStats implements Parcelable { return mStatsStartTimestampMs; } /** * Timestamp (as returned by System.currentTimeMillis()) of when the stats snapshot was taken, * in milliseconds. */ public long getStatsEndTimestamp() { return mStatsEndTimestampMs; } /** * Returns the duration of the stats session captured by this BatteryUsageStats. * In rare cases, statsDuration != statsEndTimestamp - statsStartTimestamp. This may * happen when BatteryUsageStats represents an accumulation of data across multiple * non-contiguous sessions. */ public long getStatsDuration() { return mStatsDurationMs; } /** * Total amount of battery charge drained since BatteryStats reset (e.g. due to being fully * charged), in mAh Loading Loading @@ -229,6 +255,8 @@ public final class BatteryUsageStats implements Parcelable { private BatteryUsageStats(@NonNull Parcel source) { mStatsStartTimestampMs = source.readLong(); mStatsEndTimestampMs = source.readLong(); mStatsDurationMs = source.readLong(); mBatteryCapacityMah = source.readDouble(); mDischargePercentage = source.readInt(); mDischargedPowerLowerBound = source.readDouble(); Loading Loading @@ -287,6 +315,8 @@ public final class BatteryUsageStats implements Parcelable { @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeLong(mStatsStartTimestampMs); dest.writeLong(mStatsEndTimestampMs); dest.writeLong(mStatsDurationMs); dest.writeDouble(mBatteryCapacityMah); dest.writeInt(mDischargePercentage); dest.writeDouble(mDischargedPowerLowerBound); Loading Loading @@ -441,6 +471,8 @@ public final class BatteryUsageStats implements Parcelable { private final String[] mCustomPowerComponentNames; private final boolean mIncludePowerModels; private long mStatsStartTimestampMs; private long mStatsEndTimestampMs; private long mStatsDurationMs = -1; private double mBatteryCapacityMah; private int mDischargePercentage; private double mDischargedPowerLowerBoundMah; Loading Loading @@ -493,6 +525,23 @@ public final class BatteryUsageStats implements Parcelable { return this; } /** * Sets the timestamp of when the battery stats snapshot was taken, in milliseconds. */ public Builder setStatsEndTimestamp(long statsEndTimestampMs) { mStatsEndTimestampMs = statsEndTimestampMs; return this; } /** * Sets the duration of the stats session. The default value of this field is * statsEndTimestamp - statsStartTimestamp. */ public Builder setStatsDuration(long statsDurationMs) { mStatsDurationMs = statsDurationMs; return this; } /** * Sets the battery discharge amount since BatteryStats reset as percentage of the full * charge. Loading core/java/com/android/internal/os/BatteryStatsImpl.java +29 −15 Original line number Diff line number Diff line Loading @@ -610,18 +610,32 @@ public class BatteryStatsImpl extends BatteryStats { } public interface Clocks { public long elapsedRealtime(); public long uptimeMillis(); /** Elapsed Realtime, see SystemClock.elapsedRealtime() */ long elapsedRealtime(); /** Uptime, see SystemClock.uptimeMillis() */ long uptimeMillis(); /** Wall-clock time as per System.currentTimeMillis() */ long currentTimeMillis(); } public static class SystemClocks implements Clocks { @Override public long elapsedRealtime() { return SystemClock.elapsedRealtime(); } @Override public long uptimeMillis() { return SystemClock.uptimeMillis(); } @Override public long currentTimeMillis() { return System.currentTimeMillis(); } } public interface ExternalStatsSync { Loading Loading @@ -1163,7 +1177,7 @@ public class BatteryStatsImpl extends BatteryStats { public BatteryStatsImpl(Clocks clocks) { init(clocks); mStartClockTimeMs = System.currentTimeMillis(); mStartClockTimeMs = clocks.currentTimeMillis(); mStatsFile = null; mCheckinFile = null; mDailyFile = null; Loading Loading @@ -3694,7 +3708,7 @@ public class BatteryStatsImpl extends BatteryStats { if (dataSize == 0) { // The history is currently empty; we need it to start with a time stamp. cur.currentTime = System.currentTimeMillis(); cur.currentTime = mClocks.currentTimeMillis(); addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_RESET, cur); } addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE, cur); Loading Loading @@ -3914,7 +3928,7 @@ public class BatteryStatsImpl extends BatteryStats { } public void noteCurrentTimeChangedLocked() { final long currentTime = System.currentTimeMillis(); final long currentTime = mClocks.currentTimeMillis(); final long elapsedRealtime = mClocks.elapsedRealtime(); final long uptime = mClocks.uptimeMillis(); noteCurrentTimeChangedLocked(currentTime, elapsedRealtime, uptime); Loading Loading @@ -4237,7 +4251,7 @@ public class BatteryStatsImpl extends BatteryStats { if (mPretendScreenOff != pretendScreenOff) { mPretendScreenOff = pretendScreenOff; noteScreenStateLocked(pretendScreenOff ? Display.STATE_OFF : Display.STATE_ON, mClocks.elapsedRealtime(), mClocks.uptimeMillis(), System.currentTimeMillis()); mClocks.elapsedRealtime(), mClocks.uptimeMillis(), mClocks.currentTimeMillis()); } } Loading Loading @@ -4827,7 +4841,7 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") public void noteScreenStateLocked(int state) { noteScreenStateLocked(state, mClocks.elapsedRealtime(), mClocks.uptimeMillis(), System.currentTimeMillis()); mClocks.currentTimeMillis()); } @GuardedBy("this") Loading Loading @@ -6972,7 +6986,7 @@ public class BatteryStatsImpl extends BatteryStats { } @Override public long getStartClockTime() { final long currentTimeMs = System.currentTimeMillis(); final long currentTimeMs = mClocks.currentTimeMillis(); if ((currentTimeMs > MILLISECONDS_IN_YEAR && mStartClockTimeMs < (currentTimeMs - MILLISECONDS_IN_YEAR)) || (mStartClockTimeMs > currentTimeMs)) { Loading Loading @@ -10735,7 +10749,7 @@ public class BatteryStatsImpl extends BatteryStats { public void updateDailyDeadlineLocked() { // Get the current time. long currentTimeMs = mDailyStartTimeMs = System.currentTimeMillis(); long currentTimeMs = mDailyStartTimeMs = mClocks.currentTimeMillis(); Calendar calDeadline = Calendar.getInstance(); calDeadline.setTimeInMillis(currentTimeMs); Loading Loading @@ -10763,7 +10777,7 @@ public class BatteryStatsImpl extends BatteryStats { public void recordDailyStatsLocked() { DailyItem item = new DailyItem(); item.mStartTime = mDailyStartTimeMs; item.mEndTime = System.currentTimeMillis(); item.mEndTime = mClocks.currentTimeMillis(); boolean hasData = false; if (mDailyDischargeStepTracker.mNumStepDurations > 0) { hasData = true; Loading Loading @@ -11128,7 +11142,7 @@ public class BatteryStatsImpl extends BatteryStats { } void initTimes(long uptimeUs, long realtimeUs) { mStartClockTimeMs = System.currentTimeMillis(); mStartClockTimeMs = mClocks.currentTimeMillis(); mOnBatteryTimeBase.init(uptimeUs, realtimeUs); mOnBatteryScreenOffTimeBase.init(uptimeUs, realtimeUs); mRealtimeUs = 0; Loading Loading @@ -13562,7 +13576,7 @@ public class BatteryStatsImpl extends BatteryStats { private void startRecordingHistory(final long elapsedRealtimeMs, final long uptimeMs, boolean reset) { mRecordingHistory = true; mHistoryCur.currentTime = System.currentTimeMillis(); mHistoryCur.currentTime = mClocks.currentTimeMillis(); addHistoryBufferLocked(elapsedRealtimeMs, reset ? HistoryItem.CMD_RESET : HistoryItem.CMD_CURRENT_TIME, mHistoryCur); Loading Loading @@ -13604,7 +13618,7 @@ public class BatteryStatsImpl extends BatteryStats { final int chargeFullUah, final long chargeTimeToFullSeconds) { setBatteryStateLocked(status, health, plugType, level, temp, voltageMv, chargeUah, chargeFullUah, chargeTimeToFullSeconds, mClocks.elapsedRealtime(), mClocks.uptimeMillis(), System.currentTimeMillis()); mClocks.elapsedRealtime(), mClocks.uptimeMillis(), mClocks.currentTimeMillis()); } public void setBatteryStateLocked(final int status, final int health, final int plugType, Loading Loading @@ -14389,7 +14403,7 @@ public class BatteryStatsImpl extends BatteryStats { } public void shutdownLocked() { recordShutdownLocked(System.currentTimeMillis(), mClocks.elapsedRealtime()); recordShutdownLocked(mClocks.currentTimeMillis(), mClocks.elapsedRealtime()); writeSyncLocked(); mShuttingDown = true; } Loading Loading @@ -14938,7 +14952,7 @@ public class BatteryStatsImpl extends BatteryStats { startRecordingHistory(elapsedRealtimeMs, uptimeMs, false); } recordDailyStatsIfNeededLocked(false, System.currentTimeMillis()); recordDailyStatsIfNeededLocked(false, mClocks.currentTimeMillis()); } public int describeContents() { core/java/com/android/internal/os/BatteryUsageStatsProvider.java +18 −2 Original line number Diff line number Diff line Loading @@ -108,9 +108,9 @@ public class BatteryUsageStatsProvider { ArrayList<BatteryUsageStats> results = new ArrayList<>(queries.size()); synchronized (mStats) { mStats.prepareForDumpLocked(); final long currentTimeMillis = currentTimeMillis(); for (int i = 0; i < queries.size(); i++) { results.add(getBatteryUsageStats(queries.get(i))); results.add(getBatteryUsageStats(queries.get(i), currentTimeMillis)); } } return results; Loading @@ -121,6 +121,11 @@ public class BatteryUsageStatsProvider { */ @VisibleForTesting public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) { return getBatteryUsageStats(query, currentTimeMillis()); } private BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query, long currentTimeMs) { final long realtimeUs = elapsedRealtime() * 1000; final long uptimeUs = uptimeMillis() * 1000; Loading @@ -129,7 +134,10 @@ public class BatteryUsageStatsProvider { final BatteryUsageStats.Builder batteryUsageStatsBuilder = new BatteryUsageStats.Builder( mStats.getCustomEnergyConsumerNames(), includePowerModels); // TODO(b/188068523): use a monotonic clock to ensure resilience of order and duration // of stats sessions to wall-clock adjustments batteryUsageStatsBuilder.setStatsStartTimestamp(mStats.getStartClockTime()); batteryUsageStatsBuilder.setStatsEndTimestamp(currentTimeMs); SparseArray<? extends BatteryStats.Uid> uidStats = mStats.getUidStats(); for (int i = uidStats.size() - 1; i >= 0; i--) { Loading Loading @@ -217,4 +225,12 @@ public class BatteryUsageStatsProvider { return SystemClock.uptimeMillis(); } } private long currentTimeMillis() { if (mStats instanceof BatteryStatsImpl) { return ((BatteryStatsImpl) mStats).mClocks.currentTimeMillis(); } else { return System.currentTimeMillis(); } } } core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java +6 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ public class BatteryUsageStatsProviderTest { private static final long MINUTE_IN_MS = 60 * 1000; @Rule public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule(); public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule(12345); @Test public void test_getBatteryUsageStats() { Loading @@ -62,6 +62,8 @@ public class BatteryUsageStatsProviderTest { batteryStats.noteUidProcessStateLocked(APP_UID, ActivityManager.PROCESS_STATE_CACHED_EMPTY, 40 * MINUTE_IN_MS, 40 * MINUTE_IN_MS); mStatsRule.setCurrentTime(54321); Context context = InstrumentationRegistry.getContext(); BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(context, batteryStats); Loading @@ -75,6 +77,9 @@ public class BatteryUsageStatsProviderTest { .isEqualTo(20 * MINUTE_IN_MS); assertThat(uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND)) .isEqualTo(10 * MINUTE_IN_MS); assertThat(batteryUsageStats.getStatsStartTimestamp()).isEqualTo(12345); assertThat(batteryUsageStats.getStatsEndTimestamp()).isEqualTo(54321); } @Test Loading core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java +9 −0 Original line number Diff line number Diff line Loading @@ -57,8 +57,13 @@ public class BatteryUsageStatsRule implements TestRule { private boolean mScreenOn; public BatteryUsageStatsRule() { this(0); } public BatteryUsageStatsRule(long currentTime) { Context context = InstrumentationRegistry.getContext(); mPowerProfile = spy(new PowerProfile(context, true /* forTest */)); mMockClocks.currentTime = currentTime; mBatteryStats = new MockBatteryStatsImpl(mMockClocks); mBatteryStats.setPowerProfile(mPowerProfile); } Loading Loading @@ -164,6 +169,10 @@ public class BatteryUsageStatsRule implements TestRule { mMockClocks.uptime = uptimeMs; } public void setCurrentTime(long currentTimeMs) { mMockClocks.currentTime = currentTimeMs; } BatteryUsageStats apply(PowerCalculator... calculators) { return apply(new BatteryUsageStatsQuery.Builder().includePowerModels().build(), calculators); Loading Loading
core/java/android/os/BatteryUsageStats.java +50 −1 Original line number Diff line number Diff line Loading @@ -75,8 +75,10 @@ public final class BatteryUsageStats implements Parcelable { public static final int AGGREGATE_BATTERY_CONSUMER_SCOPE_COUNT = 2; private final int mDischargePercentage; private final long mStatsStartTimestampMs; private final double mBatteryCapacityMah; private final long mStatsStartTimestampMs; private final long mStatsEndTimestampMs; private final long mStatsDurationMs; private final double mDischargedPowerLowerBound; private final double mDischargedPowerUpperBound; private final long mBatteryTimeRemainingMs; Loading @@ -90,6 +92,12 @@ public final class BatteryUsageStats implements Parcelable { private BatteryUsageStats(@NonNull Builder builder) { mStatsStartTimestampMs = builder.mStatsStartTimestampMs; mStatsEndTimestampMs = builder.mStatsEndTimestampMs; if (builder.mStatsDurationMs != -1) { mStatsDurationMs = builder.mStatsDurationMs; } else { mStatsDurationMs = mStatsEndTimestampMs - mStatsStartTimestampMs; } mBatteryCapacityMah = builder.mBatteryCapacityMah; mDischargePercentage = builder.mDischargePercentage; mDischargedPowerLowerBound = builder.mDischargedPowerLowerBoundMah; Loading Loading @@ -140,6 +148,24 @@ public final class BatteryUsageStats implements Parcelable { return mStatsStartTimestampMs; } /** * Timestamp (as returned by System.currentTimeMillis()) of when the stats snapshot was taken, * in milliseconds. */ public long getStatsEndTimestamp() { return mStatsEndTimestampMs; } /** * Returns the duration of the stats session captured by this BatteryUsageStats. * In rare cases, statsDuration != statsEndTimestamp - statsStartTimestamp. This may * happen when BatteryUsageStats represents an accumulation of data across multiple * non-contiguous sessions. */ public long getStatsDuration() { return mStatsDurationMs; } /** * Total amount of battery charge drained since BatteryStats reset (e.g. due to being fully * charged), in mAh Loading Loading @@ -229,6 +255,8 @@ public final class BatteryUsageStats implements Parcelable { private BatteryUsageStats(@NonNull Parcel source) { mStatsStartTimestampMs = source.readLong(); mStatsEndTimestampMs = source.readLong(); mStatsDurationMs = source.readLong(); mBatteryCapacityMah = source.readDouble(); mDischargePercentage = source.readInt(); mDischargedPowerLowerBound = source.readDouble(); Loading Loading @@ -287,6 +315,8 @@ public final class BatteryUsageStats implements Parcelable { @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeLong(mStatsStartTimestampMs); dest.writeLong(mStatsEndTimestampMs); dest.writeLong(mStatsDurationMs); dest.writeDouble(mBatteryCapacityMah); dest.writeInt(mDischargePercentage); dest.writeDouble(mDischargedPowerLowerBound); Loading Loading @@ -441,6 +471,8 @@ public final class BatteryUsageStats implements Parcelable { private final String[] mCustomPowerComponentNames; private final boolean mIncludePowerModels; private long mStatsStartTimestampMs; private long mStatsEndTimestampMs; private long mStatsDurationMs = -1; private double mBatteryCapacityMah; private int mDischargePercentage; private double mDischargedPowerLowerBoundMah; Loading Loading @@ -493,6 +525,23 @@ public final class BatteryUsageStats implements Parcelable { return this; } /** * Sets the timestamp of when the battery stats snapshot was taken, in milliseconds. */ public Builder setStatsEndTimestamp(long statsEndTimestampMs) { mStatsEndTimestampMs = statsEndTimestampMs; return this; } /** * Sets the duration of the stats session. The default value of this field is * statsEndTimestamp - statsStartTimestamp. */ public Builder setStatsDuration(long statsDurationMs) { mStatsDurationMs = statsDurationMs; return this; } /** * Sets the battery discharge amount since BatteryStats reset as percentage of the full * charge. Loading
core/java/com/android/internal/os/BatteryStatsImpl.java +29 −15 Original line number Diff line number Diff line Loading @@ -610,18 +610,32 @@ public class BatteryStatsImpl extends BatteryStats { } public interface Clocks { public long elapsedRealtime(); public long uptimeMillis(); /** Elapsed Realtime, see SystemClock.elapsedRealtime() */ long elapsedRealtime(); /** Uptime, see SystemClock.uptimeMillis() */ long uptimeMillis(); /** Wall-clock time as per System.currentTimeMillis() */ long currentTimeMillis(); } public static class SystemClocks implements Clocks { @Override public long elapsedRealtime() { return SystemClock.elapsedRealtime(); } @Override public long uptimeMillis() { return SystemClock.uptimeMillis(); } @Override public long currentTimeMillis() { return System.currentTimeMillis(); } } public interface ExternalStatsSync { Loading Loading @@ -1163,7 +1177,7 @@ public class BatteryStatsImpl extends BatteryStats { public BatteryStatsImpl(Clocks clocks) { init(clocks); mStartClockTimeMs = System.currentTimeMillis(); mStartClockTimeMs = clocks.currentTimeMillis(); mStatsFile = null; mCheckinFile = null; mDailyFile = null; Loading Loading @@ -3694,7 +3708,7 @@ public class BatteryStatsImpl extends BatteryStats { if (dataSize == 0) { // The history is currently empty; we need it to start with a time stamp. cur.currentTime = System.currentTimeMillis(); cur.currentTime = mClocks.currentTimeMillis(); addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_RESET, cur); } addHistoryBufferLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE, cur); Loading Loading @@ -3914,7 +3928,7 @@ public class BatteryStatsImpl extends BatteryStats { } public void noteCurrentTimeChangedLocked() { final long currentTime = System.currentTimeMillis(); final long currentTime = mClocks.currentTimeMillis(); final long elapsedRealtime = mClocks.elapsedRealtime(); final long uptime = mClocks.uptimeMillis(); noteCurrentTimeChangedLocked(currentTime, elapsedRealtime, uptime); Loading Loading @@ -4237,7 +4251,7 @@ public class BatteryStatsImpl extends BatteryStats { if (mPretendScreenOff != pretendScreenOff) { mPretendScreenOff = pretendScreenOff; noteScreenStateLocked(pretendScreenOff ? Display.STATE_OFF : Display.STATE_ON, mClocks.elapsedRealtime(), mClocks.uptimeMillis(), System.currentTimeMillis()); mClocks.elapsedRealtime(), mClocks.uptimeMillis(), mClocks.currentTimeMillis()); } } Loading Loading @@ -4827,7 +4841,7 @@ public class BatteryStatsImpl extends BatteryStats { @GuardedBy("this") public void noteScreenStateLocked(int state) { noteScreenStateLocked(state, mClocks.elapsedRealtime(), mClocks.uptimeMillis(), System.currentTimeMillis()); mClocks.currentTimeMillis()); } @GuardedBy("this") Loading Loading @@ -6972,7 +6986,7 @@ public class BatteryStatsImpl extends BatteryStats { } @Override public long getStartClockTime() { final long currentTimeMs = System.currentTimeMillis(); final long currentTimeMs = mClocks.currentTimeMillis(); if ((currentTimeMs > MILLISECONDS_IN_YEAR && mStartClockTimeMs < (currentTimeMs - MILLISECONDS_IN_YEAR)) || (mStartClockTimeMs > currentTimeMs)) { Loading Loading @@ -10735,7 +10749,7 @@ public class BatteryStatsImpl extends BatteryStats { public void updateDailyDeadlineLocked() { // Get the current time. long currentTimeMs = mDailyStartTimeMs = System.currentTimeMillis(); long currentTimeMs = mDailyStartTimeMs = mClocks.currentTimeMillis(); Calendar calDeadline = Calendar.getInstance(); calDeadline.setTimeInMillis(currentTimeMs); Loading Loading @@ -10763,7 +10777,7 @@ public class BatteryStatsImpl extends BatteryStats { public void recordDailyStatsLocked() { DailyItem item = new DailyItem(); item.mStartTime = mDailyStartTimeMs; item.mEndTime = System.currentTimeMillis(); item.mEndTime = mClocks.currentTimeMillis(); boolean hasData = false; if (mDailyDischargeStepTracker.mNumStepDurations > 0) { hasData = true; Loading Loading @@ -11128,7 +11142,7 @@ public class BatteryStatsImpl extends BatteryStats { } void initTimes(long uptimeUs, long realtimeUs) { mStartClockTimeMs = System.currentTimeMillis(); mStartClockTimeMs = mClocks.currentTimeMillis(); mOnBatteryTimeBase.init(uptimeUs, realtimeUs); mOnBatteryScreenOffTimeBase.init(uptimeUs, realtimeUs); mRealtimeUs = 0; Loading Loading @@ -13562,7 +13576,7 @@ public class BatteryStatsImpl extends BatteryStats { private void startRecordingHistory(final long elapsedRealtimeMs, final long uptimeMs, boolean reset) { mRecordingHistory = true; mHistoryCur.currentTime = System.currentTimeMillis(); mHistoryCur.currentTime = mClocks.currentTimeMillis(); addHistoryBufferLocked(elapsedRealtimeMs, reset ? HistoryItem.CMD_RESET : HistoryItem.CMD_CURRENT_TIME, mHistoryCur); Loading Loading @@ -13604,7 +13618,7 @@ public class BatteryStatsImpl extends BatteryStats { final int chargeFullUah, final long chargeTimeToFullSeconds) { setBatteryStateLocked(status, health, plugType, level, temp, voltageMv, chargeUah, chargeFullUah, chargeTimeToFullSeconds, mClocks.elapsedRealtime(), mClocks.uptimeMillis(), System.currentTimeMillis()); mClocks.elapsedRealtime(), mClocks.uptimeMillis(), mClocks.currentTimeMillis()); } public void setBatteryStateLocked(final int status, final int health, final int plugType, Loading Loading @@ -14389,7 +14403,7 @@ public class BatteryStatsImpl extends BatteryStats { } public void shutdownLocked() { recordShutdownLocked(System.currentTimeMillis(), mClocks.elapsedRealtime()); recordShutdownLocked(mClocks.currentTimeMillis(), mClocks.elapsedRealtime()); writeSyncLocked(); mShuttingDown = true; } Loading Loading @@ -14938,7 +14952,7 @@ public class BatteryStatsImpl extends BatteryStats { startRecordingHistory(elapsedRealtimeMs, uptimeMs, false); } recordDailyStatsIfNeededLocked(false, System.currentTimeMillis()); recordDailyStatsIfNeededLocked(false, mClocks.currentTimeMillis()); } public int describeContents() {
core/java/com/android/internal/os/BatteryUsageStatsProvider.java +18 −2 Original line number Diff line number Diff line Loading @@ -108,9 +108,9 @@ public class BatteryUsageStatsProvider { ArrayList<BatteryUsageStats> results = new ArrayList<>(queries.size()); synchronized (mStats) { mStats.prepareForDumpLocked(); final long currentTimeMillis = currentTimeMillis(); for (int i = 0; i < queries.size(); i++) { results.add(getBatteryUsageStats(queries.get(i))); results.add(getBatteryUsageStats(queries.get(i), currentTimeMillis)); } } return results; Loading @@ -121,6 +121,11 @@ public class BatteryUsageStatsProvider { */ @VisibleForTesting public BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query) { return getBatteryUsageStats(query, currentTimeMillis()); } private BatteryUsageStats getBatteryUsageStats(BatteryUsageStatsQuery query, long currentTimeMs) { final long realtimeUs = elapsedRealtime() * 1000; final long uptimeUs = uptimeMillis() * 1000; Loading @@ -129,7 +134,10 @@ public class BatteryUsageStatsProvider { final BatteryUsageStats.Builder batteryUsageStatsBuilder = new BatteryUsageStats.Builder( mStats.getCustomEnergyConsumerNames(), includePowerModels); // TODO(b/188068523): use a monotonic clock to ensure resilience of order and duration // of stats sessions to wall-clock adjustments batteryUsageStatsBuilder.setStatsStartTimestamp(mStats.getStartClockTime()); batteryUsageStatsBuilder.setStatsEndTimestamp(currentTimeMs); SparseArray<? extends BatteryStats.Uid> uidStats = mStats.getUidStats(); for (int i = uidStats.size() - 1; i >= 0; i--) { Loading Loading @@ -217,4 +225,12 @@ public class BatteryUsageStatsProvider { return SystemClock.uptimeMillis(); } } private long currentTimeMillis() { if (mStats instanceof BatteryStatsImpl) { return ((BatteryStatsImpl) mStats).mClocks.currentTimeMillis(); } else { return System.currentTimeMillis(); } } }
core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsProviderTest.java +6 −1 Original line number Diff line number Diff line Loading @@ -45,7 +45,7 @@ public class BatteryUsageStatsProviderTest { private static final long MINUTE_IN_MS = 60 * 1000; @Rule public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule(); public final BatteryUsageStatsRule mStatsRule = new BatteryUsageStatsRule(12345); @Test public void test_getBatteryUsageStats() { Loading @@ -62,6 +62,8 @@ public class BatteryUsageStatsProviderTest { batteryStats.noteUidProcessStateLocked(APP_UID, ActivityManager.PROCESS_STATE_CACHED_EMPTY, 40 * MINUTE_IN_MS, 40 * MINUTE_IN_MS); mStatsRule.setCurrentTime(54321); Context context = InstrumentationRegistry.getContext(); BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(context, batteryStats); Loading @@ -75,6 +77,9 @@ public class BatteryUsageStatsProviderTest { .isEqualTo(20 * MINUTE_IN_MS); assertThat(uidBatteryConsumer.getTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND)) .isEqualTo(10 * MINUTE_IN_MS); assertThat(batteryUsageStats.getStatsStartTimestamp()).isEqualTo(12345); assertThat(batteryUsageStats.getStatsEndTimestamp()).isEqualTo(54321); } @Test Loading
core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsRule.java +9 −0 Original line number Diff line number Diff line Loading @@ -57,8 +57,13 @@ public class BatteryUsageStatsRule implements TestRule { private boolean mScreenOn; public BatteryUsageStatsRule() { this(0); } public BatteryUsageStatsRule(long currentTime) { Context context = InstrumentationRegistry.getContext(); mPowerProfile = spy(new PowerProfile(context, true /* forTest */)); mMockClocks.currentTime = currentTime; mBatteryStats = new MockBatteryStatsImpl(mMockClocks); mBatteryStats.setPowerProfile(mPowerProfile); } Loading Loading @@ -164,6 +169,10 @@ public class BatteryUsageStatsRule implements TestRule { mMockClocks.uptime = uptimeMs; } public void setCurrentTime(long currentTimeMs) { mMockClocks.currentTime = currentTimeMs; } BatteryUsageStats apply(PowerCalculator... calculators) { return apply(new BatteryUsageStatsQuery.Builder().includePowerModels().build(), calculators); Loading