Loading services/core/java/com/android/server/am/BatteryStatsService.java +47 −42 Original line number Original line Diff line number Diff line Loading @@ -1323,36 +1323,28 @@ public final class BatteryStatsService extends IBatteryStats.Stub delta.mTimestamp = latest.getTimeStamp(); delta.mTimestamp = latest.getTimeStamp(); delta.mStackState = latest.getStackState(); delta.mStackState = latest.getStackState(); // These times seem to be the most reliable. final long txTimeMs = latest.mControllerTxTimeMs - lastTxMs; delta.mControllerTxTimeMs = latest.mControllerTxTimeMs - lastTxMs; final long rxTimeMs = latest.mControllerRxTimeMs - lastRxMs; delta.mControllerRxTimeMs = latest.mControllerRxTimeMs - lastRxMs; final long idleTimeMs = latest.mControllerIdleTimeMs - lastIdleMs; // WiFi calculates the idle time as a difference from the on time and the various if (txTimeMs < 0 || rxTimeMs < 0) { // Rx + Tx times. There seems to be some missing time there because this sometimes // becomes negative. Just cap it at 0 and move on. // b/21613534 delta.mControllerIdleTimeMs = Math.max(0, latest.mControllerIdleTimeMs - lastIdleMs); delta.mControllerEnergyUsed = Math.max(0, latest.mControllerEnergyUsed - lastEnergy); if (delta.mControllerTxTimeMs < 0 || delta.mControllerRxTimeMs < 0) { // The stats were reset by the WiFi system (which is why our delta is negative). // The stats were reset by the WiFi system (which is why our delta is negative). // Returns the unaltered stats. // Returns the unaltered stats. delta.mControllerEnergyUsed = latest.mControllerEnergyUsed; delta.mControllerEnergyUsed = latest.mControllerEnergyUsed; delta.mControllerRxTimeMs = latest.mControllerRxTimeMs; delta.mControllerRxTimeMs = latest.mControllerRxTimeMs; delta.mControllerTxTimeMs = latest.mControllerTxTimeMs; delta.mControllerTxTimeMs = latest.mControllerTxTimeMs; delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs; delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs; Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta); Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta); } } else { final long totalActiveTimeMs = txTimeMs + rxTimeMs; // There is some accuracy error in reports so allow some slop in the results. long maxExpectedIdleTimeMs; final long SAMPLE_ERROR_MILLIS = 750; // Active time can never be greater than the total time, the stats received seem final long totalTimeMs = delta.mControllerIdleTimeMs + delta.mControllerRxTimeMs + // to be corrupt. delta.mControllerTxTimeMs; if (totalActiveTimeMs > timePeriodMs) { if (totalTimeMs > timePeriodMs + SAMPLE_ERROR_MILLIS) { maxExpectedIdleTimeMs = timePeriodMs; StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder(); sb.append("Total time "); sb.append("Total Active time "); TimeUtils.formatDuration(totalTimeMs, sb); TimeUtils.formatDuration(totalActiveTimeMs, sb); sb.append(" is longer than sample period "); sb.append(" is longer than sample period "); TimeUtils.formatDuration(timePeriodMs, sb); TimeUtils.formatDuration(timePeriodMs, sb); sb.append(".\n"); sb.append(".\n"); Loading @@ -1372,6 +1364,19 @@ public final class BatteryStatsService extends IBatteryStats.Stub TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb); TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb); sb.append(" e=").append(latest.mControllerEnergyUsed); sb.append(" e=").append(latest.mControllerEnergyUsed); Slog.wtf(TAG, sb.toString()); Slog.wtf(TAG, sb.toString()); } else { maxExpectedIdleTimeMs = timePeriodMs - totalActiveTimeMs; } // These times seem to be the most reliable. delta.mControllerTxTimeMs = txTimeMs; delta.mControllerRxTimeMs = rxTimeMs; // WiFi calculates the idle time as a difference from the on time and the various // Rx + Tx times. There seems to be some missing time there because this sometimes // becomes negative. Just cap it at 0 and ensure that it is less than the expected idle // time from the difference in timestamps. // b/21613534 delta.mControllerIdleTimeMs = Math.min(maxExpectedIdleTimeMs, Math.max(0, idleTimeMs)); delta.mControllerEnergyUsed = Math.max(0, latest.mControllerEnergyUsed - lastEnergy); } } mLastInfo = latest; mLastInfo = latest; Loading Loading
services/core/java/com/android/server/am/BatteryStatsService.java +47 −42 Original line number Original line Diff line number Diff line Loading @@ -1323,36 +1323,28 @@ public final class BatteryStatsService extends IBatteryStats.Stub delta.mTimestamp = latest.getTimeStamp(); delta.mTimestamp = latest.getTimeStamp(); delta.mStackState = latest.getStackState(); delta.mStackState = latest.getStackState(); // These times seem to be the most reliable. final long txTimeMs = latest.mControllerTxTimeMs - lastTxMs; delta.mControllerTxTimeMs = latest.mControllerTxTimeMs - lastTxMs; final long rxTimeMs = latest.mControllerRxTimeMs - lastRxMs; delta.mControllerRxTimeMs = latest.mControllerRxTimeMs - lastRxMs; final long idleTimeMs = latest.mControllerIdleTimeMs - lastIdleMs; // WiFi calculates the idle time as a difference from the on time and the various if (txTimeMs < 0 || rxTimeMs < 0) { // Rx + Tx times. There seems to be some missing time there because this sometimes // becomes negative. Just cap it at 0 and move on. // b/21613534 delta.mControllerIdleTimeMs = Math.max(0, latest.mControllerIdleTimeMs - lastIdleMs); delta.mControllerEnergyUsed = Math.max(0, latest.mControllerEnergyUsed - lastEnergy); if (delta.mControllerTxTimeMs < 0 || delta.mControllerRxTimeMs < 0) { // The stats were reset by the WiFi system (which is why our delta is negative). // The stats were reset by the WiFi system (which is why our delta is negative). // Returns the unaltered stats. // Returns the unaltered stats. delta.mControllerEnergyUsed = latest.mControllerEnergyUsed; delta.mControllerEnergyUsed = latest.mControllerEnergyUsed; delta.mControllerRxTimeMs = latest.mControllerRxTimeMs; delta.mControllerRxTimeMs = latest.mControllerRxTimeMs; delta.mControllerTxTimeMs = latest.mControllerTxTimeMs; delta.mControllerTxTimeMs = latest.mControllerTxTimeMs; delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs; delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs; Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta); Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta); } } else { final long totalActiveTimeMs = txTimeMs + rxTimeMs; // There is some accuracy error in reports so allow some slop in the results. long maxExpectedIdleTimeMs; final long SAMPLE_ERROR_MILLIS = 750; // Active time can never be greater than the total time, the stats received seem final long totalTimeMs = delta.mControllerIdleTimeMs + delta.mControllerRxTimeMs + // to be corrupt. delta.mControllerTxTimeMs; if (totalActiveTimeMs > timePeriodMs) { if (totalTimeMs > timePeriodMs + SAMPLE_ERROR_MILLIS) { maxExpectedIdleTimeMs = timePeriodMs; StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder(); sb.append("Total time "); sb.append("Total Active time "); TimeUtils.formatDuration(totalTimeMs, sb); TimeUtils.formatDuration(totalActiveTimeMs, sb); sb.append(" is longer than sample period "); sb.append(" is longer than sample period "); TimeUtils.formatDuration(timePeriodMs, sb); TimeUtils.formatDuration(timePeriodMs, sb); sb.append(".\n"); sb.append(".\n"); Loading @@ -1372,6 +1364,19 @@ public final class BatteryStatsService extends IBatteryStats.Stub TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb); TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb); sb.append(" e=").append(latest.mControllerEnergyUsed); sb.append(" e=").append(latest.mControllerEnergyUsed); Slog.wtf(TAG, sb.toString()); Slog.wtf(TAG, sb.toString()); } else { maxExpectedIdleTimeMs = timePeriodMs - totalActiveTimeMs; } // These times seem to be the most reliable. delta.mControllerTxTimeMs = txTimeMs; delta.mControllerRxTimeMs = rxTimeMs; // WiFi calculates the idle time as a difference from the on time and the various // Rx + Tx times. There seems to be some missing time there because this sometimes // becomes negative. Just cap it at 0 and ensure that it is less than the expected idle // time from the difference in timestamps. // b/21613534 delta.mControllerIdleTimeMs = Math.min(maxExpectedIdleTimeMs, Math.max(0, idleTimeMs)); delta.mControllerEnergyUsed = Math.max(0, latest.mControllerEnergyUsed - lastEnergy); } } mLastInfo = latest; mLastInfo = latest; Loading