BatteryStats.java revision 22ac043ec139714644256cc5e2a9ff8d126ade00
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os; 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Formatter; 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class providing access to battery usage statistics, including information on 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wakelocks, processes, packages, and services. All times are represented in microseconds 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * except where indicated otherwise. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class BatteryStats implements Parcelable { 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean LOCAL_LOGV = false; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A constant indicating a partial wake lock timer. 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WAKE_TYPE_PARTIAL = 0; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A constant indicating a full wake lock timer. 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WAKE_TYPE_FULL = 1; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A constant indicating a window wake lock timer. 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WAKE_TYPE_WINDOW = 2; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A constant indicating a sensor timer. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SENSOR = 3; 42105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 43105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 44105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * A constant indicating a full wifi lock timer 45105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 46105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@hide} 47105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 48105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public static final int FULL_WIFI_LOCK = 4; 49105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 50105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 51105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * A constant indicating a scan wifi lock timer 52105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 53105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@hide} 54105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 55105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public static final int SCAN_WIFI_LOCK = 5; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Include all of the data in the stats, including previously saved data. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATS_TOTAL = 0; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Include only the last run in the stats. 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATS_LAST = 1; 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Include only the current run in the stats. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATS_CURRENT = 2; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Include only the run since the last time the device was unplugged in the stats. 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATS_UNPLUGGED = 3; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bump the version on this if the checkin format changes. 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar private static final int BATTERY_STATS_CHECKIN_VERSION = 2; 8122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 8222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar private static final long BYTES_PER_KB = 1024; 8322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar private static final long BYTES_PER_MB = 1048576; // 1024^2 8422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar private static final long BYTES_PER_GB = 1073741824; //1024^3 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: Update this list if you add/change any stats above. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String[] STAT_NAMES = { "total", "last", "current", "unplugged" }; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String APK_DATA = "apk"; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String PROCESS_DATA = "process"; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String SENSOR_DATA = "sensor"; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String WAKELOCK_DATA = "wakelock"; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String NETWORK_DATA = "network"; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String BATTERY_DATA = "battery"; 95105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project private static final String WIFI_LOCK_DATA = "wifilock"; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String MISC_DATA = "misc"; 97627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn private static final String SIGNAL_STRENGTH_DATA = "signal"; 98627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn private static final String DATA_CONNECTION_DATA = "dataconn"; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final StringBuilder mFormatBuilder = new StringBuilder(8); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Formatter mFormatter = new Formatter(mFormatBuilder); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State for keeping track of timing information. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Timer { 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the count associated with this Timer for the 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected type of statistics. 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getCount(int which); 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total time in microseconds associated with this Timer for the 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected type of statistics. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param batteryRealtime system realtime on battery in microseconds 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a time in microseconds 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getTotalTime(long batteryRealtime, int which); 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Temporary for debugging. 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 129627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public abstract void logState(Printer pw, String prefix); 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular uid. 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Uid { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a mapping containing wakelock statistics. 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a Map from Strings to Uid.Wakelock objects. 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Map<String, ? extends Wakelock> getWakelockStats(); 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular wake lock. 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Wakelock { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Timer getWakeTime(int type); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a mapping containing sensor statistics. 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a Map from Integer sensor ids to Uid.Sensor objects. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Map<Integer, ? extends Sensor> getSensorStats(); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a mapping containing process statistics. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a Map from Strings to Uid.Proc objects. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Map<String, ? extends Proc> getProcessStats(); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a mapping containing package statistics. 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a Map from Strings to Uid.Pkg objects. 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Map<String, ? extends Pkg> getPackageStats(); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getUid(); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getTcpBytesReceived(int which); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getTcpBytesSent(int which); 186105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 187105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract void noteFullWifiLockAcquiredLocked(); 188105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract void noteFullWifiLockReleasedLocked(); 189105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract void noteScanWifiLockAcquiredLocked(); 190105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract void noteScanWifiLockReleasedLocked(); 191105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract long getFullWifiLockTime(long batteryRealtime, int which); 192105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract long getScanWifiLockTime(long batteryRealtime, int which); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Sensor { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Magic sensor number for the GPS. 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int GPS = -10000; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getHandle(); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Timer getSensorTime(); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular process. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Proc { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total time (in 1/100 sec) spent executing in user code. 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getUserTime(int which); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total time (in 1/100 sec) spent executing in system code. 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getSystemTime(int which); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of times the process has been started. 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getStarts(int which); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular package. 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Pkg { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of times this package has done something that could wake up the 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device from sleep. 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getWakeups(int which); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a mapping containing service statistics. 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Map<String, ? extends Serv> getServiceStats(); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular service. 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract class Serv { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the amount of time spent started. 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param batteryUptime elapsed uptime on battery in microseconds. 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getStartTime(long batteryUptime, int which); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total number of times startService() has been called. 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getStarts(int which); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total number times the service has been launched. 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getLaunches(int which); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of times the device has been started. 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getStartCount(); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the time in milliseconds that the screen has been on while the device was 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * running on battery. 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getScreenOnTime(long batteryRealtime, int which); 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the time in milliseconds that the phone has been on while the device was 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * running on battery. 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getPhoneOnTime(long batteryRealtime, int which); 299d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 300627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0; 301627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int SIGNAL_STRENGTH_POOR = 1; 302627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int SIGNAL_STRENGTH_MODERATE = 2; 303627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int SIGNAL_STRENGTH_GOOD = 3; 304627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int SIGNAL_STRENGTH_GREAT = 4; 305627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 306627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn static final String[] SIGNAL_STRENGTH_NAMES = { 307627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn "none", "poor", "moderate", "good", "great" 308627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn }; 309627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 310627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int NUM_SIGNAL_STRENGTH_BINS = 5; 311627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 312627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn /** 313627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * Returns the time in milliseconds that the phone has been running with 314627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * the given signal strength. 315627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * 316627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * {@hide} 317627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn */ 318627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public abstract long getPhoneSignalStrengthTime(int strengthBin, 319627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which); 320627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 321627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int DATA_CONNECTION_NONE = 0; 322627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int DATA_CONNECTION_GPRS = 1; 323627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int DATA_CONNECTION_EDGE = 2; 324627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int DATA_CONNECTION_UMTS = 3; 325627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int DATA_CONNECTION_OTHER = 4; 326627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 327627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn static final String[] DATA_CONNECTION_NAMES = { 328627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn "none", "gprs", "edge", "umts", "other" 329627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn }; 330627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 331627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public static final int NUM_DATA_CONNECTION_TYPES = 5; 332627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 333627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn /** 334627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * Returns the time in milliseconds that the phone has been running with 335627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * the given data connection. 336627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * 337627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn * {@hide} 338627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn */ 339627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public abstract long getPhoneDataConnectionTime(int dataType, 340627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which); 341627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 343105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * Returns the time in milliseconds that wifi has been on while the device was 344105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * running on battery. 345105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 346105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@hide} 347105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 348105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract long getWifiOnTime(long batteryRealtime, int which); 349d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 350d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood /** 351d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood * Returns the time in milliseconds that wifi has been on and the driver has 352d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood * been in the running state while the device was running on battery. 353d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood * 354d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood * {@hide} 355d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood */ 356d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood public abstract long getWifiRunningTime(long batteryRealtime, int which); 357d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 358105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 359105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * Returns the time in milliseconds that bluetooth has been on while the device was 360105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * running on battery. 361105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 362105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@hide} 363105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 364105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract long getBluetoothOnTime(long batteryRealtime, int which); 365105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 366105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return whether we are currently running on battery. 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract boolean getIsOnBattery(); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a SparseArray containing the statistics for each uid. 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract SparseArray<? extends Uid> getUidStats(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current battery uptime in microseconds. 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the amount of elapsed realtime in microseconds. 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getBatteryUptime(long curTime); 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current battery realtime in microseconds. 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the amount of elapsed realtime in microseconds. 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getBatteryRealtime(long curTime); 389105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 390105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 391105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * Returns the battery percentage level at the last time the device was unplugged from power, 392105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * or the last time it was booted while unplugged. 393105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 394105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract int getUnpluggedStartLevel(); 395105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 396105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 397105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * Returns the battery percentage level at the last time the device was plugged into power. 398105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 399105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract int getPluggedStartLevel(); 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total, last, or current battery uptime in microseconds. 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the elapsed realtime in microseconds. 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long computeBatteryUptime(long curTime, int which); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total, last, or current battery realtime in microseconds. 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the current elapsed realtime in microseconds. 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long computeBatteryRealtime(long curTime, int which); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total, last, or current uptime in microseconds. 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the current elapsed realtime in microseconds. 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long computeUptime(long curTime, int which); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total, last, or current realtime in microseconds. 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * * 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the current elapsed realtime in microseconds. 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long computeRealtime(long curTime, int which); 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static void formatTime(StringBuilder out, long seconds) { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long days = seconds / (60 * 60 * 24); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (days != 0) { 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(days); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append("d "); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long used = days * 60 * 60 * 24; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long hours = (seconds - used) / (60 * 60); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hours != 0 || used != 0) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(hours); 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append("h "); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project used += hours * 60 * 60; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mins = (seconds-used) / 60; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mins != 0 || used != 0) { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(mins); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append("m "); 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project used += mins * 60; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (seconds != 0 || used != 0) { 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(seconds-used); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append("s "); 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static String formatTime(long time) { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long sec = time / 100; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project formatTime(sb, sec); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append((time - (sec * 100)) * 10); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("ms "); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static String formatTimeMs(long time) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long sec = time / 1000; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project formatTime(sb, sec); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(time - (sec * 1000)); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("ms "); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final String formatRatioLocked(long num, long den) { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (den == 0L) { 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "---%"; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float perc = ((float)num) / ((float)den) * 100; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormatBuilder.setLength(0); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormatter.format("%.1f%%", perc); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFormatBuilder.toString(); 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 48922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar private final String formatBytesLocked(long bytes) { 49022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar mFormatBuilder.setLength(0); 49122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 49222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (bytes < BYTES_PER_KB) { 49322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar return bytes + "B"; 49422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } else if (bytes < BYTES_PER_MB) { 49522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar mFormatter.format("%.2fKB", bytes / (double) BYTES_PER_KB); 49622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar return mFormatBuilder.toString(); 49722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } else if (bytes < BYTES_PER_GB){ 49822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar mFormatter.format("%.2fMB", bytes / (double) BYTES_PER_MB); 49922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar return mFormatBuilder.toString(); 50022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } else { 50122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar mFormatter.format("%.2fGB", bytes / (double) BYTES_PER_GB); 50222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar return mFormatBuilder.toString(); 50322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 50422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 50522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sb a StringBuilder object. 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer object contining the wakelock times. 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param batteryRealtime the current on-battery time in microseconds. 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name the name of the wakelock. 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param linePrefix a String to be prepended to each line of output. 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the line prefix 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String printWakeLock(StringBuilder sb, Timer timer, 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long batteryRealtime, String name, int which, String linePrefix) { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer != null) { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convert from microseconds to milliseconds with rounding 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long totalTimeMicros = timer.getTotalTime(batteryRealtime, which); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long totalTimeMillis = (totalTimeMicros + 500) / 1000; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = timer.getCount(which); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (totalTimeMillis != 0) { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(linePrefix); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(formatTimeMs(totalTimeMillis)); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(name); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(' '); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append('('); 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(count); 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" times)"); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ", "; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return linePrefix; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checkin version of wakelock printer. Prints simple comma-separated list. 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sb a StringBuilder object. 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer object contining the wakelock times. 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param now the current time in microseconds. 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name the name of the wakelock. 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param linePrefix a String to be prepended to each line of output. 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the line prefix 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String printWakeLockCheckin(StringBuilder sb, Timer timer, long now, 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name, int which, String linePrefix) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long totalTimeMicros = 0; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = 0; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer != null) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalTimeMicros = timer.getTotalTime(now, which); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = timer.getCount(which); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(linePrefix); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append((totalTimeMicros + 500) / 1000); // microseconds to milliseconds with rounding 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(','); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(name); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(','); 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(count); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ","; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dump a comma-separated line of values for terse checkin mode. 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pw the PageWriter to dump log to 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param category category of data (e.g. "total", "last", "unplugged", "current" ) 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param type type of data (e.g. "wakelock", "sensor", "process", "apk" , "process", "network") 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args type-dependent data arguments 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final void dumpLine(PrintWriter pw, int uid, String category, String type, 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object... args ) { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(uid); pw.print(','); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(category); pw.print(','); 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(type); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Object arg : args) { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(','); 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(arg); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print('\n'); 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checkin server version of dump to produce more compact, computer-readable log. 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * NOTE: all times are expressed in 'ms'. 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fd 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pw 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void dumpCheckinLocked(PrintWriter pw, int which) { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long rawUptime = SystemClock.uptimeMillis() * 1000; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long rawRealtime = SystemClock.elapsedRealtime() * 1000; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptime(rawUptime); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = getBatteryRealtime(rawRealtime); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long whichBatteryUptime = computeBatteryUptime(rawUptime, which); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long totalRealtime = computeRealtime(rawRealtime, which); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long totalUptime = computeUptime(rawUptime, which); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long screenOnTime = getScreenOnTime(batteryRealtime, which); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long phoneOnTime = getPhoneOnTime(batteryRealtime, which); 608105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long wifiOnTime = getWifiOnTime(batteryRealtime, which); 609d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which); 610105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(128); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 61422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar SparseArray<? extends Uid> uidStats = getUidStats(); 61522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar final int NU = uidStats.size(); 61622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String category = STAT_NAMES[which]; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dump "battery" stat 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, 0 /* uid */, category, BATTERY_DATA, 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project which == STATS_TOTAL ? getStartCount() : "N/A", 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whichBatteryUptime / 1000, whichBatteryRealtime / 1000, 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalUptime / 1000, totalRealtime / 1000); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 62522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar // Calculate total network and wakelock times across all uids. 62622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long rxTotal = 0; 62722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long txTotal = 0; 62822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long fullWakeLockTimeTotal = 0; 62922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long partialWakeLockTimeTotal = 0; 63022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 63122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar for (int iu = 0; iu < NU; iu++) { 63222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Uid u = uidStats.valueAt(iu); 63322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar rxTotal += u.getTcpBytesReceived(which); 63422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar txTotal += u.getTcpBytesSent(which); 63522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 63622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); 63722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (wakelocks.size() > 0) { 63822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent 63922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar : wakelocks.entrySet()) { 64022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Uid.Wakelock wl = ent.getValue(); 64122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 64222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL); 64322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (fullWakeTimer != null) { 64422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar fullWakeLockTimeTotal += fullWakeTimer.getTotalTime(batteryRealtime, which); 64522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 64622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 64722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL); 64822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (partialWakeTimer != null) { 64922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar partialWakeLockTimeTotal += partialWakeTimer.getTotalTime( 65022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar batteryRealtime, which); 65122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 65222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 65322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 65422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 65522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dump misc stats 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, 0 /* uid */, category, MISC_DATA, 658d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000, 65922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar wifiRunningTime / 1000, bluetoothOnTime / 1000, rxTotal, txTotal, 66022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar fullWakeLockTimeTotal, partialWakeLockTimeTotal); 661105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 662627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Dump signal strength stats 663627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn Object[] args = new Object[NUM_SIGNAL_STRENGTH_BINS]; 664627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 665627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn args[i] = getPhoneSignalStrengthTime(i, batteryRealtime, which) / 1000; 666627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 667627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn dumpLine(pw, 0 /* uid */, category, SIGNAL_STRENGTH_DATA, args); 668627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 669627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Dump network type stats 670627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn args = new Object[NUM_DATA_CONNECTION_TYPES]; 671627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 672627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn args[i] = getPhoneDataConnectionTime(i, batteryRealtime, which) / 1000; 673627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 674627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn dumpLine(pw, 0 /* uid */, category, DATA_CONNECTION_DATA, args); 675627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 676105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (which == STATS_UNPLUGGED) { 677105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project dumpLine(pw, 0 /* uid */, category, BATTERY_DATA, getUnpluggedStartLevel(), 678105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project getPluggedStartLevel()); 679105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int uid = uidStats.keyAt(iu); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = uidStats.valueAt(iu); 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dump Network stats per uid, if any 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long rx = u.getTcpBytesReceived(which); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long tx = u.getTcpBytesSent(which); 687105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which); 688105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which); 689105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx); 691105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 692105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0) { 693105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project dumpLine(pw, uid, category, WIFI_LOCK_DATA, 694105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project fullWifiLockOnTime, scanWifiLockOnTime); 695105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wakelocks.size() > 0) { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : wakelocks.entrySet()) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String linePrefix = ""; 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.setLength(0); 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime, 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "full", which, linePrefix); 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime, 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "partial", which, linePrefix); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime, 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "window", which, linePrefix); 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only log if we had at lease one wakelock... 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sb.length() > 0) { 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, uid, category, WAKELOCK_DATA, ent.getKey(), sb.toString()); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats(); 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sensors.size() > 0) { 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : sensors.entrySet()) { 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = ent.getKey(); 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer timer = se.getSensorTime(); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer != null) { 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convert from microseconds to milliseconds with rounding 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long totalTime = (timer.getTotalTime(batteryRealtime, which) + 500) / 1000; 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = timer.getCount(which); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (totalTime != 0) { 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats(); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (processStats.size() > 0) { 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : processStats.entrySet()) { 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long userTime = ps.getUserTime(which); 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long systemTime = ps.getSystemTime(which); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int starts = ps.getStarts(which); 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (userTime != 0 || systemTime != 0 || starts != 0) { 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, uid, category, PROCESS_DATA, 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ent.getKey(), // proc 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userTime * 10, // cpu time in ms 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project systemTime * 10, // user time in ms 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project starts); // process starts 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats(); 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageStats.size() > 0) { 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : packageStats.entrySet()) { 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wakeups = ps.getWakeups(which); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends Uid.Pkg.Serv> serviceStats = ps.getServiceStats(); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : serviceStats.entrySet()) { 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStats.Uid.Pkg.Serv ss = sent.getValue(); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long startTime = ss.getStartTime(batteryUptime, which); 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int starts = ss.getStarts(which); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int launches = ss.getLaunches(which); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startTime != 0 || starts != 0 || launches != 0) { 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, uid, category, APK_DATA, 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakeups, // wakeup alarms 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ent.getKey(), // Apk 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sent.getKey(), // service 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startTime / 1000, // time spent started, in ms 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project starts, 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project launches); 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void dumpLocked(Printer pw, String prefix, int which) { 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long rawUptime = SystemClock.uptimeMillis() * 1000; 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long rawRealtime = SystemClock.elapsedRealtime() * 1000; 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptime(rawUptime); 790d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood final long batteryRealtime = getBatteryRealtime(rawRealtime); 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long whichBatteryUptime = computeBatteryUptime(rawUptime, which); 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which); 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long totalRealtime = computeRealtime(rawRealtime, which); 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long totalUptime = computeUptime(rawUptime, which); 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(128); 79822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 79922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar SparseArray<? extends Uid> uidStats = getUidStats(); 80022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar final int NU = uidStats.size(); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Time on battery: " + formatTimeMs(whichBatteryUptime / 1000) 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "(" + formatRatioLocked(whichBatteryUptime, totalRealtime) 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ") uptime, " 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + formatTimeMs(whichBatteryRealtime / 1000) + "(" 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + formatRatioLocked(whichBatteryRealtime, totalRealtime) 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ") realtime"); 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Total: " 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + formatTimeMs(totalUptime / 1000) 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "uptime, " 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + formatTimeMs(totalRealtime / 1000) 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "realtime"); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 816105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long screenOnTime = getScreenOnTime(batteryRealtime, which); 817105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long phoneOnTime = getPhoneOnTime(batteryRealtime, which); 818d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which); 819105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long wifiOnTime = getWifiOnTime(batteryRealtime, which); 820105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which); 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix 822627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn + " Screen on: " + formatTimeMs(screenOnTime / 1000) 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "(" + formatRatioLocked(screenOnTime, whichBatteryRealtime) 824627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn + "), Phone on: " + formatTimeMs(phoneOnTime / 1000) 825627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn + "(" + formatRatioLocked(phoneOnTime, whichBatteryRealtime)); 826627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix 827627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn + " Wifi on: " + formatTimeMs(wifiOnTime / 1000) 828105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + "(" + formatRatioLocked(wifiOnTime, whichBatteryRealtime) 829627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn + "), Wifi running: " + formatTimeMs(wifiRunningTime / 1000) 830d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood + "(" + formatRatioLocked(wifiRunningTime, whichBatteryRealtime) 831627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn + "), Bluetooth on: " + formatTimeMs(bluetoothOnTime / 1000) 832105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + "(" + formatRatioLocked(bluetoothOnTime, whichBatteryRealtime)+ ")"); 833105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 83422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar // Calculate total network and wakelock times across all uids. 83522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long rxTotal = 0; 83622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long txTotal = 0; 83722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long fullWakeLockTimeTotalMicros = 0; 83822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar long partialWakeLockTimeTotalMicros = 0; 83922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 84022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar for (int iu = 0; iu < NU; iu++) { 84122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Uid u = uidStats.valueAt(iu); 84222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar rxTotal += u.getTcpBytesReceived(which); 84322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar txTotal += u.getTcpBytesSent(which); 84422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 84522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); 84622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (wakelocks.size() > 0) { 84722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent 84822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar : wakelocks.entrySet()) { 84922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Uid.Wakelock wl = ent.getValue(); 85022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 85122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Timer fullWakeTimer = wl.getWakeTime(WAKE_TYPE_FULL); 85222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (fullWakeTimer != null) { 85322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar fullWakeLockTimeTotalMicros += fullWakeTimer.getTotalTime( 85422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar batteryRealtime, which); 85522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 85622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 85722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar Timer partialWakeTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL); 85822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar if (partialWakeTimer != null) { 85922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar partialWakeLockTimeTotalMicros += partialWakeTimer.getTotalTime( 86022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar batteryRealtime, which); 86122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 86222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 86322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 86422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar } 86522ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 86622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar pw.println(prefix 86722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar + " Total received: " + formatBytesLocked(rxTotal) 86822ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar + ", Total sent: " + formatBytesLocked(txTotal)); 86922ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar pw.println(prefix 87022ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar + " Total full wakelock time: " + formatTimeMs( 87122ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar (fullWakeLockTimeTotalMicros + 500) / 1000) 87222ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar + ", Total partial waklock time: " + formatTimeMs( 87322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar (partialWakeLockTimeTotalMicros + 500) / 1000)); 87422ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 875627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.setLength(0); 876627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(" Signal strengths: "); 877627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn boolean didOne = false; 878627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 879627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn final long time = getPhoneSignalStrengthTime(i, batteryRealtime, which); 880627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (time == 0) { 881627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn continue; 882627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 883627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (didOne) sb.append(", "); 884627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn didOne = true; 885627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(SIGNAL_STRENGTH_NAMES[i]); 886627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(" "); 887627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(formatTimeMs(time/1000)); 888627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append("("); 889627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(formatRatioLocked(time, whichBatteryRealtime)); 890627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(")"); 891627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 892627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (!didOne) sb.append("No activity"); 893627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(sb.toString()); 894627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 895627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.setLength(0); 896627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(" Data types: "); 897627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn didOne = false; 898627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 899627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn final long time = getPhoneDataConnectionTime(i, batteryRealtime, which); 900627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (time == 0) { 901627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn continue; 902627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 903627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (didOne) sb.append(", "); 904627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn didOne = true; 905627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(DATA_CONNECTION_NAMES[i]); 906627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(" "); 907627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(formatTimeMs(time/1000)); 908627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append("("); 909627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(formatRatioLocked(time, whichBatteryRealtime)); 910627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn sb.append(")"); 911627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 912627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (!didOne) sb.append("No activity"); 913627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(sb.toString()); 914627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 915105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(" "); 916105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 917105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (which == STATS_UNPLUGGED) { 918105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (getIsOnBattery()) { 919105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Device is currently unplugged"); 920105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Discharge cycle start level: " + 921105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project getUnpluggedStartLevel()); 922105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } else { 923105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Device is currently plugged into power"); 924105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Last discharge cycle start level: " + 925105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project getUnpluggedStartLevel()); 926105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Last discharge cycle end level: " + 927105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project getPluggedStartLevel()); 928105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 929105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 93322ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu=0; iu<NU; iu++) { 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int uid = uidStats.keyAt(iu); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = uidStats.valueAt(iu); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " #" + uid + ":"); 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean uidActivity = false; 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long tcpReceived = u.getTcpBytesReceived(which); 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long tcpSent = u.getTcpBytesSent(which); 942105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which); 943105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which); 944105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tcpReceived != 0 || tcpSent != 0) { 94622ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar pw.println(prefix + " Network: " + formatBytesLocked(tcpReceived) + " received, " 94722ac043ec139714644256cc5e2a9ff8d126ade00Evan Millar + formatBytesLocked(tcpSent) + " sent"); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0) { 950105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Full Wifi Lock Time: " 9512a15f38ec2072141de086720a8e914c51056a69dEvan Millar + formatTimeMs(fullWifiLockOnTime / 1000) 952105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + "(" + formatRatioLocked(fullWifiLockOnTime, 953105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project whichBatteryRealtime)+ ")"); 954105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Scan Wifi Lock Time: " 9552a15f38ec2072141de086720a8e914c51056a69dEvan Millar + formatTimeMs(scanWifiLockOnTime / 1000) 956105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + "(" + formatRatioLocked(scanWifiLockOnTime, 957105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project whichBatteryRealtime)+ ")"); 958105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wakelocks.size() > 0) { 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : wakelocks.entrySet()) { 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String linePrefix = ": "; 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.setLength(0); 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(prefix); 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" Wake lock "); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(ent.getKey()); 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime, 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "full", which, linePrefix); 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime, 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "partial", which, linePrefix); 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime, 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "window", which, linePrefix); 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!linePrefix.equals(": ")) { 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" realtime"); 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(": (nothing executed)"); 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(sb.toString()); 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uidActivity = true; 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats(); 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sensors.size() > 0) { 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : sensors.entrySet()) { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = ent.getKey(); 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.setLength(0); 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(prefix); 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" Sensor "); 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int handle = se.getHandle(); 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (handle == Uid.Sensor.GPS) { 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("GPS"); 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(handle); 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(": "); 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer timer = se.getSensorTime(); 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer != null) { 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convert from microseconds to milliseconds with rounding 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long totalTime = (timer.getTotalTime(batteryRealtime, which) + 500) / 1000; 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = timer.getCount(which); 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //timer.logState(); 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (totalTime != 0) { 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(formatTimeMs(totalTime)); 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("realtime ("); 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(count); 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" times)"); 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("(not used)"); 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("(not used)"); 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(sb.toString()); 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uidActivity = true; 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats(); 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (processStats.size() > 0) { 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : processStats.entrySet()) { 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long userTime; 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long systemTime; 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int starts; 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userTime = ps.getUserTime(which); 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project systemTime = ps.getSystemTime(which); 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project starts = ps.getStarts(which); 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (userTime != 0 || systemTime != 0 || starts != 0) { 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " Proc " + ent.getKey() + ":"); 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " CPU: " + formatTime(userTime) + "user + " 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + formatTime(systemTime) + "kernel"); 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " " + starts + " process starts"); 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uidActivity = true; 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats(); 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageStats.size() > 0) { 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : packageStats.entrySet()) { 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " Apk " + ent.getKey() + ":"); 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean apkActivity = false; 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wakeups = ps.getWakeups(which); 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wakeups != 0) { 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " " + wakeups + " wakeup alarms"); 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apkActivity = true; 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends Uid.Pkg.Serv> serviceStats = ps.getServiceStats(); 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (serviceStats.size() > 0) { 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : serviceStats.entrySet()) { 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStats.Uid.Pkg.Serv ss = sent.getValue(); 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long startTime = ss.getStartTime(batteryUptime, which); 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int starts = ss.getStarts(which); 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int launches = ss.getLaunches(which); 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startTime != 0 || starts != 0 || launches != 0) { 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " Service " + sent.getKey() + ":"); 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " Created for: " 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + formatTimeMs(startTime / 1000) 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " uptime"); 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " Starts: " + starts 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", launches: " + launches); 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apkActivity = true; 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!apkActivity) { 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " (nothing executed)"); 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uidActivity = true; 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!uidActivity) { 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " (nothing executed)"); 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dumps a human-readable summary of the battery statistics to the given PrintWriter. 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pw a Printer to receive the dump output. 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dumpLocked(Printer pw) { 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Total Statistics (Current and Historic):"); 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" System starts: " + getStartCount() 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", currently on battery: " + getIsOnBattery()); 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLocked(pw, "", STATS_TOTAL); 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(""); 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Last Run Statistics (Previous run of system):"); 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLocked(pw, "", STATS_LAST); 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(""); 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Current Battery Statistics (Currently running system):"); 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLocked(pw, "", STATS_CURRENT); 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(""); 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Unplugged Statistics (Since last unplugged from power):"); 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLocked(pw, "", STATS_UNPLUGGED); 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dumpCheckinLocked(PrintWriter pw, String[] args) { 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isUnpluggedOnly = false; 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String arg : args) { 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("-u".equals(arg)) { 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LOCAL_LOGV) Log.v("BatteryStats", "Dumping unplugged data"); 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isUnpluggedOnly = true; 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isUnpluggedOnly) { 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpCheckinLocked(pw, STATS_UNPLUGGED); 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpCheckinLocked(pw, STATS_TOTAL); 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpCheckinLocked(pw, STATS_LAST); 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpCheckinLocked(pw, STATS_UNPLUGGED); 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpCheckinLocked(pw, STATS_CURRENT); 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1137