BatteryStats.java revision d4c5f8919b0522bcaab41a5863c313fec52d3a79
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 7105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Projectimport com.android.internal.os.BatteryStatsImpl.Timer; 8105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A class providing access to battery usage statistics, including information on 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wakelocks, processes, packages, and services. All times are represented in microseconds 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * except where indicated otherwise. 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @hide 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic abstract class BatteryStats implements Parcelable { 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean LOCAL_LOGV = false; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A constant indicating a partial wake lock timer. 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WAKE_TYPE_PARTIAL = 0; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A constant indicating a full wake lock timer. 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WAKE_TYPE_FULL = 1; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A constant indicating a window wake lock timer. 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int WAKE_TYPE_WINDOW = 2; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A constant indicating a sensor timer. 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int SENSOR = 3; 44105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 45105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 46105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * A constant indicating a full wifi lock timer 47105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 48105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@hide} 49105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 50105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public static final int FULL_WIFI_LOCK = 4; 51105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 52105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 53105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * A constant indicating a scan wifi lock timer 54105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 55105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@hide} 56105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 57105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public static final int SCAN_WIFI_LOCK = 5; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Include all of the data in the stats, including previously saved data. 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATS_TOTAL = 0; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Include only the last run in the stats. 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATS_LAST = 1; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Include only the current run in the stats. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATS_CURRENT = 2; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Include only the run since the last time the device was unplugged in the stats. 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int STATS_UNPLUGGED = 3; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Bump the version on this if the checkin format changes. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int BATTERY_STATS_CHECKIN_VERSION = 1; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO: Update this list if you add/change any stats above. 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String[] STAT_NAMES = { "total", "last", "current", "unplugged" }; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String APK_DATA = "apk"; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String PROCESS_DATA = "process"; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String SENSOR_DATA = "sensor"; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String WAKELOCK_DATA = "wakelock"; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String NETWORK_DATA = "network"; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String BATTERY_DATA = "battery"; 93105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project private static final String WIFI_LOCK_DATA = "wifilock"; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String MISC_DATA = "misc"; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final StringBuilder mFormatBuilder = new StringBuilder(8); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final Formatter mFormatter = new Formatter(mFormatBuilder); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State for keeping track of timing information. 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Timer { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the count associated with this Timer for the 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected type of statistics. 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getCount(int which); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total time in microseconds associated with this Timer for the 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected type of statistics. 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param batteryRealtime system realtime on battery in microseconds 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a time in microseconds 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getTotalTime(long batteryRealtime, int which); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Temporary for debugging. 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract void logState(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular uid. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Uid { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a mapping containing wakelock statistics. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a Map from Strings to Uid.Wakelock objects. 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Map<String, ? extends Wakelock> getWakelockStats(); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular wake lock. 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Wakelock { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Timer getWakeTime(int type); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a mapping containing sensor statistics. 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a Map from Integer sensor ids to Uid.Sensor objects. 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Map<Integer, ? extends Sensor> getSensorStats(); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a mapping containing process statistics. 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a Map from Strings to Uid.Proc objects. 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Map<String, ? extends Proc> getProcessStats(); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a mapping containing package statistics. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return a Map from Strings to Uid.Pkg objects. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Map<String, ? extends Pkg> getPackageStats(); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getUid(); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getTcpBytesReceived(int which); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getTcpBytesSent(int which); 182105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 183105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract void noteFullWifiLockAcquiredLocked(); 184105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract void noteFullWifiLockReleasedLocked(); 185105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract void noteScanWifiLockAcquiredLocked(); 186105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract void noteScanWifiLockReleasedLocked(); 187105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract long getFullWifiLockTime(long batteryRealtime, int which); 188105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract long getScanWifiLockTime(long batteryRealtime, int which); 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Sensor { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Magic sensor number for the GPS. 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final int GPS = -10000; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getHandle(); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Timer getSensorTime(); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular process. 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Proc { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total time (in 1/100 sec) spent executing in user code. 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getUserTime(int which); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total time (in 1/100 sec) spent executing in system code. 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getSystemTime(int which); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of times the process has been started. 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getStarts(int which); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular package. 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static abstract class Pkg { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of times this package has done something that could wake up the 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device from sleep. 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getWakeups(int which); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a mapping containing service statistics. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract Map<String, ? extends Serv> getServiceStats(); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular service. 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract class Serv { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the amount of time spent started. 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param batteryUptime elapsed uptime on battery in microseconds. 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getStartTime(long batteryUptime, int which); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total number of times startService() has been called. 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getStarts(int which); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total number times the service has been launched. 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getLaunches(int which); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the number of times the device has been started. 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract int getStartCount(); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the time in milliseconds that the screen has been on while the device was 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * running on battery. 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getScreenOnTime(long batteryRealtime, int which); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the time in milliseconds that the phone has been on while the device was 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * running on battery. 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getPhoneOnTime(long batteryRealtime, int which); 295d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 297105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * Returns the time in milliseconds that wifi has been on while the device was 298105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * running on battery. 299105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 300105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@hide} 301105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 302105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract long getWifiOnTime(long batteryRealtime, int which); 303d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 304d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood /** 305d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood * Returns the time in milliseconds that wifi has been on and the driver has 306d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood * been in the running state while the device was running on battery. 307d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood * 308d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood * {@hide} 309d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood */ 310d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood public abstract long getWifiRunningTime(long batteryRealtime, int which); 311d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 312105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 313105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * Returns the time in milliseconds that bluetooth has been on while the device was 314105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * running on battery. 315105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * 316105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * {@hide} 317105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 318105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract long getBluetoothOnTime(long batteryRealtime, int which); 319105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 320105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Return whether we are currently running on battery. 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract boolean getIsOnBattery(); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a SparseArray containing the statistics for each uid. 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract SparseArray<? extends Uid> getUidStats(); 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current battery uptime in microseconds. 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the amount of elapsed realtime in microseconds. 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getBatteryUptime(long curTime); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the current battery realtime in microseconds. 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the amount of elapsed realtime in microseconds. 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long getBatteryRealtime(long curTime); 343105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 344105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 345105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * Returns the battery percentage level at the last time the device was unplugged from power, 346105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * or the last time it was booted while unplugged. 347105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 348105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract int getUnpluggedStartLevel(); 349105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 350105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /** 351105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * Returns the battery percentage level at the last time the device was plugged into power. 352105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 353105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public abstract int getPluggedStartLevel(); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total, last, or current battery uptime in microseconds. 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the elapsed realtime in microseconds. 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long computeBatteryUptime(long curTime, int which); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total, last, or current battery realtime in microseconds. 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the current elapsed realtime in microseconds. 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long computeBatteryRealtime(long curTime, int which); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total, last, or current uptime in microseconds. 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the current elapsed realtime in microseconds. 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long computeUptime(long curTime, int which); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns the total, last, or current realtime in microseconds. 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * * 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param curTime the current elapsed realtime in microseconds. 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public abstract long computeRealtime(long curTime, int which); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static void formatTime(StringBuilder out, long seconds) { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long days = seconds / (60 * 60 * 24); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (days != 0) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(days); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append("d "); 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long used = days * 60 * 60 * 24; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long hours = (seconds - used) / (60 * 60); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hours != 0 || used != 0) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(hours); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append("h "); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project used += hours * 60 * 60; 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mins = (seconds-used) / 60; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mins != 0 || used != 0) { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(mins); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append("m "); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project used += mins * 60; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (seconds != 0 || used != 0) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append(seconds-used); 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.append("s "); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static String formatTime(long time) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long sec = time / 100; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project formatTime(sb, sec); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append((time - (sec * 100)) * 10); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("ms "); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final static String formatTimeMs(long time) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long sec = time / 1000; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project formatTime(sb, sec); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(time - (sec * 1000)); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("ms "); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sb.toString(); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final String formatRatioLocked(long num, long den) { 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (den == 0L) { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "---%"; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float perc = ((float)num) / ((float)den) * 100; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormatBuilder.setLength(0); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFormatter.format("%.1f%%", perc); 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mFormatBuilder.toString(); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sb a StringBuilder object. 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer object contining the wakelock times. 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param batteryRealtime the current on-battery time in microseconds. 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name the name of the wakelock. 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param linePrefix a String to be prepended to each line of output. 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the line prefix 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String printWakeLock(StringBuilder sb, Timer timer, 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long batteryRealtime, String name, int which, String linePrefix) { 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer != null) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convert from microseconds to milliseconds with rounding 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long totalTimeMicros = timer.getTotalTime(batteryRealtime, which); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long totalTimeMillis = (totalTimeMicros + 500) / 1000; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = timer.getCount(which); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (totalTimeMillis != 0) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(linePrefix); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(formatTimeMs(totalTimeMillis)); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(name); 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(' '); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append('('); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(count); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" times)"); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ", "; 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return linePrefix; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checkin version of wakelock printer. Prints simple comma-separated list. 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sb a StringBuilder object. 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer object contining the wakelock times. 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param now the current time in microseconds. 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param name the name of the wakelock. 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param linePrefix a String to be prepended to each line of output. 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the line prefix 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String printWakeLockCheckin(StringBuilder sb, Timer timer, long now, 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name, int which, String linePrefix) { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long totalTimeMicros = 0; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = 0; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer != null) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalTimeMicros = timer.getTotalTime(now, which); 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project count = timer.getCount(which); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(linePrefix); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append((totalTimeMicros + 500) / 1000); // microseconds to milliseconds with rounding 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(','); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(name); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(','); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(count); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ","; 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dump a comma-separated line of values for terse checkin mode. 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pw the PageWriter to dump log to 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param category category of data (e.g. "total", "last", "unplugged", "current" ) 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param type type of data (e.g. "wakelock", "sensor", "process", "apk" , "process", "network") 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param args type-dependent data arguments 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final void dumpLine(PrintWriter pw, int uid, String category, String type, 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object... args ) { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(uid); pw.print(','); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(category); pw.print(','); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(type); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Object arg : args) { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(','); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print(arg); 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.print('\n'); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Checkin server version of dump to produce more compact, computer-readable log. 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * NOTE: all times are expressed in 'ms'. 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param fd 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pw 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param which 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void dumpCheckinLocked(PrintWriter pw, int which) { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long rawUptime = SystemClock.uptimeMillis() * 1000; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long rawRealtime = SystemClock.elapsedRealtime() * 1000; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptime(rawUptime); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = getBatteryRealtime(rawRealtime); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long whichBatteryUptime = computeBatteryUptime(rawUptime, which); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long totalRealtime = computeRealtime(rawRealtime, which); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long totalUptime = computeUptime(rawUptime, which); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long screenOnTime = getScreenOnTime(batteryRealtime, which); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long phoneOnTime = getPhoneOnTime(batteryRealtime, which); 545105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long wifiOnTime = getWifiOnTime(batteryRealtime, which); 546d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which); 547105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(128); 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String category = STAT_NAMES[which]; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dump "battery" stat 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, 0 /* uid */, category, BATTERY_DATA, 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project which == STATS_TOTAL ? getStartCount() : "N/A", 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project whichBatteryUptime / 1000, whichBatteryRealtime / 1000, 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project totalUptime / 1000, totalRealtime / 1000); 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dump misc stats 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, 0 /* uid */, category, MISC_DATA, 561d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood screenOnTime / 1000, phoneOnTime / 1000, wifiOnTime / 1000, 562d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood wifiRunningTime / 1000, bluetoothOnTime / 1000); 563105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 564105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (which == STATS_UNPLUGGED) { 565105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project dumpLine(pw, 0 /* uid */, category, BATTERY_DATA, getUnpluggedStartLevel(), 566105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project getPluggedStartLevel()); 567105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseArray<? extends Uid> uidStats = getUidStats(); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = uidStats.size(); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int uid = uidStats.keyAt(iu); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = uidStats.valueAt(iu); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Dump Network stats per uid, if any 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long rx = u.getTcpBytesReceived(which); 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long tx = u.getTcpBytesSent(which); 577105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which); 578105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which); 579105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx); 581105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 582105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0) { 583105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project dumpLine(pw, uid, category, WIFI_LOCK_DATA, 584105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project fullWifiLockOnTime, scanWifiLockOnTime); 585105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wakelocks.size() > 0) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : wakelocks.entrySet()) { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String linePrefix = ""; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.setLength(0); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime, 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "full", which, linePrefix); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime, 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "partial", which, linePrefix); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime, 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "window", which, linePrefix); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Only log if we had at lease one wakelock... 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sb.length() > 0) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, uid, category, WAKELOCK_DATA, ent.getKey(), sb.toString()); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats(); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sensors.size() > 0) { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : sensors.entrySet()) { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = ent.getKey(); 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer timer = se.getSensorTime(); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer != null) { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convert from microseconds to milliseconds with rounding 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long totalTime = (timer.getTotalTime(batteryRealtime, which) + 500) / 1000; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = timer.getCount(which); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (totalTime != 0) { 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, uid, category, SENSOR_DATA, sensorNumber, totalTime, count); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats(); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (processStats.size() > 0) { 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : processStats.entrySet()) { 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long userTime = ps.getUserTime(which); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long systemTime = ps.getSystemTime(which); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int starts = ps.getStarts(which); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (userTime != 0 || systemTime != 0 || starts != 0) { 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, uid, category, PROCESS_DATA, 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ent.getKey(), // proc 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userTime * 10, // cpu time in ms 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project systemTime * 10, // user time in ms 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project starts); // process starts 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats(); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageStats.size() > 0) { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : packageStats.entrySet()) { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wakeups = ps.getWakeups(which); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends Uid.Pkg.Serv> serviceStats = ps.getServiceStats(); 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : serviceStats.entrySet()) { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStats.Uid.Pkg.Serv ss = sent.getValue(); 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long startTime = ss.getStartTime(batteryUptime, which); 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int starts = ss.getStarts(which); 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int launches = ss.getLaunches(which); 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startTime != 0 || starts != 0 || launches != 0) { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLine(pw, uid, category, APK_DATA, 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakeups, // wakeup alarms 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ent.getKey(), // Apk 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sent.getKey(), // service 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project startTime / 1000, // time spent started, in ms 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project starts, 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project launches); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void dumpLocked(Printer pw, String prefix, int which) { 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long rawUptime = SystemClock.uptimeMillis() * 1000; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long rawRealtime = SystemClock.elapsedRealtime() * 1000; 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptime(rawUptime); 680d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood final long batteryRealtime = getBatteryRealtime(rawRealtime); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long whichBatteryUptime = computeBatteryUptime(rawUptime, which); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long whichBatteryRealtime = computeBatteryRealtime(rawRealtime, which); 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long totalRealtime = computeRealtime(rawRealtime, which); 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long totalUptime = computeUptime(rawUptime, which); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder sb = new StringBuilder(128); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Time on battery: " + formatTimeMs(whichBatteryUptime / 1000) 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "(" + formatRatioLocked(whichBatteryUptime, totalRealtime) 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ") uptime, " 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + formatTimeMs(whichBatteryRealtime / 1000) + "(" 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + formatRatioLocked(whichBatteryRealtime, totalRealtime) 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ") realtime"); 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Total: " 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + formatTimeMs(totalUptime / 1000) 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "uptime, " 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + formatTimeMs(totalRealtime / 1000) 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "realtime"); 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 703105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long screenOnTime = getScreenOnTime(batteryRealtime, which); 704105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long phoneOnTime = getPhoneOnTime(batteryRealtime, which); 705d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which); 706105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long wifiOnTime = getWifiOnTime(batteryRealtime, which); 707105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which); 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " Time with screen on: " + formatTimeMs(screenOnTime / 1000) 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "(" + formatRatioLocked(screenOnTime, whichBatteryRealtime) 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "), time with phone on: " + formatTimeMs(phoneOnTime / 1000) 712105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + "(" + formatRatioLocked(phoneOnTime, whichBatteryRealtime) 713105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + "), time with wifi on: " + formatTimeMs(wifiOnTime / 1000) 714105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + "(" + formatRatioLocked(wifiOnTime, whichBatteryRealtime) 715d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood + "), time with wifi running: " + formatTimeMs(wifiRunningTime / 1000) 716d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood + "(" + formatRatioLocked(wifiRunningTime, whichBatteryRealtime) 717105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + "), time with bluetooth on: " + formatTimeMs(bluetoothOnTime / 1000) 718105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + "(" + formatRatioLocked(bluetoothOnTime, whichBatteryRealtime)+ ")"); 719105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 720105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(" "); 721105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 722105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (which == STATS_UNPLUGGED) { 723105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (getIsOnBattery()) { 724105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Device is currently unplugged"); 725105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Discharge cycle start level: " + 726105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project getUnpluggedStartLevel()); 727105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } else { 728105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Device is currently plugged into power"); 729105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Last discharge cycle start level: " + 730105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project getUnpluggedStartLevel()); 731105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Last discharge cycle end level: " + 732105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project getPluggedStartLevel()); 733105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 734105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" "); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SparseArray<? extends Uid> uidStats = getUidStats(); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = uidStats.size(); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu=0; iu<NU; iu++) { 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int uid = uidStats.keyAt(iu); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = uidStats.valueAt(iu); 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " #" + uid + ":"); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean uidActivity = false; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long tcpReceived = u.getTcpBytesReceived(which); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long tcpSent = u.getTcpBytesSent(which); 748105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which); 749105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which); 750105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tcpReceived != 0 || tcpSent != 0) { 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " Network: " + tcpReceived + " bytes received, " 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + tcpSent + " bytes sent"); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 755105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0) { 756105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Full Wifi Lock Time: " 757105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + formatTime(fullWifiLockOnTime / 1000) 758105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + "(" + formatRatioLocked(fullWifiLockOnTime, 759105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project whichBatteryRealtime)+ ")"); 760105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project pw.println(prefix + " Scan Wifi Lock Time: " 761105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + formatTime(scanWifiLockOnTime / 1000) 762105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project + "(" + formatRatioLocked(scanWifiLockOnTime, 763105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project whichBatteryRealtime)+ ")"); 764105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Wakelock> wakelocks = u.getWakelockStats(); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wakelocks.size() > 0) { 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Wakelock> ent 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : wakelocks.entrySet()) { 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String linePrefix = ": "; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.setLength(0); 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(prefix); 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" Wake lock "); 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(ent.getKey()); 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), batteryRealtime, 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "full", which, linePrefix); 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), batteryRealtime, 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "partial", which, linePrefix); 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), batteryRealtime, 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "window", which, linePrefix); 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!linePrefix.equals(": ")) { 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" realtime"); 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(": (nothing executed)"); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(sb.toString()); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uidActivity = true; 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<Integer, ? extends BatteryStats.Uid.Sensor> sensors = u.getSensorStats(); 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sensors.size() > 0) { 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, ? extends BatteryStats.Uid.Sensor> ent 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : sensors.entrySet()) { 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = ent.getKey(); 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.setLength(0); 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(prefix); 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" Sensor "); 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int handle = se.getHandle(); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (handle == Uid.Sensor.GPS) { 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("GPS"); 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(handle); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(": "); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer timer = se.getSensorTime(); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer != null) { 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Convert from microseconds to milliseconds with rounding 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long totalTime = (timer.getTotalTime(batteryRealtime, which) + 500) / 1000; 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int count = timer.getCount(which); 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //timer.logState(); 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (totalTime != 0) { 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(formatTimeMs(totalTime)); 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("realtime ("); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(count); 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append(" times)"); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("(not used)"); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sb.append("(not used)"); 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(sb.toString()); 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uidActivity = true; 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Proc> processStats = u.getProcessStats(); 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (processStats.size() > 0) { 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Proc> ent 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : processStats.entrySet()) { 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long userTime; 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long systemTime; 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int starts; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project userTime = ps.getUserTime(which); 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project systemTime = ps.getSystemTime(which); 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project starts = ps.getStarts(which); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (userTime != 0 || systemTime != 0 || starts != 0) { 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " Proc " + ent.getKey() + ":"); 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " CPU: " + formatTime(userTime) + "user + " 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + formatTime(systemTime) + "kernel"); 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " " + starts + " process starts"); 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uidActivity = true; 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends BatteryStats.Uid.Pkg> packageStats = u.getPackageStats(); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageStats.size() > 0) { 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg> ent 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : packageStats.entrySet()) { 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " Apk " + ent.getKey() + ":"); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean apkActivity = false; 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int wakeups = ps.getWakeups(which); 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wakeups != 0) { 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " " + wakeups + " wakeup alarms"); 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apkActivity = true; 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Map<String, ? extends Uid.Pkg.Serv> serviceStats = ps.getServiceStats(); 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (serviceStats.size() > 0) { 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, ? extends BatteryStats.Uid.Pkg.Serv> sent 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : serviceStats.entrySet()) { 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStats.Uid.Pkg.Serv ss = sent.getValue(); 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long startTime = ss.getStartTime(batteryUptime, which); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int starts = ss.getStarts(which); 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int launches = ss.getLaunches(which); 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (startTime != 0 || starts != 0 || launches != 0) { 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " Service " + sent.getKey() + ":"); 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " Created for: " 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + formatTimeMs(startTime / 1000) 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " uptime"); 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " Starts: " + starts 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", launches: " + launches); 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project apkActivity = true; 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!apkActivity) { 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " (nothing executed)"); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uidActivity = true; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!uidActivity) { 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + " (nothing executed)"); 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Dumps a human-readable summary of the battery statistics to the given PrintWriter. 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pw a Printer to receive the dump output. 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dumpLocked(Printer pw) { 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Total Statistics (Current and Historic):"); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(" System starts: " + getStartCount() 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", currently on battery: " + getIsOnBattery()); 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLocked(pw, "", STATS_TOTAL); 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(""); 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Last Run Statistics (Previous run of system):"); 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLocked(pw, "", STATS_LAST); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(""); 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Current Battery Statistics (Currently running system):"); 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLocked(pw, "", STATS_CURRENT); 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(""); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println("Unplugged Statistics (Since last unplugged from power):"); 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpLocked(pw, "", STATS_UNPLUGGED); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dumpCheckinLocked(PrintWriter pw, String[] args) { 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isUnpluggedOnly = false; 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String arg : args) { 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ("-u".equals(arg)) { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LOCAL_LOGV) Log.v("BatteryStats", "Dumping unplugged data"); 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isUnpluggedOnly = true; 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isUnpluggedOnly) { 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpCheckinLocked(pw, STATS_UNPLUGGED); 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project else { 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpCheckinLocked(pw, STATS_TOTAL); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpCheckinLocked(pw, STATS_LAST); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpCheckinLocked(pw, STATS_UNPLUGGED); 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dumpCheckinLocked(pw, STATS_CURRENT); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 943