Loading core/java/com/android/internal/os/BatteryStatsImpl.java +76 −56 Original line number Original line Diff line number Diff line Loading @@ -187,7 +187,7 @@ public class BatteryStatsImpl extends BatteryStats { public final AtomicFile mCheckinFile; public final AtomicFile mCheckinFile; public final AtomicFile mDailyFile; public final AtomicFile mDailyFile; static final int MSG_UPDATE_WAKELOCKS = 1; static final int MSG_REPORT_CPU_UPDATE_NEEDED = 1; static final int MSG_REPORT_POWER_CHANGE = 2; static final int MSG_REPORT_POWER_CHANGE = 2; static final int MSG_REPORT_CHARGING = 3; static final int MSG_REPORT_CHARGING = 3; static final long DELAY_UPDATE_WAKELOCKS = 5*1000; static final long DELAY_UPDATE_WAKELOCKS = 5*1000; Loading Loading @@ -273,10 +273,7 @@ public class BatteryStatsImpl extends BatteryStats { public void handleMessage(Message msg) { public void handleMessage(Message msg) { BatteryCallback cb = mCallback; BatteryCallback cb = mCallback; switch (msg.what) { switch (msg.what) { case MSG_UPDATE_WAKELOCKS: case MSG_REPORT_CPU_UPDATE_NEEDED: synchronized (BatteryStatsImpl.this) { updateCpuTimeLocked(); } if (cb != null) { if (cb != null) { cb.batteryNeedsCpuUpdate(); cb.batteryNeedsCpuUpdate(); } } Loading @@ -302,6 +299,10 @@ public class BatteryStatsImpl extends BatteryStats { } } } } public void postBatteryNeedsCpuUpdateMsg() { mHandler.sendEmptyMessage(MSG_REPORT_CPU_UPDATE_NEEDED); } /** /** * Update per-freq cpu times for all the uids in {@link #mPendingUids}. * Update per-freq cpu times for all the uids in {@link #mPendingUids}. */ */ Loading Loading @@ -487,6 +488,10 @@ public class BatteryStatsImpl extends BatteryStats { Future<?> scheduleReadProcStateCpuTimes(boolean onBattery, boolean onBatteryScreenOff); Future<?> scheduleReadProcStateCpuTimes(boolean onBattery, boolean onBatteryScreenOff); Future<?> scheduleCopyFromAllUidsCpuTimes(boolean onBattery, boolean onBatteryScreenOff); Future<?> scheduleCopyFromAllUidsCpuTimes(boolean onBattery, boolean onBatteryScreenOff); Future<?> scheduleCpuSyncDueToSettingChange(); Future<?> scheduleCpuSyncDueToSettingChange(); Future<?> scheduleCpuSyncDueToScreenStateChange(boolean onBattery, boolean onBatteryScreenOff); Future<?> scheduleCpuSyncDueToWakelockChange(long delayMillis); void cancelCpuSyncDueToWakelockChange(); } } public Handler mHandler; public Handler mHandler; Loading Loading @@ -1453,12 +1458,10 @@ public class BatteryStatsImpl extends BatteryStats { long mCount; long mCount; long mLoadedCount; long mLoadedCount; long mUnpluggedCount; long mUnpluggedCount; long mPluggedCount; LongSamplingCounter(TimeBase timeBase, Parcel in) { LongSamplingCounter(TimeBase timeBase, Parcel in) { mTimeBase = timeBase; mTimeBase = timeBase; mPluggedCount = in.readLong(); mCount = in.readLong(); mCount = mPluggedCount; mLoadedCount = in.readLong(); mLoadedCount = in.readLong(); mUnpluggedCount = in.readLong(); mUnpluggedCount = in.readLong(); timeBase.add(this); timeBase.add(this); Loading @@ -1477,16 +1480,15 @@ public class BatteryStatsImpl extends BatteryStats { @Override @Override public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) { public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) { mUnpluggedCount = mPluggedCount; mUnpluggedCount = mCount; } } @Override @Override public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) { public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) { mPluggedCount = mCount; } } public long getCountLocked(int which) { public long getCountLocked(int which) { long val = mTimeBase.isRunning() ? mCount : mPluggedCount; long val = mCount; if (which == STATS_SINCE_UNPLUGGED) { if (which == STATS_SINCE_UNPLUGGED) { val -= mUnpluggedCount; val -= mUnpluggedCount; } else if (which != STATS_SINCE_CHARGED) { } else if (which != STATS_SINCE_CHARGED) { Loading @@ -1499,12 +1501,15 @@ public class BatteryStatsImpl extends BatteryStats { public void logState(Printer pw, String prefix) { public void logState(Printer pw, String prefix) { pw.println(prefix + "mCount=" + mCount pw.println(prefix + "mCount=" + mCount + " mLoadedCount=" + mLoadedCount + " mLoadedCount=" + mLoadedCount + " mUnpluggedCount=" + mUnpluggedCount + " mUnpluggedCount=" + mUnpluggedCount); + " mPluggedCount=" + mPluggedCount); } } void addCountLocked(long count) { void addCountLocked(long count) { if (mTimeBase.isRunning()) { addCountLocked(count, mTimeBase.isRunning()); } void addCountLocked(long count, boolean isRunning) { if (isRunning) { mCount += count; mCount += count; } } } } Loading @@ -1514,7 +1519,7 @@ public class BatteryStatsImpl extends BatteryStats { */ */ void reset(boolean detachIfReset) { void reset(boolean detachIfReset) { mCount = 0; mCount = 0; mLoadedCount = mPluggedCount = mUnpluggedCount = 0; mLoadedCount = mUnpluggedCount = 0; if (detachIfReset) { if (detachIfReset) { detach(); detach(); } } Loading @@ -1531,7 +1536,7 @@ public class BatteryStatsImpl extends BatteryStats { void readSummaryFromParcelLocked(Parcel in) { void readSummaryFromParcelLocked(Parcel in) { mLoadedCount = in.readLong(); mLoadedCount = in.readLong(); mCount = mLoadedCount; mCount = mLoadedCount; mUnpluggedCount = mPluggedCount = mLoadedCount; mUnpluggedCount = mLoadedCount; } } } } Loading Loading @@ -3852,9 +3857,6 @@ public class BatteryStatsImpl extends BatteryStats { + Display.stateToString(screenState) + Display.stateToString(screenState) + " and battery is " + (unplugged ? "on" : "off")); + " and battery is " + (unplugged ? "on" : "off")); } } updateCpuTimeLocked(); mExternalSync.scheduleCopyFromAllUidsCpuTimes(mOnBatteryTimeBase.isRunning(), mOnBatteryScreenOffTimeBase.isRunning()); mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime); mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime); if (updateOnBatteryTimeBase) { if (updateOnBatteryTimeBase) { Loading Loading @@ -4143,15 +4145,11 @@ public class BatteryStatsImpl extends BatteryStats { } } private void requestWakelockCpuUpdate() { private void requestWakelockCpuUpdate() { if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) { mExternalSync.scheduleCpuSyncDueToWakelockChange(DELAY_UPDATE_WAKELOCKS); Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS); mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS); } } } private void requestImmediateCpuUpdate() { private void requestImmediateCpuUpdate() { mHandler.removeMessages(MSG_UPDATE_WAKELOCKS); mExternalSync.scheduleCpuSyncDueToWakelockChange(0 /* delayMillis */); mHandler.sendEmptyMessage(MSG_UPDATE_WAKELOCKS); } } public void setRecordAllHistoryLocked(boolean enabled) { public void setRecordAllHistoryLocked(boolean enabled) { Loading Loading @@ -4554,7 +4552,7 @@ public class BatteryStatsImpl extends BatteryStats { } } public boolean startAddingCpuLocked() { public boolean startAddingCpuLocked() { mHandler.removeMessages(MSG_UPDATE_WAKELOCKS); mExternalSync.cancelCpuSyncDueToWakelockChange(); return mOnBatteryInternal; return mOnBatteryInternal; } } Loading Loading @@ -4807,6 +4805,8 @@ public class BatteryStatsImpl extends BatteryStats { + Display.stateToString(state)); + Display.stateToString(state)); addHistoryRecordLocked(elapsedRealtime, uptime); addHistoryRecordLocked(elapsedRealtime, uptime); } } mExternalSync.scheduleCpuSyncDueToScreenStateChange( mOnBatteryTimeBase.isRunning(), mOnBatteryScreenOffTimeBase.isRunning()); if (isScreenOn(state)) { if (isScreenOn(state)) { updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), state, updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), state, mClocks.uptimeMillis() * 1000, elapsedRealtime * 1000); mClocks.uptimeMillis() * 1000, elapsedRealtime * 1000); Loading Loading @@ -9196,9 +9196,15 @@ public class BatteryStatsImpl extends BatteryStats { } } public void addCpuTimeLocked(int utime, int stime) { public void addCpuTimeLocked(int utime, int stime) { addCpuTimeLocked(utime, stime, mBsi.mOnBatteryTimeBase.isRunning()); } public void addCpuTimeLocked(int utime, int stime, boolean isRunning) { if (isRunning) { mUserTime += utime; mUserTime += utime; mSystemTime += stime; mSystemTime += stime; } } } public void addForegroundTimeLocked(long ttime) { public void addForegroundTimeLocked(long ttime) { mForegroundTime += ttime; mForegroundTime += ttime; Loading Loading @@ -11761,13 +11767,24 @@ public class BatteryStatsImpl extends BatteryStats { } } } } public boolean isOnBatteryLocked() { return mOnBatteryTimeBase.isRunning(); } public boolean isOnBatteryScreenOffLocked() { return mOnBatteryScreenOffTimeBase.isRunning(); } /** /** * Read and distribute CPU usage across apps. If their are partial wakelocks being held * Read and distribute CPU usage across apps. If their are partial wakelocks being held * and we are on battery with screen off, we give more of the cpu time to those apps holding * and we are on battery with screen off, we give more of the cpu time to those apps holding * wakelocks. If the screen is on, we just assign the actual cpu time an app used. * wakelocks. If the screen is on, we just assign the actual cpu time an app used. * It's possible this will be invoked after the internal battery/screen states are updated, so * passing the appropriate battery/screen states to try attribute the cpu times to correct * buckets. */ */ @GuardedBy("this") @GuardedBy("this") public void updateCpuTimeLocked() { public void updateCpuTimeLocked(boolean onBattery, boolean onBatteryScreenOff) { if (mPowerProfile == null) { if (mPowerProfile == null) { return; return; } } Loading @@ -11784,7 +11801,7 @@ public class BatteryStatsImpl extends BatteryStats { // usually holding the wakelock on behalf of an app. // usually holding the wakelock on behalf of an app. // And Only distribute cpu power to wakelocks if the screen is off and we're on battery. // And Only distribute cpu power to wakelocks if the screen is off and we're on battery. ArrayList<StopwatchTimer> partialTimersToConsider = null; ArrayList<StopwatchTimer> partialTimersToConsider = null; if (mOnBatteryScreenOffTimeBase.isRunning()) { if (onBatteryScreenOff) { partialTimersToConsider = new ArrayList<>(); partialTimersToConsider = new ArrayList<>(); for (int i = mPartialTimers.size() - 1; i >= 0; --i) { for (int i = mPartialTimers.size() - 1; i >= 0; --i) { final StopwatchTimer timer = mPartialTimers.get(i); final StopwatchTimer timer = mPartialTimers.get(i); Loading @@ -11802,7 +11819,7 @@ public class BatteryStatsImpl extends BatteryStats { // When the battery is not on, we don't attribute the cpu times to any timers but we still // When the battery is not on, we don't attribute the cpu times to any timers but we still // need to take the snapshots. // need to take the snapshots. if (!mOnBatteryInternal) { if (!onBattery) { mKernelUidCpuTimeReader.readDelta(null); mKernelUidCpuTimeReader.readDelta(null); mKernelUidCpuFreqTimeReader.readDelta(null); mKernelUidCpuFreqTimeReader.readDelta(null); if (mConstants.TRACK_CPU_ACTIVE_CLUSTER_TIME) { if (mConstants.TRACK_CPU_ACTIVE_CLUSTER_TIME) { Loading @@ -11818,16 +11835,16 @@ public class BatteryStatsImpl extends BatteryStats { mUserInfoProvider.refreshUserIds(); mUserInfoProvider.refreshUserIds(); final SparseLongArray updatedUids = mKernelUidCpuFreqTimeReader.perClusterTimesAvailable() final SparseLongArray updatedUids = mKernelUidCpuFreqTimeReader.perClusterTimesAvailable() ? null : new SparseLongArray(); ? null : new SparseLongArray(); readKernelUidCpuTimesLocked(partialTimersToConsider, updatedUids); readKernelUidCpuTimesLocked(partialTimersToConsider, updatedUids, onBattery); // updatedUids=null means /proc/uid_time_in_state provides snapshots of per-cluster cpu // updatedUids=null means /proc/uid_time_in_state provides snapshots of per-cluster cpu // freqs, so no need to approximate these values. // freqs, so no need to approximate these values. if (updatedUids != null) { if (updatedUids != null) { updateClusterSpeedTimes(updatedUids); updateClusterSpeedTimes(updatedUids, onBattery); } } readKernelUidCpuFreqTimesLocked(partialTimersToConsider); readKernelUidCpuFreqTimesLocked(partialTimersToConsider, onBattery, onBatteryScreenOff); if (mConstants.TRACK_CPU_ACTIVE_CLUSTER_TIME) { if (mConstants.TRACK_CPU_ACTIVE_CLUSTER_TIME) { readKernelUidCpuActiveTimesLocked(); readKernelUidCpuActiveTimesLocked(onBattery); readKernelUidCpuClusterTimesLocked(); readKernelUidCpuClusterTimesLocked(onBattery); } } } } Loading Loading @@ -11867,7 +11884,7 @@ public class BatteryStatsImpl extends BatteryStats { * @param updatedUids The uids for which times spent at different frequencies are calculated. * @param updatedUids The uids for which times spent at different frequencies are calculated. */ */ @VisibleForTesting @VisibleForTesting public void updateClusterSpeedTimes(@NonNull SparseLongArray updatedUids) { public void updateClusterSpeedTimes(@NonNull SparseLongArray updatedUids, boolean onBattery) { long totalCpuClustersTimeMs = 0; long totalCpuClustersTimeMs = 0; // Read the time spent for each cluster at various cpu frequencies. // Read the time spent for each cluster at various cpu frequencies. final long[][] clusterSpeedTimesMs = new long[mKernelCpuSpeedReaders.length][]; final long[][] clusterSpeedTimesMs = new long[mKernelCpuSpeedReaders.length][]; Loading Loading @@ -11909,7 +11926,7 @@ public class BatteryStatsImpl extends BatteryStats { } } cpuSpeeds[speed].addCountLocked(appCpuTimeUs cpuSpeeds[speed].addCountLocked(appCpuTimeUs * clusterSpeedTimesMs[cluster][speed] * clusterSpeedTimesMs[cluster][speed] / totalCpuClustersTimeMs); / totalCpuClustersTimeMs, onBattery); } } } } } } Loading @@ -11926,7 +11943,7 @@ public class BatteryStatsImpl extends BatteryStats { */ */ @VisibleForTesting @VisibleForTesting public void readKernelUidCpuTimesLocked(@Nullable ArrayList<StopwatchTimer> partialTimers, public void readKernelUidCpuTimesLocked(@Nullable ArrayList<StopwatchTimer> partialTimers, @Nullable SparseLongArray updatedUids) { @Nullable SparseLongArray updatedUids, boolean onBattery) { mTempTotalCpuUserTimeUs = mTempTotalCpuSystemTimeUs = 0; mTempTotalCpuUserTimeUs = mTempTotalCpuSystemTimeUs = 0; final int numWakelocks = partialTimers == null ? 0 : partialTimers.size(); final int numWakelocks = partialTimers == null ? 0 : partialTimers.size(); final long startTimeMs = mClocks.uptimeMillis(); final long startTimeMs = mClocks.uptimeMillis(); Loading Loading @@ -11977,8 +11994,8 @@ public class BatteryStatsImpl extends BatteryStats { Slog.d(TAG, sb.toString()); Slog.d(TAG, sb.toString()); } } u.mUserCpuTime.addCountLocked(userTimeUs); u.mUserCpuTime.addCountLocked(userTimeUs, onBattery); u.mSystemCpuTime.addCountLocked(systemTimeUs); u.mSystemCpuTime.addCountLocked(systemTimeUs, onBattery); if (updatedUids != null) { if (updatedUids != null) { updatedUids.put(u.getUid(), userTimeUs + systemTimeUs); updatedUids.put(u.getUid(), userTimeUs + systemTimeUs); } } Loading Loading @@ -12010,15 +12027,15 @@ public class BatteryStatsImpl extends BatteryStats { Slog.d(TAG, sb.toString()); Slog.d(TAG, sb.toString()); } } timer.mUid.mUserCpuTime.addCountLocked(userTimeUs); timer.mUid.mUserCpuTime.addCountLocked(userTimeUs, onBattery); timer.mUid.mSystemCpuTime.addCountLocked(systemTimeUs); timer.mUid.mSystemCpuTime.addCountLocked(systemTimeUs, onBattery); if (updatedUids != null) { if (updatedUids != null) { final int uid = timer.mUid.getUid(); final int uid = timer.mUid.getUid(); updatedUids.put(uid, updatedUids.get(uid, 0) + userTimeUs + systemTimeUs); updatedUids.put(uid, updatedUids.get(uid, 0) + userTimeUs + systemTimeUs); } } final Uid.Proc proc = timer.mUid.getProcessStatsLocked("*wakelock*"); final Uid.Proc proc = timer.mUid.getProcessStatsLocked("*wakelock*"); proc.addCpuTimeLocked(userTimeUs / 1000, systemTimeUs / 1000); proc.addCpuTimeLocked(userTimeUs / 1000, systemTimeUs / 1000, onBattery); mTempTotalCpuUserTimeUs -= userTimeUs; mTempTotalCpuUserTimeUs -= userTimeUs; mTempTotalCpuSystemTimeUs -= systemTimeUs; mTempTotalCpuSystemTimeUs -= systemTimeUs; Loading @@ -12033,7 +12050,8 @@ public class BatteryStatsImpl extends BatteryStats { * @param partialTimers The wakelock holders among which the cpu freq times will be distributed. * @param partialTimers The wakelock holders among which the cpu freq times will be distributed. */ */ @VisibleForTesting @VisibleForTesting public void readKernelUidCpuFreqTimesLocked(@Nullable ArrayList<StopwatchTimer> partialTimers) { public void readKernelUidCpuFreqTimesLocked(@Nullable ArrayList<StopwatchTimer> partialTimers, boolean onBattery, boolean onBatteryScreenOff) { final boolean perClusterTimesAvailable = final boolean perClusterTimesAvailable = mKernelUidCpuFreqTimeReader.perClusterTimesAvailable(); mKernelUidCpuFreqTimeReader.perClusterTimesAvailable(); final int numWakelocks = partialTimers == null ? 0 : partialTimers.size(); final int numWakelocks = partialTimers == null ? 0 : partialTimers.size(); Loading @@ -12056,13 +12074,13 @@ public class BatteryStatsImpl extends BatteryStats { if (u.mCpuFreqTimeMs == null || u.mCpuFreqTimeMs.getSize() != cpuFreqTimeMs.length) { if (u.mCpuFreqTimeMs == null || u.mCpuFreqTimeMs.getSize() != cpuFreqTimeMs.length) { u.mCpuFreqTimeMs = new LongSamplingCounterArray(mOnBatteryTimeBase); u.mCpuFreqTimeMs = new LongSamplingCounterArray(mOnBatteryTimeBase); } } u.mCpuFreqTimeMs.addCountLocked(cpuFreqTimeMs); u.mCpuFreqTimeMs.addCountLocked(cpuFreqTimeMs, onBattery); if (u.mScreenOffCpuFreqTimeMs == null || if (u.mScreenOffCpuFreqTimeMs == null || u.mScreenOffCpuFreqTimeMs.getSize() != cpuFreqTimeMs.length) { u.mScreenOffCpuFreqTimeMs.getSize() != cpuFreqTimeMs.length) { u.mScreenOffCpuFreqTimeMs = new LongSamplingCounterArray( u.mScreenOffCpuFreqTimeMs = new LongSamplingCounterArray( mOnBatteryScreenOffTimeBase); mOnBatteryScreenOffTimeBase); } } u.mScreenOffCpuFreqTimeMs.addCountLocked(cpuFreqTimeMs); u.mScreenOffCpuFreqTimeMs.addCountLocked(cpuFreqTimeMs, onBatteryScreenOff); if (perClusterTimesAvailable) { if (perClusterTimesAvailable) { if (u.mCpuClusterSpeedTimesUs == null || if (u.mCpuClusterSpeedTimesUs == null || Loading Loading @@ -12098,7 +12116,7 @@ public class BatteryStatsImpl extends BatteryStats { } else { } else { appAllocationUs = cpuFreqTimeMs[freqIndex] * 1000; appAllocationUs = cpuFreqTimeMs[freqIndex] * 1000; } } cpuTimesUs[speed].addCountLocked(appAllocationUs); cpuTimesUs[speed].addCountLocked(appAllocationUs, onBattery); freqIndex++; freqIndex++; } } } } Loading Loading @@ -12132,7 +12150,7 @@ public class BatteryStatsImpl extends BatteryStats { } } final long allocationUs = final long allocationUs = mWakeLockAllocationsUs[cluster][speed] / (numWakelocks - i); mWakeLockAllocationsUs[cluster][speed] / (numWakelocks - i); cpuTimeUs[speed].addCountLocked(allocationUs); cpuTimeUs[speed].addCountLocked(allocationUs, onBattery); mWakeLockAllocationsUs[cluster][speed] -= allocationUs; mWakeLockAllocationsUs[cluster][speed] -= allocationUs; } } } } Loading @@ -12145,7 +12163,7 @@ public class BatteryStatsImpl extends BatteryStats { * counters. * counters. */ */ @VisibleForTesting @VisibleForTesting public void readKernelUidCpuActiveTimesLocked() { public void readKernelUidCpuActiveTimesLocked(boolean onBattery) { final long startTimeMs = mClocks.uptimeMillis(); final long startTimeMs = mClocks.uptimeMillis(); mKernelUidCpuActiveTimeReader.readDelta((uid, cpuActiveTimesUs) -> { mKernelUidCpuActiveTimeReader.readDelta((uid, cpuActiveTimesUs) -> { uid = mapUid(uid); uid = mapUid(uid); Loading @@ -12160,7 +12178,7 @@ public class BatteryStatsImpl extends BatteryStats { return; return; } } final Uid u = getUidStatsLocked(uid); final Uid u = getUidStatsLocked(uid); u.mCpuActiveTimeMs.addCountLocked(cpuActiveTimesUs); u.mCpuActiveTimeMs.addCountLocked(cpuActiveTimesUs, onBattery); }); }); final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs; final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs; Loading @@ -12174,7 +12192,7 @@ public class BatteryStatsImpl extends BatteryStats { * counters. * counters. */ */ @VisibleForTesting @VisibleForTesting public void readKernelUidCpuClusterTimesLocked() { public void readKernelUidCpuClusterTimesLocked(boolean onBattery) { final long startTimeMs = mClocks.uptimeMillis(); final long startTimeMs = mClocks.uptimeMillis(); mKernelUidCpuClusterTimeReader.readDelta((uid, cpuClusterTimesUs) -> { mKernelUidCpuClusterTimeReader.readDelta((uid, cpuClusterTimesUs) -> { uid = mapUid(uid); uid = mapUid(uid); Loading @@ -12189,7 +12207,7 @@ public class BatteryStatsImpl extends BatteryStats { return; return; } } final Uid u = getUidStatsLocked(uid); final Uid u = getUidStatsLocked(uid); u.mCpuClusterTimesMs.addCountLocked(cpuClusterTimesUs); u.mCpuClusterTimesMs.addCountLocked(cpuClusterTimesUs, onBattery); }); }); final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs; final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs; Loading Loading @@ -12399,9 +12417,7 @@ public class BatteryStatsImpl extends BatteryStats { reportChangesToStatsLog(mHaveBatteryLevel ? mHistoryCur : null, reportChangesToStatsLog(mHaveBatteryLevel ? mHistoryCur : null, status, plugType, level, temp); status, plugType, level, temp); final boolean onBattery = final boolean onBattery = isOnBattery(plugType, status); plugType == BATTERY_PLUGGED_NONE && status != BatteryManager.BATTERY_STATUS_UNKNOWN; final long uptime = mClocks.uptimeMillis(); final long uptime = mClocks.uptimeMillis(); final long elapsedRealtime = mClocks.elapsedRealtime(); final long elapsedRealtime = mClocks.elapsedRealtime(); if (!mHaveBatteryLevel) { if (!mHaveBatteryLevel) { Loading Loading @@ -12591,6 +12607,10 @@ public class BatteryStatsImpl extends BatteryStats { mMaxLearnedBatteryCapacity = Math.max(mMaxLearnedBatteryCapacity, chargeFullUAh); mMaxLearnedBatteryCapacity = Math.max(mMaxLearnedBatteryCapacity, chargeFullUAh); } } public static boolean isOnBattery(int plugType, int status) { return plugType == BATTERY_PLUGGED_NONE && status != BatteryManager.BATTERY_STATUS_UNKNOWN; } // Inform StatsLog of setBatteryState changes. // Inform StatsLog of setBatteryState changes. // If this is the first reporting, pass in recentPast == null. // If this is the first reporting, pass in recentPast == null. private void reportChangesToStatsLog(HistoryItem recentPast, private void reportChangesToStatsLog(HistoryItem recentPast, Loading core/tests/coretests/src/com/android/internal/os/BatteryStatsCpuTimesTest.java +23 −23 Original line number Original line Diff line number Diff line Loading @@ -114,7 +114,7 @@ public class BatteryStatsCpuTimesTest { when(mKernelUidCpuFreqTimeReader.readFreqs(mPowerProfile)).thenReturn(freqs); when(mKernelUidCpuFreqTimeReader.readFreqs(mPowerProfile)).thenReturn(freqs); // RUN // RUN mBatteryStatsImpl.updateCpuTimeLocked(); mBatteryStatsImpl.updateCpuTimeLocked(false, false); // VERIFY // VERIFY assertArrayEquals("Unexpected cpu freqs", freqs, mBatteryStatsImpl.getCpuFreqs()); assertArrayEquals("Unexpected cpu freqs", freqs, mBatteryStatsImpl.getCpuFreqs()); Loading @@ -134,7 +134,7 @@ public class BatteryStatsCpuTimesTest { mBatteryStatsImpl.setOnBatteryInternal(true); mBatteryStatsImpl.setOnBatteryInternal(true); // RUN // RUN mBatteryStatsImpl.updateCpuTimeLocked(); mBatteryStatsImpl.updateCpuTimeLocked(true, false); // VERIFY // VERIFY verify(mUserInfoProvider).refreshUserIds(); verify(mUserInfoProvider).refreshUserIds(); Loading Loading @@ -213,7 +213,7 @@ public class BatteryStatsCpuTimesTest { } } // RUN // RUN mBatteryStatsImpl.updateClusterSpeedTimes(updatedUids); mBatteryStatsImpl.updateClusterSpeedTimes(updatedUids, true); // VERIFY // VERIFY int totalClustersTimeMs = 0; int totalClustersTimeMs = 0; Loading Loading @@ -261,7 +261,7 @@ public class BatteryStatsCpuTimesTest { // RUN // RUN final SparseLongArray updatedUids = new SparseLongArray(); final SparseLongArray updatedUids = new SparseLongArray(); mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, updatedUids); mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, updatedUids, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -294,7 +294,7 @@ public class BatteryStatsCpuTimesTest { }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null); mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -333,7 +333,7 @@ public class BatteryStatsCpuTimesTest { }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null); mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -368,7 +368,7 @@ public class BatteryStatsCpuTimesTest { }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null); mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -423,7 +423,7 @@ public class BatteryStatsCpuTimesTest { }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null); mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -470,7 +470,7 @@ public class BatteryStatsCpuTimesTest { // RUN // RUN final SparseLongArray updatedUids = new SparseLongArray(); final SparseLongArray updatedUids = new SparseLongArray(); mBatteryStatsImpl.readKernelUidCpuTimesLocked(partialTimers, updatedUids); mBatteryStatsImpl.readKernelUidCpuTimesLocked(partialTimers, updatedUids, true); // VERIFY // VERIFY long totalUserTimeUs = 0; long totalUserTimeUs = 0; Loading Loading @@ -549,7 +549,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -582,7 +582,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -633,7 +633,7 @@ public class BatteryStatsCpuTimesTest { when(mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()).thenReturn(true); when(mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()).thenReturn(true); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -676,7 +676,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -743,7 +743,7 @@ public class BatteryStatsCpuTimesTest { when(mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()).thenReturn(true); when(mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()).thenReturn(true); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(partialTimers); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(partialTimers, true, false); // VERIFY // VERIFY final long[][] expectedWakeLockUidTimesUs = new long[clusterFreqs.length][]; final long[][] expectedWakeLockUidTimesUs = new long[clusterFreqs.length][]; Loading Loading @@ -832,7 +832,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -865,7 +865,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -909,7 +909,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -949,7 +949,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -1006,7 +1006,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -1047,7 +1047,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuActiveTimeReader.Callback.class)); any(KernelUidCpuActiveTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuActiveTimesLocked(); mBatteryStatsImpl.readKernelUidCpuActiveTimesLocked(true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading @@ -1073,7 +1073,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuActiveTimeReader.Callback.class)); any(KernelUidCpuActiveTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuActiveTimesLocked(); mBatteryStatsImpl.readKernelUidCpuActiveTimesLocked(true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -1112,7 +1112,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuClusterTimeReader.Callback.class)); any(KernelUidCpuClusterTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuClusterTimesLocked(); mBatteryStatsImpl.readKernelUidCpuClusterTimesLocked(true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -1142,7 +1142,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuClusterTimeReader.Callback.class)); any(KernelUidCpuClusterTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuClusterTimesLocked(); mBatteryStatsImpl.readKernelUidCpuClusterTimesLocked(true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java +3 −4 Original line number Original line Diff line number Diff line Loading @@ -161,9 +161,7 @@ public class BatteryStatsNoteTest extends TestCase { actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE, actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE, elapsedTimeUs, STATS_SINCE_CHARGED); elapsedTimeUs, STATS_SINCE_CHARGED); expectedRunTimeMs = stateRuntimeMap.get( expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE); ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE) + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE); assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs); assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs); actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING, actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING, Loading @@ -173,7 +171,8 @@ public class BatteryStatsNoteTest extends TestCase { actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND, actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND, elapsedTimeUs, STATS_SINCE_CHARGED); elapsedTimeUs, STATS_SINCE_CHARGED); expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND); expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE); assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs); assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs); actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND, actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND, Loading core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java +14 −0 Original line number Original line Diff line number Diff line Loading @@ -171,6 +171,20 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { return null; return null; } } @Override public Future<?> scheduleCpuSyncDueToScreenStateChange( boolean onBattery, boolean onBatteryScreenOff) { return null; } @Override public Future<?> scheduleCpuSyncDueToWakelockChange(long delayMillis) { return null; } @Override public void cancelCpuSyncDueToWakelockChange() { } } } } } services/core/java/com/android/server/am/BatteryExternalStatsWorker.java +85 −9 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
core/java/com/android/internal/os/BatteryStatsImpl.java +76 −56 Original line number Original line Diff line number Diff line Loading @@ -187,7 +187,7 @@ public class BatteryStatsImpl extends BatteryStats { public final AtomicFile mCheckinFile; public final AtomicFile mCheckinFile; public final AtomicFile mDailyFile; public final AtomicFile mDailyFile; static final int MSG_UPDATE_WAKELOCKS = 1; static final int MSG_REPORT_CPU_UPDATE_NEEDED = 1; static final int MSG_REPORT_POWER_CHANGE = 2; static final int MSG_REPORT_POWER_CHANGE = 2; static final int MSG_REPORT_CHARGING = 3; static final int MSG_REPORT_CHARGING = 3; static final long DELAY_UPDATE_WAKELOCKS = 5*1000; static final long DELAY_UPDATE_WAKELOCKS = 5*1000; Loading Loading @@ -273,10 +273,7 @@ public class BatteryStatsImpl extends BatteryStats { public void handleMessage(Message msg) { public void handleMessage(Message msg) { BatteryCallback cb = mCallback; BatteryCallback cb = mCallback; switch (msg.what) { switch (msg.what) { case MSG_UPDATE_WAKELOCKS: case MSG_REPORT_CPU_UPDATE_NEEDED: synchronized (BatteryStatsImpl.this) { updateCpuTimeLocked(); } if (cb != null) { if (cb != null) { cb.batteryNeedsCpuUpdate(); cb.batteryNeedsCpuUpdate(); } } Loading @@ -302,6 +299,10 @@ public class BatteryStatsImpl extends BatteryStats { } } } } public void postBatteryNeedsCpuUpdateMsg() { mHandler.sendEmptyMessage(MSG_REPORT_CPU_UPDATE_NEEDED); } /** /** * Update per-freq cpu times for all the uids in {@link #mPendingUids}. * Update per-freq cpu times for all the uids in {@link #mPendingUids}. */ */ Loading Loading @@ -487,6 +488,10 @@ public class BatteryStatsImpl extends BatteryStats { Future<?> scheduleReadProcStateCpuTimes(boolean onBattery, boolean onBatteryScreenOff); Future<?> scheduleReadProcStateCpuTimes(boolean onBattery, boolean onBatteryScreenOff); Future<?> scheduleCopyFromAllUidsCpuTimes(boolean onBattery, boolean onBatteryScreenOff); Future<?> scheduleCopyFromAllUidsCpuTimes(boolean onBattery, boolean onBatteryScreenOff); Future<?> scheduleCpuSyncDueToSettingChange(); Future<?> scheduleCpuSyncDueToSettingChange(); Future<?> scheduleCpuSyncDueToScreenStateChange(boolean onBattery, boolean onBatteryScreenOff); Future<?> scheduleCpuSyncDueToWakelockChange(long delayMillis); void cancelCpuSyncDueToWakelockChange(); } } public Handler mHandler; public Handler mHandler; Loading Loading @@ -1453,12 +1458,10 @@ public class BatteryStatsImpl extends BatteryStats { long mCount; long mCount; long mLoadedCount; long mLoadedCount; long mUnpluggedCount; long mUnpluggedCount; long mPluggedCount; LongSamplingCounter(TimeBase timeBase, Parcel in) { LongSamplingCounter(TimeBase timeBase, Parcel in) { mTimeBase = timeBase; mTimeBase = timeBase; mPluggedCount = in.readLong(); mCount = in.readLong(); mCount = mPluggedCount; mLoadedCount = in.readLong(); mLoadedCount = in.readLong(); mUnpluggedCount = in.readLong(); mUnpluggedCount = in.readLong(); timeBase.add(this); timeBase.add(this); Loading @@ -1477,16 +1480,15 @@ public class BatteryStatsImpl extends BatteryStats { @Override @Override public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) { public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) { mUnpluggedCount = mPluggedCount; mUnpluggedCount = mCount; } } @Override @Override public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) { public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) { mPluggedCount = mCount; } } public long getCountLocked(int which) { public long getCountLocked(int which) { long val = mTimeBase.isRunning() ? mCount : mPluggedCount; long val = mCount; if (which == STATS_SINCE_UNPLUGGED) { if (which == STATS_SINCE_UNPLUGGED) { val -= mUnpluggedCount; val -= mUnpluggedCount; } else if (which != STATS_SINCE_CHARGED) { } else if (which != STATS_SINCE_CHARGED) { Loading @@ -1499,12 +1501,15 @@ public class BatteryStatsImpl extends BatteryStats { public void logState(Printer pw, String prefix) { public void logState(Printer pw, String prefix) { pw.println(prefix + "mCount=" + mCount pw.println(prefix + "mCount=" + mCount + " mLoadedCount=" + mLoadedCount + " mLoadedCount=" + mLoadedCount + " mUnpluggedCount=" + mUnpluggedCount + " mUnpluggedCount=" + mUnpluggedCount); + " mPluggedCount=" + mPluggedCount); } } void addCountLocked(long count) { void addCountLocked(long count) { if (mTimeBase.isRunning()) { addCountLocked(count, mTimeBase.isRunning()); } void addCountLocked(long count, boolean isRunning) { if (isRunning) { mCount += count; mCount += count; } } } } Loading @@ -1514,7 +1519,7 @@ public class BatteryStatsImpl extends BatteryStats { */ */ void reset(boolean detachIfReset) { void reset(boolean detachIfReset) { mCount = 0; mCount = 0; mLoadedCount = mPluggedCount = mUnpluggedCount = 0; mLoadedCount = mUnpluggedCount = 0; if (detachIfReset) { if (detachIfReset) { detach(); detach(); } } Loading @@ -1531,7 +1536,7 @@ public class BatteryStatsImpl extends BatteryStats { void readSummaryFromParcelLocked(Parcel in) { void readSummaryFromParcelLocked(Parcel in) { mLoadedCount = in.readLong(); mLoadedCount = in.readLong(); mCount = mLoadedCount; mCount = mLoadedCount; mUnpluggedCount = mPluggedCount = mLoadedCount; mUnpluggedCount = mLoadedCount; } } } } Loading Loading @@ -3852,9 +3857,6 @@ public class BatteryStatsImpl extends BatteryStats { + Display.stateToString(screenState) + Display.stateToString(screenState) + " and battery is " + (unplugged ? "on" : "off")); + " and battery is " + (unplugged ? "on" : "off")); } } updateCpuTimeLocked(); mExternalSync.scheduleCopyFromAllUidsCpuTimes(mOnBatteryTimeBase.isRunning(), mOnBatteryScreenOffTimeBase.isRunning()); mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime); mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime); if (updateOnBatteryTimeBase) { if (updateOnBatteryTimeBase) { Loading Loading @@ -4143,15 +4145,11 @@ public class BatteryStatsImpl extends BatteryStats { } } private void requestWakelockCpuUpdate() { private void requestWakelockCpuUpdate() { if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) { mExternalSync.scheduleCpuSyncDueToWakelockChange(DELAY_UPDATE_WAKELOCKS); Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS); mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS); } } } private void requestImmediateCpuUpdate() { private void requestImmediateCpuUpdate() { mHandler.removeMessages(MSG_UPDATE_WAKELOCKS); mExternalSync.scheduleCpuSyncDueToWakelockChange(0 /* delayMillis */); mHandler.sendEmptyMessage(MSG_UPDATE_WAKELOCKS); } } public void setRecordAllHistoryLocked(boolean enabled) { public void setRecordAllHistoryLocked(boolean enabled) { Loading Loading @@ -4554,7 +4552,7 @@ public class BatteryStatsImpl extends BatteryStats { } } public boolean startAddingCpuLocked() { public boolean startAddingCpuLocked() { mHandler.removeMessages(MSG_UPDATE_WAKELOCKS); mExternalSync.cancelCpuSyncDueToWakelockChange(); return mOnBatteryInternal; return mOnBatteryInternal; } } Loading Loading @@ -4807,6 +4805,8 @@ public class BatteryStatsImpl extends BatteryStats { + Display.stateToString(state)); + Display.stateToString(state)); addHistoryRecordLocked(elapsedRealtime, uptime); addHistoryRecordLocked(elapsedRealtime, uptime); } } mExternalSync.scheduleCpuSyncDueToScreenStateChange( mOnBatteryTimeBase.isRunning(), mOnBatteryScreenOffTimeBase.isRunning()); if (isScreenOn(state)) { if (isScreenOn(state)) { updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), state, updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), state, mClocks.uptimeMillis() * 1000, elapsedRealtime * 1000); mClocks.uptimeMillis() * 1000, elapsedRealtime * 1000); Loading Loading @@ -9196,9 +9196,15 @@ public class BatteryStatsImpl extends BatteryStats { } } public void addCpuTimeLocked(int utime, int stime) { public void addCpuTimeLocked(int utime, int stime) { addCpuTimeLocked(utime, stime, mBsi.mOnBatteryTimeBase.isRunning()); } public void addCpuTimeLocked(int utime, int stime, boolean isRunning) { if (isRunning) { mUserTime += utime; mUserTime += utime; mSystemTime += stime; mSystemTime += stime; } } } public void addForegroundTimeLocked(long ttime) { public void addForegroundTimeLocked(long ttime) { mForegroundTime += ttime; mForegroundTime += ttime; Loading Loading @@ -11761,13 +11767,24 @@ public class BatteryStatsImpl extends BatteryStats { } } } } public boolean isOnBatteryLocked() { return mOnBatteryTimeBase.isRunning(); } public boolean isOnBatteryScreenOffLocked() { return mOnBatteryScreenOffTimeBase.isRunning(); } /** /** * Read and distribute CPU usage across apps. If their are partial wakelocks being held * Read and distribute CPU usage across apps. If their are partial wakelocks being held * and we are on battery with screen off, we give more of the cpu time to those apps holding * and we are on battery with screen off, we give more of the cpu time to those apps holding * wakelocks. If the screen is on, we just assign the actual cpu time an app used. * wakelocks. If the screen is on, we just assign the actual cpu time an app used. * It's possible this will be invoked after the internal battery/screen states are updated, so * passing the appropriate battery/screen states to try attribute the cpu times to correct * buckets. */ */ @GuardedBy("this") @GuardedBy("this") public void updateCpuTimeLocked() { public void updateCpuTimeLocked(boolean onBattery, boolean onBatteryScreenOff) { if (mPowerProfile == null) { if (mPowerProfile == null) { return; return; } } Loading @@ -11784,7 +11801,7 @@ public class BatteryStatsImpl extends BatteryStats { // usually holding the wakelock on behalf of an app. // usually holding the wakelock on behalf of an app. // And Only distribute cpu power to wakelocks if the screen is off and we're on battery. // And Only distribute cpu power to wakelocks if the screen is off and we're on battery. ArrayList<StopwatchTimer> partialTimersToConsider = null; ArrayList<StopwatchTimer> partialTimersToConsider = null; if (mOnBatteryScreenOffTimeBase.isRunning()) { if (onBatteryScreenOff) { partialTimersToConsider = new ArrayList<>(); partialTimersToConsider = new ArrayList<>(); for (int i = mPartialTimers.size() - 1; i >= 0; --i) { for (int i = mPartialTimers.size() - 1; i >= 0; --i) { final StopwatchTimer timer = mPartialTimers.get(i); final StopwatchTimer timer = mPartialTimers.get(i); Loading @@ -11802,7 +11819,7 @@ public class BatteryStatsImpl extends BatteryStats { // When the battery is not on, we don't attribute the cpu times to any timers but we still // When the battery is not on, we don't attribute the cpu times to any timers but we still // need to take the snapshots. // need to take the snapshots. if (!mOnBatteryInternal) { if (!onBattery) { mKernelUidCpuTimeReader.readDelta(null); mKernelUidCpuTimeReader.readDelta(null); mKernelUidCpuFreqTimeReader.readDelta(null); mKernelUidCpuFreqTimeReader.readDelta(null); if (mConstants.TRACK_CPU_ACTIVE_CLUSTER_TIME) { if (mConstants.TRACK_CPU_ACTIVE_CLUSTER_TIME) { Loading @@ -11818,16 +11835,16 @@ public class BatteryStatsImpl extends BatteryStats { mUserInfoProvider.refreshUserIds(); mUserInfoProvider.refreshUserIds(); final SparseLongArray updatedUids = mKernelUidCpuFreqTimeReader.perClusterTimesAvailable() final SparseLongArray updatedUids = mKernelUidCpuFreqTimeReader.perClusterTimesAvailable() ? null : new SparseLongArray(); ? null : new SparseLongArray(); readKernelUidCpuTimesLocked(partialTimersToConsider, updatedUids); readKernelUidCpuTimesLocked(partialTimersToConsider, updatedUids, onBattery); // updatedUids=null means /proc/uid_time_in_state provides snapshots of per-cluster cpu // updatedUids=null means /proc/uid_time_in_state provides snapshots of per-cluster cpu // freqs, so no need to approximate these values. // freqs, so no need to approximate these values. if (updatedUids != null) { if (updatedUids != null) { updateClusterSpeedTimes(updatedUids); updateClusterSpeedTimes(updatedUids, onBattery); } } readKernelUidCpuFreqTimesLocked(partialTimersToConsider); readKernelUidCpuFreqTimesLocked(partialTimersToConsider, onBattery, onBatteryScreenOff); if (mConstants.TRACK_CPU_ACTIVE_CLUSTER_TIME) { if (mConstants.TRACK_CPU_ACTIVE_CLUSTER_TIME) { readKernelUidCpuActiveTimesLocked(); readKernelUidCpuActiveTimesLocked(onBattery); readKernelUidCpuClusterTimesLocked(); readKernelUidCpuClusterTimesLocked(onBattery); } } } } Loading Loading @@ -11867,7 +11884,7 @@ public class BatteryStatsImpl extends BatteryStats { * @param updatedUids The uids for which times spent at different frequencies are calculated. * @param updatedUids The uids for which times spent at different frequencies are calculated. */ */ @VisibleForTesting @VisibleForTesting public void updateClusterSpeedTimes(@NonNull SparseLongArray updatedUids) { public void updateClusterSpeedTimes(@NonNull SparseLongArray updatedUids, boolean onBattery) { long totalCpuClustersTimeMs = 0; long totalCpuClustersTimeMs = 0; // Read the time spent for each cluster at various cpu frequencies. // Read the time spent for each cluster at various cpu frequencies. final long[][] clusterSpeedTimesMs = new long[mKernelCpuSpeedReaders.length][]; final long[][] clusterSpeedTimesMs = new long[mKernelCpuSpeedReaders.length][]; Loading Loading @@ -11909,7 +11926,7 @@ public class BatteryStatsImpl extends BatteryStats { } } cpuSpeeds[speed].addCountLocked(appCpuTimeUs cpuSpeeds[speed].addCountLocked(appCpuTimeUs * clusterSpeedTimesMs[cluster][speed] * clusterSpeedTimesMs[cluster][speed] / totalCpuClustersTimeMs); / totalCpuClustersTimeMs, onBattery); } } } } } } Loading @@ -11926,7 +11943,7 @@ public class BatteryStatsImpl extends BatteryStats { */ */ @VisibleForTesting @VisibleForTesting public void readKernelUidCpuTimesLocked(@Nullable ArrayList<StopwatchTimer> partialTimers, public void readKernelUidCpuTimesLocked(@Nullable ArrayList<StopwatchTimer> partialTimers, @Nullable SparseLongArray updatedUids) { @Nullable SparseLongArray updatedUids, boolean onBattery) { mTempTotalCpuUserTimeUs = mTempTotalCpuSystemTimeUs = 0; mTempTotalCpuUserTimeUs = mTempTotalCpuSystemTimeUs = 0; final int numWakelocks = partialTimers == null ? 0 : partialTimers.size(); final int numWakelocks = partialTimers == null ? 0 : partialTimers.size(); final long startTimeMs = mClocks.uptimeMillis(); final long startTimeMs = mClocks.uptimeMillis(); Loading Loading @@ -11977,8 +11994,8 @@ public class BatteryStatsImpl extends BatteryStats { Slog.d(TAG, sb.toString()); Slog.d(TAG, sb.toString()); } } u.mUserCpuTime.addCountLocked(userTimeUs); u.mUserCpuTime.addCountLocked(userTimeUs, onBattery); u.mSystemCpuTime.addCountLocked(systemTimeUs); u.mSystemCpuTime.addCountLocked(systemTimeUs, onBattery); if (updatedUids != null) { if (updatedUids != null) { updatedUids.put(u.getUid(), userTimeUs + systemTimeUs); updatedUids.put(u.getUid(), userTimeUs + systemTimeUs); } } Loading Loading @@ -12010,15 +12027,15 @@ public class BatteryStatsImpl extends BatteryStats { Slog.d(TAG, sb.toString()); Slog.d(TAG, sb.toString()); } } timer.mUid.mUserCpuTime.addCountLocked(userTimeUs); timer.mUid.mUserCpuTime.addCountLocked(userTimeUs, onBattery); timer.mUid.mSystemCpuTime.addCountLocked(systemTimeUs); timer.mUid.mSystemCpuTime.addCountLocked(systemTimeUs, onBattery); if (updatedUids != null) { if (updatedUids != null) { final int uid = timer.mUid.getUid(); final int uid = timer.mUid.getUid(); updatedUids.put(uid, updatedUids.get(uid, 0) + userTimeUs + systemTimeUs); updatedUids.put(uid, updatedUids.get(uid, 0) + userTimeUs + systemTimeUs); } } final Uid.Proc proc = timer.mUid.getProcessStatsLocked("*wakelock*"); final Uid.Proc proc = timer.mUid.getProcessStatsLocked("*wakelock*"); proc.addCpuTimeLocked(userTimeUs / 1000, systemTimeUs / 1000); proc.addCpuTimeLocked(userTimeUs / 1000, systemTimeUs / 1000, onBattery); mTempTotalCpuUserTimeUs -= userTimeUs; mTempTotalCpuUserTimeUs -= userTimeUs; mTempTotalCpuSystemTimeUs -= systemTimeUs; mTempTotalCpuSystemTimeUs -= systemTimeUs; Loading @@ -12033,7 +12050,8 @@ public class BatteryStatsImpl extends BatteryStats { * @param partialTimers The wakelock holders among which the cpu freq times will be distributed. * @param partialTimers The wakelock holders among which the cpu freq times will be distributed. */ */ @VisibleForTesting @VisibleForTesting public void readKernelUidCpuFreqTimesLocked(@Nullable ArrayList<StopwatchTimer> partialTimers) { public void readKernelUidCpuFreqTimesLocked(@Nullable ArrayList<StopwatchTimer> partialTimers, boolean onBattery, boolean onBatteryScreenOff) { final boolean perClusterTimesAvailable = final boolean perClusterTimesAvailable = mKernelUidCpuFreqTimeReader.perClusterTimesAvailable(); mKernelUidCpuFreqTimeReader.perClusterTimesAvailable(); final int numWakelocks = partialTimers == null ? 0 : partialTimers.size(); final int numWakelocks = partialTimers == null ? 0 : partialTimers.size(); Loading @@ -12056,13 +12074,13 @@ public class BatteryStatsImpl extends BatteryStats { if (u.mCpuFreqTimeMs == null || u.mCpuFreqTimeMs.getSize() != cpuFreqTimeMs.length) { if (u.mCpuFreqTimeMs == null || u.mCpuFreqTimeMs.getSize() != cpuFreqTimeMs.length) { u.mCpuFreqTimeMs = new LongSamplingCounterArray(mOnBatteryTimeBase); u.mCpuFreqTimeMs = new LongSamplingCounterArray(mOnBatteryTimeBase); } } u.mCpuFreqTimeMs.addCountLocked(cpuFreqTimeMs); u.mCpuFreqTimeMs.addCountLocked(cpuFreqTimeMs, onBattery); if (u.mScreenOffCpuFreqTimeMs == null || if (u.mScreenOffCpuFreqTimeMs == null || u.mScreenOffCpuFreqTimeMs.getSize() != cpuFreqTimeMs.length) { u.mScreenOffCpuFreqTimeMs.getSize() != cpuFreqTimeMs.length) { u.mScreenOffCpuFreqTimeMs = new LongSamplingCounterArray( u.mScreenOffCpuFreqTimeMs = new LongSamplingCounterArray( mOnBatteryScreenOffTimeBase); mOnBatteryScreenOffTimeBase); } } u.mScreenOffCpuFreqTimeMs.addCountLocked(cpuFreqTimeMs); u.mScreenOffCpuFreqTimeMs.addCountLocked(cpuFreqTimeMs, onBatteryScreenOff); if (perClusterTimesAvailable) { if (perClusterTimesAvailable) { if (u.mCpuClusterSpeedTimesUs == null || if (u.mCpuClusterSpeedTimesUs == null || Loading Loading @@ -12098,7 +12116,7 @@ public class BatteryStatsImpl extends BatteryStats { } else { } else { appAllocationUs = cpuFreqTimeMs[freqIndex] * 1000; appAllocationUs = cpuFreqTimeMs[freqIndex] * 1000; } } cpuTimesUs[speed].addCountLocked(appAllocationUs); cpuTimesUs[speed].addCountLocked(appAllocationUs, onBattery); freqIndex++; freqIndex++; } } } } Loading Loading @@ -12132,7 +12150,7 @@ public class BatteryStatsImpl extends BatteryStats { } } final long allocationUs = final long allocationUs = mWakeLockAllocationsUs[cluster][speed] / (numWakelocks - i); mWakeLockAllocationsUs[cluster][speed] / (numWakelocks - i); cpuTimeUs[speed].addCountLocked(allocationUs); cpuTimeUs[speed].addCountLocked(allocationUs, onBattery); mWakeLockAllocationsUs[cluster][speed] -= allocationUs; mWakeLockAllocationsUs[cluster][speed] -= allocationUs; } } } } Loading @@ -12145,7 +12163,7 @@ public class BatteryStatsImpl extends BatteryStats { * counters. * counters. */ */ @VisibleForTesting @VisibleForTesting public void readKernelUidCpuActiveTimesLocked() { public void readKernelUidCpuActiveTimesLocked(boolean onBattery) { final long startTimeMs = mClocks.uptimeMillis(); final long startTimeMs = mClocks.uptimeMillis(); mKernelUidCpuActiveTimeReader.readDelta((uid, cpuActiveTimesUs) -> { mKernelUidCpuActiveTimeReader.readDelta((uid, cpuActiveTimesUs) -> { uid = mapUid(uid); uid = mapUid(uid); Loading @@ -12160,7 +12178,7 @@ public class BatteryStatsImpl extends BatteryStats { return; return; } } final Uid u = getUidStatsLocked(uid); final Uid u = getUidStatsLocked(uid); u.mCpuActiveTimeMs.addCountLocked(cpuActiveTimesUs); u.mCpuActiveTimeMs.addCountLocked(cpuActiveTimesUs, onBattery); }); }); final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs; final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs; Loading @@ -12174,7 +12192,7 @@ public class BatteryStatsImpl extends BatteryStats { * counters. * counters. */ */ @VisibleForTesting @VisibleForTesting public void readKernelUidCpuClusterTimesLocked() { public void readKernelUidCpuClusterTimesLocked(boolean onBattery) { final long startTimeMs = mClocks.uptimeMillis(); final long startTimeMs = mClocks.uptimeMillis(); mKernelUidCpuClusterTimeReader.readDelta((uid, cpuClusterTimesUs) -> { mKernelUidCpuClusterTimeReader.readDelta((uid, cpuClusterTimesUs) -> { uid = mapUid(uid); uid = mapUid(uid); Loading @@ -12189,7 +12207,7 @@ public class BatteryStatsImpl extends BatteryStats { return; return; } } final Uid u = getUidStatsLocked(uid); final Uid u = getUidStatsLocked(uid); u.mCpuClusterTimesMs.addCountLocked(cpuClusterTimesUs); u.mCpuClusterTimesMs.addCountLocked(cpuClusterTimesUs, onBattery); }); }); final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs; final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs; Loading Loading @@ -12399,9 +12417,7 @@ public class BatteryStatsImpl extends BatteryStats { reportChangesToStatsLog(mHaveBatteryLevel ? mHistoryCur : null, reportChangesToStatsLog(mHaveBatteryLevel ? mHistoryCur : null, status, plugType, level, temp); status, plugType, level, temp); final boolean onBattery = final boolean onBattery = isOnBattery(plugType, status); plugType == BATTERY_PLUGGED_NONE && status != BatteryManager.BATTERY_STATUS_UNKNOWN; final long uptime = mClocks.uptimeMillis(); final long uptime = mClocks.uptimeMillis(); final long elapsedRealtime = mClocks.elapsedRealtime(); final long elapsedRealtime = mClocks.elapsedRealtime(); if (!mHaveBatteryLevel) { if (!mHaveBatteryLevel) { Loading Loading @@ -12591,6 +12607,10 @@ public class BatteryStatsImpl extends BatteryStats { mMaxLearnedBatteryCapacity = Math.max(mMaxLearnedBatteryCapacity, chargeFullUAh); mMaxLearnedBatteryCapacity = Math.max(mMaxLearnedBatteryCapacity, chargeFullUAh); } } public static boolean isOnBattery(int plugType, int status) { return plugType == BATTERY_PLUGGED_NONE && status != BatteryManager.BATTERY_STATUS_UNKNOWN; } // Inform StatsLog of setBatteryState changes. // Inform StatsLog of setBatteryState changes. // If this is the first reporting, pass in recentPast == null. // If this is the first reporting, pass in recentPast == null. private void reportChangesToStatsLog(HistoryItem recentPast, private void reportChangesToStatsLog(HistoryItem recentPast, Loading
core/tests/coretests/src/com/android/internal/os/BatteryStatsCpuTimesTest.java +23 −23 Original line number Original line Diff line number Diff line Loading @@ -114,7 +114,7 @@ public class BatteryStatsCpuTimesTest { when(mKernelUidCpuFreqTimeReader.readFreqs(mPowerProfile)).thenReturn(freqs); when(mKernelUidCpuFreqTimeReader.readFreqs(mPowerProfile)).thenReturn(freqs); // RUN // RUN mBatteryStatsImpl.updateCpuTimeLocked(); mBatteryStatsImpl.updateCpuTimeLocked(false, false); // VERIFY // VERIFY assertArrayEquals("Unexpected cpu freqs", freqs, mBatteryStatsImpl.getCpuFreqs()); assertArrayEquals("Unexpected cpu freqs", freqs, mBatteryStatsImpl.getCpuFreqs()); Loading @@ -134,7 +134,7 @@ public class BatteryStatsCpuTimesTest { mBatteryStatsImpl.setOnBatteryInternal(true); mBatteryStatsImpl.setOnBatteryInternal(true); // RUN // RUN mBatteryStatsImpl.updateCpuTimeLocked(); mBatteryStatsImpl.updateCpuTimeLocked(true, false); // VERIFY // VERIFY verify(mUserInfoProvider).refreshUserIds(); verify(mUserInfoProvider).refreshUserIds(); Loading Loading @@ -213,7 +213,7 @@ public class BatteryStatsCpuTimesTest { } } // RUN // RUN mBatteryStatsImpl.updateClusterSpeedTimes(updatedUids); mBatteryStatsImpl.updateClusterSpeedTimes(updatedUids, true); // VERIFY // VERIFY int totalClustersTimeMs = 0; int totalClustersTimeMs = 0; Loading Loading @@ -261,7 +261,7 @@ public class BatteryStatsCpuTimesTest { // RUN // RUN final SparseLongArray updatedUids = new SparseLongArray(); final SparseLongArray updatedUids = new SparseLongArray(); mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, updatedUids); mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, updatedUids, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -294,7 +294,7 @@ public class BatteryStatsCpuTimesTest { }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null); mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -333,7 +333,7 @@ public class BatteryStatsCpuTimesTest { }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null); mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -368,7 +368,7 @@ public class BatteryStatsCpuTimesTest { }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null); mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -423,7 +423,7 @@ public class BatteryStatsCpuTimesTest { }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); }).when(mKernelUidCpuTimeReader).readDelta(any(KernelUidCpuTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null); mBatteryStatsImpl.readKernelUidCpuTimesLocked(null, null, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -470,7 +470,7 @@ public class BatteryStatsCpuTimesTest { // RUN // RUN final SparseLongArray updatedUids = new SparseLongArray(); final SparseLongArray updatedUids = new SparseLongArray(); mBatteryStatsImpl.readKernelUidCpuTimesLocked(partialTimers, updatedUids); mBatteryStatsImpl.readKernelUidCpuTimesLocked(partialTimers, updatedUids, true); // VERIFY // VERIFY long totalUserTimeUs = 0; long totalUserTimeUs = 0; Loading Loading @@ -549,7 +549,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -582,7 +582,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -633,7 +633,7 @@ public class BatteryStatsCpuTimesTest { when(mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()).thenReturn(true); when(mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()).thenReturn(true); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -676,7 +676,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -743,7 +743,7 @@ public class BatteryStatsCpuTimesTest { when(mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()).thenReturn(true); when(mKernelUidCpuFreqTimeReader.perClusterTimesAvailable()).thenReturn(true); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(partialTimers); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(partialTimers, true, false); // VERIFY // VERIFY final long[][] expectedWakeLockUidTimesUs = new long[clusterFreqs.length][]; final long[][] expectedWakeLockUidTimesUs = new long[clusterFreqs.length][]; Loading Loading @@ -832,7 +832,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -865,7 +865,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -909,7 +909,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -949,7 +949,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -1006,7 +1006,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuFreqTimeReader.Callback.class)); any(KernelUidCpuFreqTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null); mBatteryStatsImpl.readKernelUidCpuFreqTimesLocked(null, true, false); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -1047,7 +1047,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuActiveTimeReader.Callback.class)); any(KernelUidCpuActiveTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuActiveTimesLocked(); mBatteryStatsImpl.readKernelUidCpuActiveTimesLocked(true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading @@ -1073,7 +1073,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuActiveTimeReader.Callback.class)); any(KernelUidCpuActiveTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuActiveTimesLocked(); mBatteryStatsImpl.readKernelUidCpuActiveTimesLocked(true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -1112,7 +1112,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuClusterTimeReader.Callback.class)); any(KernelUidCpuClusterTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuClusterTimesLocked(); mBatteryStatsImpl.readKernelUidCpuClusterTimesLocked(true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading Loading @@ -1142,7 +1142,7 @@ public class BatteryStatsCpuTimesTest { any(KernelUidCpuClusterTimeReader.Callback.class)); any(KernelUidCpuClusterTimeReader.Callback.class)); // RUN // RUN mBatteryStatsImpl.readKernelUidCpuClusterTimesLocked(); mBatteryStatsImpl.readKernelUidCpuClusterTimesLocked(true); // VERIFY // VERIFY for (int i = 0; i < testUids.length; ++i) { for (int i = 0; i < testUids.length; ++i) { Loading
core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java +3 −4 Original line number Original line Diff line number Diff line Loading @@ -161,9 +161,7 @@ public class BatteryStatsNoteTest extends TestCase { actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE, actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND_SERVICE, elapsedTimeUs, STATS_SINCE_CHARGED); elapsedTimeUs, STATS_SINCE_CHARGED); expectedRunTimeMs = stateRuntimeMap.get( expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE); ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE) + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE); assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs); assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs); actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING, actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING, Loading @@ -173,7 +171,8 @@ public class BatteryStatsNoteTest extends TestCase { actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND, actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_FOREGROUND, elapsedTimeUs, STATS_SINCE_CHARGED); elapsedTimeUs, STATS_SINCE_CHARGED); expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND); expectedRunTimeMs = stateRuntimeMap.get(ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) + stateRuntimeMap.get(ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE); assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs); assertEquals(expectedRunTimeMs * 1000, actualRunTimeUs); actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND, actualRunTimeUs = uid.getProcessStateTime(BatteryStats.Uid.PROCESS_STATE_BACKGROUND, Loading
core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java +14 −0 Original line number Original line Diff line number Diff line Loading @@ -171,6 +171,20 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { return null; return null; } } @Override public Future<?> scheduleCpuSyncDueToScreenStateChange( boolean onBattery, boolean onBatteryScreenOff) { return null; } @Override public Future<?> scheduleCpuSyncDueToWakelockChange(long delayMillis) { return null; } @Override public void cancelCpuSyncDueToWakelockChange() { } } } } }
services/core/java/com/android/server/am/BatteryExternalStatsWorker.java +85 −9 File changed.Preview size limit exceeded, changes collapsed. Show changes