Loading services/core/java/com/android/server/am/AppBatteryTracker.java +91 −69 Original line number Original line Diff line number Diff line Loading @@ -145,7 +145,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> /** /** * The uid battery usage stats data from our last query, it does not include snapshot data. * The uid battery usage stats data from our last query, it does not include snapshot data. */ */ // No lock is needed. @GuardedBy("mLock") private final SparseDoubleArray mLastUidBatteryUsage = new SparseDoubleArray(); private final SparseDoubleArray mLastUidBatteryUsage = new SparseDoubleArray(); // No lock is needed. // No lock is needed. Loading @@ -154,13 +154,16 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> // No lock is needed. // No lock is needed. private final SparseDoubleArray mTmpUidBatteryUsage2 = new SparseDoubleArray(); private final SparseDoubleArray mTmpUidBatteryUsage2 = new SparseDoubleArray(); // No lock is needed. private final SparseDoubleArray mTmpUidBatteryUsageInWindow = new SparseDoubleArray(); // No lock is needed. // No lock is needed. private final ArraySet<UserHandle> mTmpUserIds = new ArraySet<>(); private final ArraySet<UserHandle> mTmpUserIds = new ArraySet<>(); /** /** * The start timestamp of the battery usage stats result from our last query. * The start timestamp of the battery usage stats result from our last query. */ */ // No lock is needed. @GuardedBy("mLock") private long mLastUidBatteryUsageStartTs; private long mLastUidBatteryUsageStartTs; // For debug only. // For debug only. Loading Loading @@ -296,16 +299,21 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> checkBatteryUsageStats(); checkBatteryUsageStats(); } else { } else { // We didn't do the battery stats update above, schedule a check later. // We didn't do the battery stats update above, schedule a check later. synchronized (mLock) { scheduleBatteryUsageStatsUpdateIfNecessary( scheduleBatteryUsageStatsUpdateIfNecessary( mLastBatteryUsageSamplingTs + mBatteryUsageStatsPollingMinIntervalMs - now); mLastBatteryUsageSamplingTs + mBatteryUsageStatsPollingMinIntervalMs - now); } } } } } private void checkBatteryUsageStats() { private void checkBatteryUsageStats() { final long now = SystemClock.elapsedRealtime(); final long now = SystemClock.elapsedRealtime(); final AppBatteryPolicy bgPolicy = mInjector.getPolicy(); final AppBatteryPolicy bgPolicy = mInjector.getPolicy(); try { try { final SparseDoubleArray uidConsumers = mUidBatteryUsageInWindow; final SparseDoubleArray uidConsumers = mTmpUidBatteryUsageInWindow; synchronized (mLock) { copyUidBatteryUsage(mUidBatteryUsageInWindow, uidConsumers); } final long since = Math.max(0, now - bgPolicy.mBgCurrentDrainWindowMs); final long since = Math.max(0, now - bgPolicy.mBgCurrentDrainWindowMs); for (int i = 0, size = uidConsumers.size(); i < size; i++) { for (int i = 0, size = uidConsumers.size(); i < size; i++) { final int uid = uidConsumers.keyAt(i); final int uid = uidConsumers.keyAt(i); Loading Loading @@ -408,7 +416,9 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> if (curDuration >= windowSize) { if (curDuration >= windowSize) { // If we do have long enough data for the window, save it. // If we do have long enough data for the window, save it. synchronized (mLock) { copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration); copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration); } needUpdateUidBatteryUsageInWindow = false; needUpdateUidBatteryUsageInWindow = false; } } Loading @@ -416,8 +426,11 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> mTmpUidBatteryUsage2.clear(); mTmpUidBatteryUsage2.clear(); copyUidBatteryUsage(buf, mTmpUidBatteryUsage2); copyUidBatteryUsage(buf, mTmpUidBatteryUsage2); final long lastUidBatteryUsageStartTs = mLastUidBatteryUsageStartTs; final long lastUidBatteryUsageStartTs; synchronized (mLock) { lastUidBatteryUsageStartTs = mLastUidBatteryUsageStartTs; mLastUidBatteryUsageStartTs = curStart; mLastUidBatteryUsageStartTs = curStart; } if (curStart > lastUidBatteryUsageStartTs && lastUidBatteryUsageStartTs > 0) { if (curStart > lastUidBatteryUsageStartTs && lastUidBatteryUsageStartTs > 0) { // The battery usage stats committed data since our last query, // The battery usage stats committed data since our last query, // let's query the snapshots to get the data since last start. // let's query the snapshots to get the data since last start. Loading @@ -429,11 +442,14 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> } } if (needUpdateUidBatteryUsageInWindow && curDuration > windowSize) { if (needUpdateUidBatteryUsageInWindow && curDuration > windowSize) { // If we do have long enough data for the window, save it. // If we do have long enough data for the window, save it. synchronized (mLock) { copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration); copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration); } needUpdateUidBatteryUsageInWindow = false; needUpdateUidBatteryUsageInWindow = false; } } // Add the delta into the global records. // Add the delta into the global records. synchronized (mLock) { for (int i = 0, size = buf.size(); i < size; i++) { for (int i = 0, size = buf.size(); i < size; i++) { final int uid = buf.keyAt(i); final int uid = buf.keyAt(i); final int index = mUidBatteryUsage.indexOfKey(uid); final int index = mUidBatteryUsage.indexOfKey(uid); Loading @@ -450,7 +466,8 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> if (DEBUG_BACKGROUND_BATTERY_TRACKER) { if (DEBUG_BACKGROUND_BATTERY_TRACKER) { final double actualDelta = buf.valueAt(i) - mLastUidBatteryUsage.get(uid, 0.0d); final double actualDelta = buf.valueAt(i) - mLastUidBatteryUsage.get(uid, 0.0d); String msg = "Updating mUidBatteryUsage uid=" + uid + ", before=" + before String msg = "Updating mUidBatteryUsage uid=" + uid + ", before=" + before + ", after=" + mUidBatteryUsage.get(uid, 0.0d) + ", delta=" + actualDelta + ", after=" + mUidBatteryUsage.get(uid, 0.0d) + ", delta=" + actualDelta + ", last=" + mLastUidBatteryUsage.get(uid, 0.0d) + ", last=" + mLastUidBatteryUsage.get(uid, 0.0d) + ", curStart=" + curStart + ", curStart=" + curStart + ", lastLastStart=" + lastUidBatteryUsageStartTs + ", lastLastStart=" + lastUidBatteryUsageStartTs Loading @@ -465,6 +482,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> } } // Now update the mLastUidBatteryUsage with the data we just saved above. // Now update the mLastUidBatteryUsage with the data we just saved above. copyUidBatteryUsage(mTmpUidBatteryUsage2, mLastUidBatteryUsage); copyUidBatteryUsage(mTmpUidBatteryUsage2, mLastUidBatteryUsage); } mTmpUidBatteryUsage2.clear(); mTmpUidBatteryUsage2.clear(); if (needUpdateUidBatteryUsageInWindow) { if (needUpdateUidBatteryUsageInWindow) { Loading @@ -473,9 +491,11 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> .includeProcessStateData() .includeProcessStateData() .aggregateSnapshots(now - windowSize, lastUidBatteryUsageStartTs); .aggregateSnapshots(now - windowSize, lastUidBatteryUsageStartTs); updateBatteryUsageStatsOnceInternal(buf, builder, userIds, batteryStatsInternal); updateBatteryUsageStatsOnceInternal(buf, builder, userIds, batteryStatsInternal); synchronized (mLock) { copyUidBatteryUsage(buf, mUidBatteryUsageInWindow); copyUidBatteryUsage(buf, mUidBatteryUsageInWindow); } } } } } private static BatteryUsageStats updateBatteryUsageStatsOnceInternal( private static BatteryUsageStats updateBatteryUsageStatsOnceInternal( SparseDoubleArray buf, BatteryUsageStatsQuery.Builder builder, SparseDoubleArray buf, BatteryUsageStatsQuery.Builder builder, Loading Loading @@ -584,6 +604,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> pw.print(prefix); pw.print(prefix); pw.println("APP BATTERY STATE TRACKER:"); pw.println("APP BATTERY STATE TRACKER:"); updateBatteryUsageStatsIfNecessary(mInjector.currentTimeMillis(), true); updateBatteryUsageStatsIfNecessary(mInjector.currentTimeMillis(), true); synchronized (mLock) { final SparseDoubleArray uidConsumers = mUidBatteryUsageInWindow; final SparseDoubleArray uidConsumers = mUidBatteryUsageInWindow; pw.print(" " + prefix); pw.print(" " + prefix); pw.print("Boot="); pw.print("Boot="); Loading Loading @@ -618,6 +639,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> mUidBatteryUsage.get(uid, 0.0d)); mUidBatteryUsage.get(uid, 0.0d)); } } } } } super.dump(pw, prefix); super.dump(pw, prefix); } } Loading Loading
services/core/java/com/android/server/am/AppBatteryTracker.java +91 −69 Original line number Original line Diff line number Diff line Loading @@ -145,7 +145,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> /** /** * The uid battery usage stats data from our last query, it does not include snapshot data. * The uid battery usage stats data from our last query, it does not include snapshot data. */ */ // No lock is needed. @GuardedBy("mLock") private final SparseDoubleArray mLastUidBatteryUsage = new SparseDoubleArray(); private final SparseDoubleArray mLastUidBatteryUsage = new SparseDoubleArray(); // No lock is needed. // No lock is needed. Loading @@ -154,13 +154,16 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> // No lock is needed. // No lock is needed. private final SparseDoubleArray mTmpUidBatteryUsage2 = new SparseDoubleArray(); private final SparseDoubleArray mTmpUidBatteryUsage2 = new SparseDoubleArray(); // No lock is needed. private final SparseDoubleArray mTmpUidBatteryUsageInWindow = new SparseDoubleArray(); // No lock is needed. // No lock is needed. private final ArraySet<UserHandle> mTmpUserIds = new ArraySet<>(); private final ArraySet<UserHandle> mTmpUserIds = new ArraySet<>(); /** /** * The start timestamp of the battery usage stats result from our last query. * The start timestamp of the battery usage stats result from our last query. */ */ // No lock is needed. @GuardedBy("mLock") private long mLastUidBatteryUsageStartTs; private long mLastUidBatteryUsageStartTs; // For debug only. // For debug only. Loading Loading @@ -296,16 +299,21 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> checkBatteryUsageStats(); checkBatteryUsageStats(); } else { } else { // We didn't do the battery stats update above, schedule a check later. // We didn't do the battery stats update above, schedule a check later. synchronized (mLock) { scheduleBatteryUsageStatsUpdateIfNecessary( scheduleBatteryUsageStatsUpdateIfNecessary( mLastBatteryUsageSamplingTs + mBatteryUsageStatsPollingMinIntervalMs - now); mLastBatteryUsageSamplingTs + mBatteryUsageStatsPollingMinIntervalMs - now); } } } } } private void checkBatteryUsageStats() { private void checkBatteryUsageStats() { final long now = SystemClock.elapsedRealtime(); final long now = SystemClock.elapsedRealtime(); final AppBatteryPolicy bgPolicy = mInjector.getPolicy(); final AppBatteryPolicy bgPolicy = mInjector.getPolicy(); try { try { final SparseDoubleArray uidConsumers = mUidBatteryUsageInWindow; final SparseDoubleArray uidConsumers = mTmpUidBatteryUsageInWindow; synchronized (mLock) { copyUidBatteryUsage(mUidBatteryUsageInWindow, uidConsumers); } final long since = Math.max(0, now - bgPolicy.mBgCurrentDrainWindowMs); final long since = Math.max(0, now - bgPolicy.mBgCurrentDrainWindowMs); for (int i = 0, size = uidConsumers.size(); i < size; i++) { for (int i = 0, size = uidConsumers.size(); i < size; i++) { final int uid = uidConsumers.keyAt(i); final int uid = uidConsumers.keyAt(i); Loading Loading @@ -408,7 +416,9 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> if (curDuration >= windowSize) { if (curDuration >= windowSize) { // If we do have long enough data for the window, save it. // If we do have long enough data for the window, save it. synchronized (mLock) { copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration); copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration); } needUpdateUidBatteryUsageInWindow = false; needUpdateUidBatteryUsageInWindow = false; } } Loading @@ -416,8 +426,11 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> mTmpUidBatteryUsage2.clear(); mTmpUidBatteryUsage2.clear(); copyUidBatteryUsage(buf, mTmpUidBatteryUsage2); copyUidBatteryUsage(buf, mTmpUidBatteryUsage2); final long lastUidBatteryUsageStartTs = mLastUidBatteryUsageStartTs; final long lastUidBatteryUsageStartTs; synchronized (mLock) { lastUidBatteryUsageStartTs = mLastUidBatteryUsageStartTs; mLastUidBatteryUsageStartTs = curStart; mLastUidBatteryUsageStartTs = curStart; } if (curStart > lastUidBatteryUsageStartTs && lastUidBatteryUsageStartTs > 0) { if (curStart > lastUidBatteryUsageStartTs && lastUidBatteryUsageStartTs > 0) { // The battery usage stats committed data since our last query, // The battery usage stats committed data since our last query, // let's query the snapshots to get the data since last start. // let's query the snapshots to get the data since last start. Loading @@ -429,11 +442,14 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> } } if (needUpdateUidBatteryUsageInWindow && curDuration > windowSize) { if (needUpdateUidBatteryUsageInWindow && curDuration > windowSize) { // If we do have long enough data for the window, save it. // If we do have long enough data for the window, save it. synchronized (mLock) { copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration); copyUidBatteryUsage(buf, mUidBatteryUsageInWindow, windowSize * 1.0d / curDuration); } needUpdateUidBatteryUsageInWindow = false; needUpdateUidBatteryUsageInWindow = false; } } // Add the delta into the global records. // Add the delta into the global records. synchronized (mLock) { for (int i = 0, size = buf.size(); i < size; i++) { for (int i = 0, size = buf.size(); i < size; i++) { final int uid = buf.keyAt(i); final int uid = buf.keyAt(i); final int index = mUidBatteryUsage.indexOfKey(uid); final int index = mUidBatteryUsage.indexOfKey(uid); Loading @@ -450,7 +466,8 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> if (DEBUG_BACKGROUND_BATTERY_TRACKER) { if (DEBUG_BACKGROUND_BATTERY_TRACKER) { final double actualDelta = buf.valueAt(i) - mLastUidBatteryUsage.get(uid, 0.0d); final double actualDelta = buf.valueAt(i) - mLastUidBatteryUsage.get(uid, 0.0d); String msg = "Updating mUidBatteryUsage uid=" + uid + ", before=" + before String msg = "Updating mUidBatteryUsage uid=" + uid + ", before=" + before + ", after=" + mUidBatteryUsage.get(uid, 0.0d) + ", delta=" + actualDelta + ", after=" + mUidBatteryUsage.get(uid, 0.0d) + ", delta=" + actualDelta + ", last=" + mLastUidBatteryUsage.get(uid, 0.0d) + ", last=" + mLastUidBatteryUsage.get(uid, 0.0d) + ", curStart=" + curStart + ", curStart=" + curStart + ", lastLastStart=" + lastUidBatteryUsageStartTs + ", lastLastStart=" + lastUidBatteryUsageStartTs Loading @@ -465,6 +482,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> } } // Now update the mLastUidBatteryUsage with the data we just saved above. // Now update the mLastUidBatteryUsage with the data we just saved above. copyUidBatteryUsage(mTmpUidBatteryUsage2, mLastUidBatteryUsage); copyUidBatteryUsage(mTmpUidBatteryUsage2, mLastUidBatteryUsage); } mTmpUidBatteryUsage2.clear(); mTmpUidBatteryUsage2.clear(); if (needUpdateUidBatteryUsageInWindow) { if (needUpdateUidBatteryUsageInWindow) { Loading @@ -473,9 +491,11 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> .includeProcessStateData() .includeProcessStateData() .aggregateSnapshots(now - windowSize, lastUidBatteryUsageStartTs); .aggregateSnapshots(now - windowSize, lastUidBatteryUsageStartTs); updateBatteryUsageStatsOnceInternal(buf, builder, userIds, batteryStatsInternal); updateBatteryUsageStatsOnceInternal(buf, builder, userIds, batteryStatsInternal); synchronized (mLock) { copyUidBatteryUsage(buf, mUidBatteryUsageInWindow); copyUidBatteryUsage(buf, mUidBatteryUsageInWindow); } } } } } private static BatteryUsageStats updateBatteryUsageStatsOnceInternal( private static BatteryUsageStats updateBatteryUsageStatsOnceInternal( SparseDoubleArray buf, BatteryUsageStatsQuery.Builder builder, SparseDoubleArray buf, BatteryUsageStatsQuery.Builder builder, Loading Loading @@ -584,6 +604,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> pw.print(prefix); pw.print(prefix); pw.println("APP BATTERY STATE TRACKER:"); pw.println("APP BATTERY STATE TRACKER:"); updateBatteryUsageStatsIfNecessary(mInjector.currentTimeMillis(), true); updateBatteryUsageStatsIfNecessary(mInjector.currentTimeMillis(), true); synchronized (mLock) { final SparseDoubleArray uidConsumers = mUidBatteryUsageInWindow; final SparseDoubleArray uidConsumers = mUidBatteryUsageInWindow; pw.print(" " + prefix); pw.print(" " + prefix); pw.print("Boot="); pw.print("Boot="); Loading Loading @@ -618,6 +639,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> mUidBatteryUsage.get(uid, 0.0d)); mUidBatteryUsage.get(uid, 0.0d)); } } } } } super.dump(pw, prefix); super.dump(pw, prefix); } } Loading