diff options
Diffstat (limited to 'core/java/android/os/BatteryStats.java')
| -rw-r--r-- | core/java/android/os/BatteryStats.java | 273 |
1 files changed, 192 insertions, 81 deletions
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 8804066ebeea..bc98a0b50425 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -41,7 +41,10 @@ import android.util.TimeUtils; public abstract class BatteryStats implements Parcelable { private static final boolean LOCAL_LOGV = false; - + + /** @hide */ + public static final String SERVICE_NAME = "batterystats"; + /** * A constant indicating a partial wake lock timer. */ @@ -98,6 +101,11 @@ public abstract class BatteryStats implements Parcelable { public static final int VIBRATOR_ON = 9; /** + * A constant indicating a foreground activity timer + */ + public static final int FOREGROUND_ACTIVITY = 10; + + /** * Include all of the data in the stats, including previously saved data. */ public static final int STATS_SINCE_CHARGED = 0; @@ -125,7 +133,7 @@ public abstract class BatteryStats implements Parcelable { /** * Bump the version on this if the checkin format changes. */ - private static final int BATTERY_STATS_CHECKIN_VERSION = 5; + private static final int BATTERY_STATS_CHECKIN_VERSION = 7; private static final long BYTES_PER_KB = 1024; private static final long BYTES_PER_MB = 1048576; // 1024^2 @@ -137,6 +145,7 @@ public abstract class BatteryStats implements Parcelable { private static final String PROCESS_DATA = "pr"; private static final String SENSOR_DATA = "sr"; private static final String VIBRATOR_DATA = "vib"; + private static final String FOREGROUND_DATA = "fg"; private static final String WAKELOCK_DATA = "wl"; private static final String KERNEL_WAKELOCK_DATA = "kwl"; private static final String NETWORK_DATA = "nt"; @@ -146,6 +155,7 @@ public abstract class BatteryStats implements Parcelable { private static final String BATTERY_LEVEL_DATA = "lv"; private static final String WIFI_DATA = "wfl"; private static final String MISC_DATA = "m"; + private static final String HISTORY_DATA = "h"; private static final String SCREEN_BRIGHTNESS_DATA = "br"; private static final String SIGNAL_STRENGTH_TIME_DATA = "sgt"; private static final String SIGNAL_SCANNING_TIME_DATA = "sst"; @@ -253,17 +263,7 @@ public abstract class BatteryStats implements Parcelable { * {@hide} */ public abstract int getUid(); - - /** - * {@hide} - */ - public abstract long getTcpBytesReceived(int which); - - /** - * {@hide} - */ - public abstract long getTcpBytesSent(int which); - + public abstract void noteWifiRunningLocked(); public abstract void noteWifiStoppedLocked(); public abstract void noteFullWifiLockAcquiredLocked(); @@ -276,6 +276,8 @@ public abstract class BatteryStats implements Parcelable { public abstract void noteAudioTurnedOffLocked(); public abstract void noteVideoTurnedOnLocked(); public abstract void noteVideoTurnedOffLocked(); + public abstract void noteActivityResumedLocked(); + public abstract void noteActivityPausedLocked(); public abstract long getWifiRunningTime(long batteryRealtime, int which); public abstract long getFullWifiLockTime(long batteryRealtime, int which); public abstract long getWifiScanTime(long batteryRealtime, int which); @@ -283,6 +285,7 @@ public abstract class BatteryStats implements Parcelable { int which); public abstract long getAudioTurnedOnTime(long batteryRealtime, int which); public abstract long getVideoTurnedOnTime(long batteryRealtime, int which); + public abstract Timer getForegroundActivityTimer(); public abstract Timer getVibratorOnTimer(); /** @@ -295,11 +298,14 @@ public abstract class BatteryStats implements Parcelable { }; public static final int NUM_USER_ACTIVITY_TYPES = 3; - + public abstract void noteUserActivityLocked(int type); public abstract boolean hasUserActivity(); public abstract int getUserActivityCount(int type, int which); - + + public abstract boolean hasNetworkActivity(); + public abstract long getNetworkActivityCount(int type, int which); + public static abstract class Sensor { /* * FIXME: it's not correct to use this magic value because it @@ -920,6 +926,15 @@ public abstract class BatteryStats implements Parcelable { */ public abstract long getBluetoothOnTime(long batteryRealtime, int which); + public static final int NETWORK_MOBILE_RX_BYTES = 0; + public static final int NETWORK_MOBILE_TX_BYTES = 1; + public static final int NETWORK_WIFI_RX_BYTES = 2; + public static final int NETWORK_WIFI_TX_BYTES = 3; + + public static final int NUM_NETWORK_ACTIVITY_TYPES = NETWORK_WIFI_TX_BYTES + 1; + + public abstract long getNetworkActivityCount(int type, int which); + /** * Return whether we are currently running on battery. */ @@ -1194,13 +1209,13 @@ public abstract class BatteryStats implements Parcelable { pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); pw.print(uid); pw.print(','); pw.print(category); pw.print(','); - pw.print(type); + pw.print(type); for (Object arg : args) { - pw.print(','); - pw.print(arg); + pw.print(','); + pw.print(arg); } - pw.print('\n'); + pw.println(); } /** @@ -1229,7 +1244,7 @@ public abstract class BatteryStats implements Parcelable { final int NU = uidStats.size(); String category = STAT_NAMES[which]; - + // Dump "battery" stat dumpLine(pw, 0 /* uid */, category, BATTERY_DATA, which == STATS_SINCE_CHARGED ? getStartCount() : "N/A", @@ -1237,16 +1252,20 @@ public abstract class BatteryStats implements Parcelable { totalRealtime / 1000, totalUptime / 1000); // Calculate total network and wakelock times across all uids. - long rxTotal = 0; - long txTotal = 0; + long mobileRxTotal = 0; + long mobileTxTotal = 0; + long wifiRxTotal = 0; + long wifiTxTotal = 0; long fullWakeLockTimeTotal = 0; long partialWakeLockTimeTotal = 0; for (int iu = 0; iu < NU; iu++) { Uid u = uidStats.valueAt(iu); - rxTotal += u.getTcpBytesReceived(which); - txTotal += u.getTcpBytesSent(which); - + mobileRxTotal += u.getNetworkActivityCount(NETWORK_MOBILE_RX_BYTES, which); + mobileTxTotal += u.getNetworkActivityCount(NETWORK_MOBILE_TX_BYTES, which); + wifiRxTotal += u.getNetworkActivityCount(NETWORK_WIFI_RX_BYTES, which); + wifiTxTotal += u.getNetworkActivityCount(NETWORK_WIFI_TX_BYTES, which); + Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); if (wakelocks.size() > 0) { for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent @@ -1270,7 +1289,8 @@ public abstract class BatteryStats implements Parcelable { // Dump misc stats dumpLine(pw, 0 /* uid */, category, MISC_DATA, screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000, - wifiRunningTime / 1000, bluetoothOnTime / 1000, rxTotal, txTotal, + wifiRunningTime / 1000, bluetoothOnTime / 1000, + mobileRxTotal, mobileTxTotal, wifiRxTotal, wifiTxTotal, fullWakeLockTimeTotal, partialWakeLockTimeTotal, getInputEventCount(which)); @@ -1341,14 +1361,18 @@ public abstract class BatteryStats implements Parcelable { } Uid u = uidStats.valueAt(iu); // Dump Network stats per uid, if any - long rx = u.getTcpBytesReceived(which); - long tx = u.getTcpBytesSent(which); + long mobileRx = u.getNetworkActivityCount(NETWORK_MOBILE_RX_BYTES, which); + long mobileTx = u.getNetworkActivityCount(NETWORK_MOBILE_TX_BYTES, which); + long wifiRx = u.getNetworkActivityCount(NETWORK_WIFI_RX_BYTES, which); + long wifiTx = u.getNetworkActivityCount(NETWORK_WIFI_TX_BYTES, which); long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which); long wifiScanTime = u.getWifiScanTime(batteryRealtime, which); long uidWifiRunningTime = u.getWifiRunningTime(batteryRealtime, which); - - if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx); - + + if (mobileRx > 0 || mobileTx > 0 || wifiRx > 0 || wifiTx > 0) { + dumpLine(pw, uid, category, NETWORK_DATA, mobileRx, mobileTx, wifiRx, wifiTx); + } + if (fullWifiLockOnTime != 0 || wifiScanTime != 0 || uidWifiRunningTime != 0) { dumpLine(pw, uid, category, WIFI_DATA, @@ -1384,7 +1408,11 @@ public abstract class BatteryStats implements Parcelable { // Only log if we had at lease one wakelock... if (sb.length() > 0) { - dumpLine(pw, uid, category, WAKELOCK_DATA, ent.getKey(), sb.toString()); + String name = ent.getKey(); + if (name.indexOf(',') >= 0) { + name = name.replace(',', '_'); + } + dumpLine(pw, uid, category, WAKELOCK_DATA, name, sb.toString()); } } } @@ -1417,22 +1445,31 @@ public abstract class BatteryStats implements Parcelable { } } + Timer fgTimer = u.getForegroundActivityTimer(); + if (fgTimer != null) { + // Convert from microseconds to milliseconds with rounding + long totalTime = (fgTimer.getTotalTimeLocked(batteryRealtime, which) + 500) / 1000; + int count = fgTimer.getCountLocked(which); + if (totalTime != 0) { + dumpLine(pw, uid, category, FOREGROUND_DATA, totalTime, count); + } + } + Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats(); if (processStats.size() > 0) { for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent : processStats.entrySet()) { Uid.Proc ps = ent.getValue(); - - long userTime = ps.getUserTime(which); - long systemTime = ps.getSystemTime(which); - int starts = ps.getStarts(which); - - if (userTime != 0 || systemTime != 0 || starts != 0) { - dumpLine(pw, uid, category, PROCESS_DATA, - ent.getKey(), // proc - userTime * 10, // cpu time in ms - systemTime * 10, // user time in ms - starts); // process starts + + final long userMillis = ps.getUserTime(which) * 10; + final long systemMillis = ps.getSystemTime(which) * 10; + final long foregroundMillis = ps.getForegroundTime(which) * 10; + final long starts = ps.getStarts(which); + + if (userMillis != 0 || systemMillis != 0 || foregroundMillis != 0 + || starts != 0) { + dumpLine(pw, uid, category, PROCESS_DATA, ent.getKey(), userMillis, + systemMillis, foregroundMillis, starts); } } } @@ -1551,8 +1588,10 @@ public abstract class BatteryStats implements Parcelable { pw.println(sb.toString()); // Calculate total network and wakelock times across all uids. - long rxTotal = 0; - long txTotal = 0; + long mobileRxTotal = 0; + long mobileTxTotal = 0; + long wifiRxTotal = 0; + long wifiTxTotal = 0; long fullWakeLockTimeTotalMicros = 0; long partialWakeLockTimeTotalMicros = 0; @@ -1605,9 +1644,11 @@ public abstract class BatteryStats implements Parcelable { for (int iu = 0; iu < NU; iu++) { Uid u = uidStats.valueAt(iu); - rxTotal += u.getTcpBytesReceived(which); - txTotal += u.getTcpBytesSent(which); - + mobileRxTotal += u.getNetworkActivityCount(NETWORK_MOBILE_RX_BYTES, which); + mobileTxTotal += u.getNetworkActivityCount(NETWORK_MOBILE_TX_BYTES, which); + wifiRxTotal += u.getNetworkActivityCount(NETWORK_WIFI_RX_BYTES, which); + wifiTxTotal += u.getNetworkActivityCount(NETWORK_WIFI_TX_BYTES, which); + Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); if (wakelocks.size() > 0) { for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent @@ -1640,8 +1681,11 @@ public abstract class BatteryStats implements Parcelable { } pw.print(prefix); - pw.print(" Total received: "); pw.print(formatBytesLocked(rxTotal)); - pw.print(", Total sent: "); pw.println(formatBytesLocked(txTotal)); + pw.print(" Mobile total received: "); pw.print(formatBytesLocked(mobileRxTotal)); + pw.print(", Total sent: "); pw.println(formatBytesLocked(mobileTxTotal)); + pw.print(prefix); + pw.print(" Wi-Fi total received: "); pw.print(formatBytesLocked(wifiRxTotal)); + pw.print(", Total sent: "); pw.println(formatBytesLocked(wifiTxTotal)); sb.setLength(0); sb.append(prefix); sb.append(" Total full wakelock time: "); formatTimeMs(sb, @@ -1760,8 +1804,8 @@ public abstract class BatteryStats implements Parcelable { for (int i=0; i<timers.size(); i++) { TimerEntry timer = timers.get(i); sb.setLength(0); - sb.append(" Wake lock #"); - sb.append(timer.mId); + sb.append(" Wake lock "); + UserHandle.formatUid(sb, timer.mId); sb.append(" "); sb.append(timer.mName); printWakeLock(sb, timer.mTimer, batteryRealtime, null, which, ": "); @@ -1779,22 +1823,32 @@ public abstract class BatteryStats implements Parcelable { } Uid u = uidStats.valueAt(iu); - - pw.println(prefix + " #" + uid + ":"); + + pw.print(prefix); + pw.print(" "); + UserHandle.formatUid(pw, uid); + pw.println(":"); boolean uidActivity = false; - long tcpReceived = u.getTcpBytesReceived(which); - long tcpSent = u.getTcpBytesSent(which); + long mobileRxBytes = u.getNetworkActivityCount(NETWORK_MOBILE_RX_BYTES, which); + long mobileTxBytes = u.getNetworkActivityCount(NETWORK_MOBILE_TX_BYTES, which); + long wifiRxBytes = u.getNetworkActivityCount(NETWORK_WIFI_RX_BYTES, which); + long wifiTxBytes = u.getNetworkActivityCount(NETWORK_WIFI_TX_BYTES, which); long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which); long wifiScanTime = u.getWifiScanTime(batteryRealtime, which); long uidWifiRunningTime = u.getWifiRunningTime(batteryRealtime, which); - - if (tcpReceived != 0 || tcpSent != 0) { - pw.print(prefix); pw.print(" Network: "); - pw.print(formatBytesLocked(tcpReceived)); pw.print(" received, "); - pw.print(formatBytesLocked(tcpSent)); pw.println(" sent"); + + if (mobileRxBytes > 0 || mobileTxBytes > 0) { + pw.print(prefix); pw.print(" Mobile network: "); + pw.print(formatBytesLocked(mobileRxBytes)); pw.print(" received, "); + pw.print(formatBytesLocked(mobileTxBytes)); pw.println(" sent"); } - + if (wifiRxBytes > 0 || wifiTxBytes > 0) { + pw.print(prefix); pw.print(" Wi-Fi network: "); + pw.print(formatBytesLocked(wifiRxBytes)); pw.print(" received, "); + pw.print(formatBytesLocked(wifiTxBytes)); pw.println(" sent"); + } + if (u.hasUserActivity()) { boolean hasData = false; for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { @@ -1961,6 +2015,24 @@ public abstract class BatteryStats implements Parcelable { } } + Timer fgTimer = u.getForegroundActivityTimer(); + if (fgTimer != null) { + // Convert from microseconds to milliseconds with rounding + long totalTime = (fgTimer.getTotalTimeLocked(batteryRealtime, which) + 500) / 1000; + int count = fgTimer.getCountLocked(which); + if (totalTime != 0) { + sb.setLength(0); + sb.append(prefix); + sb.append(" Foreground activities: "); + formatTimeMs(sb, totalTime); + sb.append("realtime ("); + sb.append(count); + sb.append(" times)"); + pw.println(sb.toString()); + uidActivity = true; + } + } + Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats(); if (processStats.size() > 0) { for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent @@ -1968,23 +2040,26 @@ public abstract class BatteryStats implements Parcelable { Uid.Proc ps = ent.getValue(); long userTime; long systemTime; + long foregroundTime; int starts; int numExcessive; userTime = ps.getUserTime(which); systemTime = ps.getSystemTime(which); + foregroundTime = ps.getForegroundTime(which); starts = ps.getStarts(which); numExcessive = which == STATS_SINCE_CHARGED ? ps.countExcessivePowers() : 0; - if (userTime != 0 || systemTime != 0 || starts != 0 + if (userTime != 0 || systemTime != 0 || foregroundTime != 0 || starts != 0 || numExcessive != 0) { sb.setLength(0); sb.append(prefix); sb.append(" Proc "); sb.append(ent.getKey()); sb.append(":\n"); sb.append(prefix); sb.append(" CPU: "); formatTime(sb, userTime); sb.append("usr + "); - formatTime(sb, systemTime); sb.append("krn"); + formatTime(sb, systemTime); sb.append("krn ; "); + formatTime(sb, foregroundTime); sb.append("fg"); if (starts != 0) { sb.append("\n"); sb.append(prefix); sb.append(" "); sb.append(starts); sb.append(" proc starts"); @@ -2042,7 +2117,7 @@ public abstract class BatteryStats implements Parcelable { sb.append(sent.getKey()); sb.append(":\n"); sb.append(prefix); sb.append(" Created for: "); formatTimeMs(sb, startTime / 1000); - sb.append(" uptime\n"); + sb.append("uptime\n"); sb.append(prefix); sb.append(" Starts: "); sb.append(starts); sb.append(", launches: "); sb.append(launches); @@ -2207,6 +2282,30 @@ public abstract class BatteryStats implements Parcelable { } oldState = rec.states; } + + public void printNextItemCheckin(PrintWriter pw, HistoryItem rec, long now) { + pw.print(rec.time-now); + pw.print(","); + if (rec.cmd == HistoryItem.CMD_START) { + pw.print("start"); + } else if (rec.cmd == HistoryItem.CMD_OVERFLOW) { + pw.print("overflow"); + } else { + pw.print(rec.batteryLevel); + pw.print(","); + pw.print(rec.states); + pw.print(","); + pw.print(rec.batteryStatus); + pw.print(","); + pw.print(rec.batteryHealth); + pw.print(","); + pw.print(rec.batteryPlugType); + pw.print(","); + pw.print((int)rec.batteryTemperature); + pw.print(","); + pw.print((int)rec.batteryVoltage); + } + } } /** @@ -2215,7 +2314,7 @@ public abstract class BatteryStats implements Parcelable { * @param pw a Printer to receive the dump output. */ @SuppressWarnings("unused") - public void dumpLocked(PrintWriter pw) { + public void dumpLocked(PrintWriter pw, boolean isUnpluggedOnly, int reqUid) { prepareForDumpLocked(); long now = getHistoryBaseTime() + SystemClock.elapsedRealtime(); @@ -2267,29 +2366,41 @@ public abstract class BatteryStats implements Parcelable { if (didPid) { pw.println(""); } - - pw.println("Statistics since last charge:"); - pw.println(" System starts: " + getStartCount() - + ", currently on battery: " + getIsOnBattery()); - dumpLocked(pw, "", STATS_SINCE_CHARGED, -1); - pw.println(""); + + if (!isUnpluggedOnly) { + pw.println("Statistics since last charge:"); + pw.println(" System starts: " + getStartCount() + + ", currently on battery: " + getIsOnBattery()); + dumpLocked(pw, "", STATS_SINCE_CHARGED, reqUid); + pw.println(""); + } pw.println("Statistics since last unplugged:"); - dumpLocked(pw, "", STATS_SINCE_UNPLUGGED, -1); + dumpLocked(pw, "", STATS_SINCE_UNPLUGGED, reqUid); } @SuppressWarnings("unused") - public void dumpCheckinLocked(PrintWriter pw, String[] args, List<ApplicationInfo> apps) { + public void dumpCheckinLocked( + PrintWriter pw, List<ApplicationInfo> apps, boolean isUnpluggedOnly, + boolean includeHistory) { prepareForDumpLocked(); - - boolean isUnpluggedOnly = false; - for (String arg : args) { - if ("-u".equals(arg)) { - if (LOCAL_LOGV) Log.v("BatteryStats", "Dumping unplugged data"); - isUnpluggedOnly = true; + long now = getHistoryBaseTime() + SystemClock.elapsedRealtime(); + + if (includeHistory) { + final HistoryItem rec = new HistoryItem(); + if (startIteratingHistoryLocked()) { + HistoryPrinter hprinter = new HistoryPrinter(); + while (getNextHistoryLocked(rec)) { + pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); + pw.print(0); pw.print(','); + pw.print(HISTORY_DATA); pw.print(','); + hprinter.printNextItemCheckin(pw, rec, now); + pw.println(); + } + finishIteratingHistoryLocked(); } } - + if (apps != null) { SparseArray<ArrayList<String>> uids = new SparseArray<ArrayList<String>>(); for (int i=0; i<apps.size(); i++) { |
