Loading core/java/android/os/BatteryStats.java +45 −72 Original line number Diff line number Diff line Loading @@ -507,28 +507,18 @@ public abstract class BatteryStats implements Parcelable { public long time; // The command codes 0-3 can be written with delta updates; all others require // that a full entry be written. public static final byte CMD_UPDATE = 0; public static final byte CMD_EVENT = 1; public static final byte CMD_UPDATE = 0; // These can be written as deltas public static final byte CMD_NULL = -1; public static final byte CMD_START = 4; public static final byte CMD_OVERFLOW = 5; public byte cmd = CMD_NULL; /** * Return whether the command code is a delta data update. */ public static boolean isDeltaData(byte cmd) { return cmd >= 0 && cmd <= 3; } /** * Return whether the command code is a delta data update. */ public boolean isDeltaData() { return cmd >= 0 && cmd <= 3; return cmd == CMD_UPDATE; } public byte batteryLevel; Loading @@ -555,16 +545,16 @@ public abstract class BatteryStats implements Parcelable { // These states always appear directly in the first int token // of a delta change; they should be ones that change relatively // frequently. public static final int STATE_WAKE_LOCK_FLAG = 1<<30; public static final int STATE_SENSOR_ON_FLAG = 1<<29; public static final int STATE_GPS_ON_FLAG = 1<<28; public static final int STATE_PHONE_SCANNING_FLAG = 1<<27; public static final int STATE_WIFI_RUNNING_FLAG = 1<<26; public static final int STATE_WIFI_FULL_LOCK_FLAG = 1<<25; public static final int STATE_WIFI_SCAN_FLAG = 1<<24; public static final int STATE_WIFI_MULTICAST_ON_FLAG = 1<<23; public static final int STATE_WAKE_LOCK_FLAG = 1<<31; public static final int STATE_SENSOR_ON_FLAG = 1<<30; public static final int STATE_GPS_ON_FLAG = 1<<29; public static final int STATE_WIFI_FULL_LOCK_FLAG = 1<<28; public static final int STATE_WIFI_SCAN_FLAG = 1<<29; public static final int STATE_WIFI_MULTICAST_ON_FLAG = 1<<26; // These are on the lower bits used for the command; if they change // we need to write another int of data. public static final int STATE_WIFI_RUNNING_FLAG = 1<<24; public static final int STATE_PHONE_SCANNING_FLAG = 1<<23; public static final int STATE_AUDIO_ON_FLAG = 1<<22; public static final int STATE_VIDEO_ON_FLAG = 1<<21; public static final int STATE_SCREEN_ON_FLAG = 1<<20; Loading Loading @@ -628,7 +618,8 @@ public abstract class BatteryStats implements Parcelable { } else { dest.writeInt(0); } if (cmd == CMD_EVENT) { dest.writeInt(eventCode); if (eventCode != EVENT_NONE) { dest.writeInt(eventCode); eventTag.writeToParcel(dest, flags); } Loading @@ -652,13 +643,10 @@ public abstract class BatteryStats implements Parcelable { } else { wakelockTag = null; } if (cmd == CMD_EVENT) { eventCode = src.readInt(); if (eventCode != EVENT_NONE) { eventTag = localEventTag; eventTag.readFromParcel(src); } else { eventCode = EVENT_NONE; eventTag = null; } numReadInts += (src.dataPosition()-start)/4; } Loading @@ -681,6 +669,16 @@ public abstract class BatteryStats implements Parcelable { public void setTo(HistoryItem o) { time = o.time; cmd = o.cmd; setToCommon(o); } public void setTo(long time, byte cmd, HistoryItem o) { this.time = time; this.cmd = cmd; setToCommon(o); } private void setToCommon(HistoryItem o) { batteryLevel = o.batteryLevel; batteryStatus = o.batteryStatus; batteryHealth = o.batteryHealth; Loading @@ -703,32 +701,6 @@ public abstract class BatteryStats implements Parcelable { } } public void setTo(long time, byte cmd, int eventCode, int eventUid, String eventName, HistoryItem o) { this.time = time; this.cmd = cmd; this.eventCode = eventCode; if (eventCode != EVENT_NONE) { eventTag = localEventTag; eventTag.setTo(eventName, eventUid); } else { eventTag = null; } batteryLevel = o.batteryLevel; batteryStatus = o.batteryStatus; batteryHealth = o.batteryHealth; batteryPlugType = o.batteryPlugType; batteryTemperature = o.batteryTemperature; batteryVoltage = o.batteryVoltage; states = o.states; if (o.wakelockTag != null) { wakelockTag = localWakelockTag; wakelockTag.setTo(o.wakelockTag); } else { wakelockTag = null; } } public boolean sameNonEvent(HistoryItem o) { return batteryLevel == o.batteryLevel && batteryStatus == o.batteryStatus Loading Loading @@ -938,36 +910,36 @@ public abstract class BatteryStats implements Parcelable { public static final BitDescription[] HISTORY_STATE_DESCRIPTIONS = new BitDescription[] { new BitDescription(HistoryItem.STATE_BATTERY_PLUGGED_FLAG, "plugged", "BP"), new BitDescription(HistoryItem.STATE_SCREEN_ON_FLAG, "screen", "S"), new BitDescription(HistoryItem.STATE_WAKE_LOCK_FLAG, "wake_lock", "w"), new BitDescription(HistoryItem.STATE_SENSOR_ON_FLAG, "sensor", "s"), new BitDescription(HistoryItem.STATE_GPS_ON_FLAG, "gps", "g"), new BitDescription(HistoryItem.STATE_PHONE_IN_CALL_FLAG, "phone_in_call", "Pcl"), new BitDescription(HistoryItem.STATE_PHONE_SCANNING_FLAG, "phone_scanning", "Psc"), new BitDescription(HistoryItem.STATE_WIFI_ON_FLAG, "wifi", "W"), new BitDescription(HistoryItem.STATE_WIFI_RUNNING_FLAG, "wifi_running", "Wr"), new BitDescription(HistoryItem.STATE_WIFI_FULL_LOCK_FLAG, "wifi_full_lock", "Wl"), new BitDescription(HistoryItem.STATE_WIFI_SCAN_FLAG, "wifi_scan", "Ws"), new BitDescription(HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG, "wifi_multicast", "Wm"), new BitDescription(HistoryItem.STATE_BLUETOOTH_ON_FLAG, "bluetooth", "b"), new BitDescription(HistoryItem.STATE_WIFI_RUNNING_FLAG, "wifi_running", "Wr"), new BitDescription(HistoryItem.STATE_PHONE_SCANNING_FLAG, "phone_scanning", "Psc"), new BitDescription(HistoryItem.STATE_AUDIO_ON_FLAG, "audio", "a"), new BitDescription(HistoryItem.STATE_VIDEO_ON_FLAG, "video", "v"), new BitDescription(HistoryItem.STATE_WAKE_LOCK_FLAG, "wake_lock", "w"), new BitDescription(HistoryItem.STATE_SENSOR_ON_FLAG, "sensor", "s"), new BitDescription(HistoryItem.STATE_BRIGHTNESS_MASK, HistoryItem.STATE_BRIGHTNESS_SHIFT, "brightness", "Sb", SCREEN_BRIGHTNESS_NAMES, SCREEN_BRIGHTNESS_SHORT_NAMES), new BitDescription(HistoryItem.STATE_SCREEN_ON_FLAG, "screen", "S"), new BitDescription(HistoryItem.STATE_BATTERY_PLUGGED_FLAG, "plugged", "BP"), new BitDescription(HistoryItem.STATE_PHONE_IN_CALL_FLAG, "phone_in_call", "Pcl"), new BitDescription(HistoryItem.STATE_WIFI_ON_FLAG, "wifi", "W"), new BitDescription(HistoryItem.STATE_BLUETOOTH_ON_FLAG, "bluetooth", "b"), new BitDescription(HistoryItem.STATE_DATA_CONNECTION_MASK, HistoryItem.STATE_DATA_CONNECTION_SHIFT, "data_conn", "Pcn", DATA_CONNECTION_NAMES, DATA_CONNECTION_NAMES), new BitDescription(HistoryItem.STATE_PHONE_STATE_MASK, HistoryItem.STATE_PHONE_STATE_SHIFT, "phone_state", "Pst", new String[] {"in", "out", "emergency", "off"}, new String[] {"in", "out", "em", "off"}), new BitDescription(HistoryItem.STATE_SIGNAL_STRENGTH_MASK, HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT, "signal_strength", "Pss", SignalStrength.SIGNAL_STRENGTH_NAMES, new String[] { "0", "1", "2", "3", "4" }), new BitDescription(HistoryItem.STATE_PHONE_STATE_MASK, HistoryItem.STATE_PHONE_STATE_SHIFT, "phone_state", "Pst", new String[] {"in", "out", "emergency", "off"}, new String[] {"in", "out", "em", "off"}), new BitDescription(HistoryItem.STATE_DATA_CONNECTION_MASK, HistoryItem.STATE_DATA_CONNECTION_SHIFT, "data_conn", "Pcn", DATA_CONNECTION_NAMES, DATA_CONNECTION_NAMES), new BitDescription(HistoryItem.STATE_BRIGHTNESS_MASK, HistoryItem.STATE_BRIGHTNESS_SHIFT, "brightness", "Sb", SCREEN_BRIGHTNESS_NAMES, SCREEN_BRIGHTNESS_SHORT_NAMES), }; /** Loading Loading @@ -2464,7 +2436,8 @@ public abstract class BatteryStats implements Parcelable { else if (rec.batteryLevel < 100) pw.print("0"); pw.print(rec.batteryLevel); pw.print(" "); if (rec.states < 0x10) pw.print("0000000"); if (rec.states < 0) ; else if (rec.states < 0x10) pw.print("0000000"); else if (rec.states < 0x100) pw.print("000000"); else if (rec.states < 0x1000) pw.print("00000"); else if (rec.states < 0x10000) pw.print("0000"); Loading core/java/android/os/PowerManager.java +20 −2 Original line number Diff line number Diff line Loading @@ -222,6 +222,13 @@ public final class PowerManager { */ public static final int ON_AFTER_RELEASE = 0x20000000; /** * Wake lock flag: This wake lock is not important for logging events. If a later * wake lock is acquired that is important, it will be considered the one to log. * @hide */ public static final int UNIMPORTANT_FOR_LOGGING = 0x40000000; /** * Flag for {@link WakeLock#release release(int)} to defer releasing a * {@link #PROXIMITY_SCREEN_OFF_WAKE_LOCK} wake lock until the proximity sensor returns Loading Loading @@ -634,8 +641,8 @@ public final class PowerManager { * </p> */ public final class WakeLock { private final int mFlags; private final String mTag; private int mFlags; private String mTag; private final String mPackageName; private final IBinder mToken; private int mCount; Loading Loading @@ -829,6 +836,17 @@ public final class PowerManager { } } /** @hide */ public void setTag(String tag) { mTag = tag; } /** @hide */ public void setUnimportantForLogging(boolean state) { if (state) mFlags |= UNIMPORTANT_FOR_LOGGING; else mFlags &= ~UNIMPORTANT_FOR_LOGGING; } @Override public String toString() { synchronized (mToken) { Loading core/java/com/android/internal/app/IBatteryStats.aidl +3 −2 Original line number Diff line number Diff line Loading @@ -35,10 +35,11 @@ interface IBatteryStats { void noteEvent(int code, String name, int uid); void noteStartWakelock(int uid, int pid, String name, int type); void noteStartWakelock(int uid, int pid, String name, int type, boolean unimportantForLogging); void noteStopWakelock(int uid, int pid, String name, int type); void noteStartWakelockFromSource(in WorkSource ws, int pid, String name, int type); void noteStartWakelockFromSource(in WorkSource ws, int pid, String name, int type, boolean unimportantForLogging); void noteStopWakelockFromSource(in WorkSource ws, int pid, String name, int type); void noteVibratorOn(int uid, long durationMillis); Loading core/java/com/android/internal/os/BatteryStatsImpl.java +100 −49 File changed.Preview size limit exceeded, changes collapsed. Show changes services/core/java/com/android/server/AlarmManagerService.java +123 −63 Original line number Diff line number Diff line Loading @@ -39,8 +39,10 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.os.WorkSource; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.util.TimeUtils; import java.io.ByteArrayOutputStream; Loading @@ -53,9 +55,7 @@ import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.TimeZone; import static android.app.AlarmManager.RTC_WAKEUP; Loading Loading @@ -314,6 +314,21 @@ class AlarmManagerService extends SystemService { } } final Comparator<Alarm> mAlarmDispatchComparator = new Comparator<Alarm>() { @Override public int compare(Alarm lhs, Alarm rhs) { if (lhs.wakeup != rhs.wakeup) { return lhs.wakeup ? -1 : 1; } if (lhs.whenElapsed < rhs.whenElapsed) { return -1; } else if (lhs.whenElapsed > rhs.whenElapsed) { return 1; } return 0; } }; // minimum recurrence period or alarm futurity for us to be able to fuzz it static final long MIN_FUZZABLE_INTERVAL = 10000; static final BatchTimeOrder sBatchOrder = new BatchTimeOrder(); Loading Loading @@ -442,6 +457,7 @@ class AlarmManagerService extends SystemService { } static final class BroadcastStats { final int mUid; final String mPackageName; long aggregateTime; Loading @@ -449,16 +465,17 @@ class AlarmManagerService extends SystemService { int numWakeup; long startTime; int nesting; final HashMap<Pair<String, ComponentName>, FilterStats> filterStats = new HashMap<Pair<String, ComponentName>, FilterStats>(); final ArrayMap<Pair<String, ComponentName>, FilterStats> filterStats = new ArrayMap<Pair<String, ComponentName>, FilterStats>(); BroadcastStats(String packageName) { BroadcastStats(int uid, String packageName) { mUid = uid; mPackageName = packageName; } } final HashMap<String, BroadcastStats> mBroadcastStats = new HashMap<String, BroadcastStats>(); final SparseArray<ArrayMap<String, BroadcastStats>> mBroadcastStats = new SparseArray<ArrayMap<String, BroadcastStats>>(); @Override public void onStart() { Loading @@ -470,7 +487,7 @@ class AlarmManagerService extends SystemService { setTimeZoneImpl(SystemProperties.get(TIMEZONE_PROPERTY)); PowerManager pm = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*alarm*"); mTimeTickSender = PendingIntent.getBroadcastAsUser(getContext(), 0, new Intent(Intent.ACTION_TIME_TICK).addFlags( Loading Loading @@ -743,11 +760,12 @@ class AlarmManagerService extends SystemService { } }; int len = 0; for (Map.Entry<String, BroadcastStats> be : mBroadcastStats.entrySet()) { BroadcastStats bs = be.getValue(); for (Map.Entry<Pair<String, ComponentName>, FilterStats> fe : bs.filterStats.entrySet()) { FilterStats fs = fe.getValue(); for (int iu=0; iu<mBroadcastStats.size(); iu++) { ArrayMap<String, BroadcastStats> uidStats = mBroadcastStats.valueAt(iu); for (int ip=0; ip<uidStats.size(); ip++) { BroadcastStats bs = uidStats.valueAt(ip); for (int is=0; is<bs.filterStats.size(); is++) { FilterStats fs = bs.filterStats.valueAt(is); int pos = len > 0 ? Arrays.binarySearch(topFilters, 0, len, fs, comparator) : 0; if (pos < 0) { Loading @@ -765,6 +783,7 @@ class AlarmManagerService extends SystemService { } } } } if (len > 0) { pw.println(" Top Alarms:"); for (int i=0; i<len; i++) { Loading @@ -774,7 +793,8 @@ class AlarmManagerService extends SystemService { TimeUtils.formatDuration(fs.aggregateTime, pw); pw.print(" running, "); pw.print(fs.numWakeup); pw.print(" wakeups, "); pw.print(fs.count); pw.print(" alarms: "); pw.print(fs.mBroadcastStats.mPackageName); pw.print(" alarms: "); UserHandle.formatUid(pw, fs.mBroadcastStats.mUid); pw.print(":"); pw.print(fs.mBroadcastStats.mPackageName); pw.println(); pw.print(" "); if (fs.mTarget.first != null) { Loading @@ -790,18 +810,21 @@ class AlarmManagerService extends SystemService { pw.println(" "); pw.println(" Alarm Stats:"); final ArrayList<FilterStats> tmpFilters = new ArrayList<FilterStats>(); for (Map.Entry<String, BroadcastStats> be : mBroadcastStats.entrySet()) { BroadcastStats bs = be.getValue(); for (int iu=0; iu<mBroadcastStats.size(); iu++) { ArrayMap<String, BroadcastStats> uidStats = mBroadcastStats.valueAt(iu); for (int ip=0; ip<uidStats.size(); ip++) { BroadcastStats bs = uidStats.valueAt(ip); pw.print(" "); if (bs.nesting > 0) pw.print("*ACTIVE* "); pw.print(be.getKey()); UserHandle.formatUid(pw, bs.mUid); pw.print(":"); pw.print(bs.mPackageName); pw.print(" "); TimeUtils.formatDuration(bs.aggregateTime, pw); pw.print(" running, "); pw.print(bs.numWakeup); pw.println(" wakeups:"); tmpFilters.clear(); for (Map.Entry<Pair<String, ComponentName>, FilterStats> fe : bs.filterStats.entrySet()) { tmpFilters.add(fe.getValue()); for (int is=0; is<bs.filterStats.size(); is++) { tmpFilters.add(bs.filterStats.valueAt(is)); } Collections.sort(tmpFilters, comparator); for (int i=0; i<tmpFilters.size(); i++) { Loading @@ -821,6 +844,7 @@ class AlarmManagerService extends SystemService { pw.println(); } } } if (WAKEUP_STATS) { pw.println(); Loading Loading @@ -1037,7 +1061,8 @@ class AlarmManagerService extends SystemService { private native int waitForAlarm(long nativeData); private native int setKernelTimezone(long nativeData, int minuteswest); void triggerAlarmsLocked(ArrayList<Alarm> triggerList, long nowELAPSED, long nowRTC) { void triggerAlarmsLocked(ArrayList<Alarm> triggerList, final long nowELAPSED, final long nowRTC) { // batches are temporally sorted, so we need only pull from the // start of the list until we either empty it or hit a batch // that is not yet deliverable Loading Loading @@ -1076,6 +1101,14 @@ class AlarmManagerService extends SystemService { } } Collections.sort(triggerList, mAlarmDispatchComparator); if (localLOGV) { for (int i=0; i<triggerList.size(); i++) { Slog.v(TAG, "Triggering alarm #" + i + ": " + triggerList.get(i)); } } } /** Loading @@ -1096,7 +1129,8 @@ class AlarmManagerService extends SystemService { } private static class Alarm { public int type; public final int type; public final boolean wakeup; public int count; public long when; public long windowLength; Loading @@ -1109,6 +1143,8 @@ class AlarmManagerService extends SystemService { public Alarm(int _type, long _when, long _whenElapsed, long _windowLength, long _maxWhen, long _interval, PendingIntent _op, WorkSource _ws) { type = _type; wakeup = _type == AlarmManager.ELAPSED_REALTIME_WAKEUP || _type == AlarmManager.RTC_WAKEUP; when = _when; whenElapsed = _whenElapsed; windowLength = _windowLength; Loading @@ -1126,6 +1162,8 @@ class AlarmManagerService extends SystemService { sb.append(Integer.toHexString(System.identityHashCode(this))); sb.append(" type "); sb.append(type); sb.append(" when "); sb.append(when); sb.append(" "); sb.append(operation.getTargetPackage()); sb.append('}'); Loading Loading @@ -1231,6 +1269,15 @@ class AlarmManagerService extends SystemService { // we have an active broadcast so stay awake. if (mBroadcastRefCount == 0) { setWakelockWorkSource(alarm.operation, alarm.workSource); mWakeLock.setUnimportantForLogging( alarm.operation == mTimeTickSender); // XXX debugging /* Intent intent = alarm.operation.getIntent(); mWakeLock.setTag(intent.getAction() != null ? intent.getAction() : (intent.getComponent() != null ? intent.getComponent().toShortString() : TAG)); */ mWakeLock.acquire(); } final InFlight inflight = new InFlight(AlarmManagerService.this, Loading Loading @@ -1450,7 +1497,14 @@ class AlarmManagerService extends SystemService { if (pkgList != null && (pkgList.length > 0)) { for (String pkg : pkgList) { removeLocked(pkg); mBroadcastStats.remove(pkg); for (int i=mBroadcastStats.size()-1; i>=0; i--) { ArrayMap<String, BroadcastStats> uidStats = mBroadcastStats.valueAt(i); if (uidStats.remove(pkg) != null) { if (uidStats.size() <= 0) { mBroadcastStats.removeAt(i); } } } } } } Loading @@ -1458,11 +1512,17 @@ class AlarmManagerService extends SystemService { } private final BroadcastStats getStatsLocked(PendingIntent pi) { String pkg = pi.getTargetPackage(); BroadcastStats bs = mBroadcastStats.get(pkg); String pkg = pi.getCreatorPackage(); int uid = pi.getCreatorUid(); ArrayMap<String, BroadcastStats> uidStats = mBroadcastStats.get(uid); if (uidStats == null) { uidStats = new ArrayMap<String, BroadcastStats>(); mBroadcastStats.put(uid, uidStats); } BroadcastStats bs = uidStats.get(pkg); if (bs == null) { bs = new BroadcastStats(pkg); mBroadcastStats.put(pkg, bs); bs = new BroadcastStats(uid, pkg); uidStats.put(pkg, bs); } return bs; } Loading Loading
core/java/android/os/BatteryStats.java +45 −72 Original line number Diff line number Diff line Loading @@ -507,28 +507,18 @@ public abstract class BatteryStats implements Parcelable { public long time; // The command codes 0-3 can be written with delta updates; all others require // that a full entry be written. public static final byte CMD_UPDATE = 0; public static final byte CMD_EVENT = 1; public static final byte CMD_UPDATE = 0; // These can be written as deltas public static final byte CMD_NULL = -1; public static final byte CMD_START = 4; public static final byte CMD_OVERFLOW = 5; public byte cmd = CMD_NULL; /** * Return whether the command code is a delta data update. */ public static boolean isDeltaData(byte cmd) { return cmd >= 0 && cmd <= 3; } /** * Return whether the command code is a delta data update. */ public boolean isDeltaData() { return cmd >= 0 && cmd <= 3; return cmd == CMD_UPDATE; } public byte batteryLevel; Loading @@ -555,16 +545,16 @@ public abstract class BatteryStats implements Parcelable { // These states always appear directly in the first int token // of a delta change; they should be ones that change relatively // frequently. public static final int STATE_WAKE_LOCK_FLAG = 1<<30; public static final int STATE_SENSOR_ON_FLAG = 1<<29; public static final int STATE_GPS_ON_FLAG = 1<<28; public static final int STATE_PHONE_SCANNING_FLAG = 1<<27; public static final int STATE_WIFI_RUNNING_FLAG = 1<<26; public static final int STATE_WIFI_FULL_LOCK_FLAG = 1<<25; public static final int STATE_WIFI_SCAN_FLAG = 1<<24; public static final int STATE_WIFI_MULTICAST_ON_FLAG = 1<<23; public static final int STATE_WAKE_LOCK_FLAG = 1<<31; public static final int STATE_SENSOR_ON_FLAG = 1<<30; public static final int STATE_GPS_ON_FLAG = 1<<29; public static final int STATE_WIFI_FULL_LOCK_FLAG = 1<<28; public static final int STATE_WIFI_SCAN_FLAG = 1<<29; public static final int STATE_WIFI_MULTICAST_ON_FLAG = 1<<26; // These are on the lower bits used for the command; if they change // we need to write another int of data. public static final int STATE_WIFI_RUNNING_FLAG = 1<<24; public static final int STATE_PHONE_SCANNING_FLAG = 1<<23; public static final int STATE_AUDIO_ON_FLAG = 1<<22; public static final int STATE_VIDEO_ON_FLAG = 1<<21; public static final int STATE_SCREEN_ON_FLAG = 1<<20; Loading Loading @@ -628,7 +618,8 @@ public abstract class BatteryStats implements Parcelable { } else { dest.writeInt(0); } if (cmd == CMD_EVENT) { dest.writeInt(eventCode); if (eventCode != EVENT_NONE) { dest.writeInt(eventCode); eventTag.writeToParcel(dest, flags); } Loading @@ -652,13 +643,10 @@ public abstract class BatteryStats implements Parcelable { } else { wakelockTag = null; } if (cmd == CMD_EVENT) { eventCode = src.readInt(); if (eventCode != EVENT_NONE) { eventTag = localEventTag; eventTag.readFromParcel(src); } else { eventCode = EVENT_NONE; eventTag = null; } numReadInts += (src.dataPosition()-start)/4; } Loading @@ -681,6 +669,16 @@ public abstract class BatteryStats implements Parcelable { public void setTo(HistoryItem o) { time = o.time; cmd = o.cmd; setToCommon(o); } public void setTo(long time, byte cmd, HistoryItem o) { this.time = time; this.cmd = cmd; setToCommon(o); } private void setToCommon(HistoryItem o) { batteryLevel = o.batteryLevel; batteryStatus = o.batteryStatus; batteryHealth = o.batteryHealth; Loading @@ -703,32 +701,6 @@ public abstract class BatteryStats implements Parcelable { } } public void setTo(long time, byte cmd, int eventCode, int eventUid, String eventName, HistoryItem o) { this.time = time; this.cmd = cmd; this.eventCode = eventCode; if (eventCode != EVENT_NONE) { eventTag = localEventTag; eventTag.setTo(eventName, eventUid); } else { eventTag = null; } batteryLevel = o.batteryLevel; batteryStatus = o.batteryStatus; batteryHealth = o.batteryHealth; batteryPlugType = o.batteryPlugType; batteryTemperature = o.batteryTemperature; batteryVoltage = o.batteryVoltage; states = o.states; if (o.wakelockTag != null) { wakelockTag = localWakelockTag; wakelockTag.setTo(o.wakelockTag); } else { wakelockTag = null; } } public boolean sameNonEvent(HistoryItem o) { return batteryLevel == o.batteryLevel && batteryStatus == o.batteryStatus Loading Loading @@ -938,36 +910,36 @@ public abstract class BatteryStats implements Parcelable { public static final BitDescription[] HISTORY_STATE_DESCRIPTIONS = new BitDescription[] { new BitDescription(HistoryItem.STATE_BATTERY_PLUGGED_FLAG, "plugged", "BP"), new BitDescription(HistoryItem.STATE_SCREEN_ON_FLAG, "screen", "S"), new BitDescription(HistoryItem.STATE_WAKE_LOCK_FLAG, "wake_lock", "w"), new BitDescription(HistoryItem.STATE_SENSOR_ON_FLAG, "sensor", "s"), new BitDescription(HistoryItem.STATE_GPS_ON_FLAG, "gps", "g"), new BitDescription(HistoryItem.STATE_PHONE_IN_CALL_FLAG, "phone_in_call", "Pcl"), new BitDescription(HistoryItem.STATE_PHONE_SCANNING_FLAG, "phone_scanning", "Psc"), new BitDescription(HistoryItem.STATE_WIFI_ON_FLAG, "wifi", "W"), new BitDescription(HistoryItem.STATE_WIFI_RUNNING_FLAG, "wifi_running", "Wr"), new BitDescription(HistoryItem.STATE_WIFI_FULL_LOCK_FLAG, "wifi_full_lock", "Wl"), new BitDescription(HistoryItem.STATE_WIFI_SCAN_FLAG, "wifi_scan", "Ws"), new BitDescription(HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG, "wifi_multicast", "Wm"), new BitDescription(HistoryItem.STATE_BLUETOOTH_ON_FLAG, "bluetooth", "b"), new BitDescription(HistoryItem.STATE_WIFI_RUNNING_FLAG, "wifi_running", "Wr"), new BitDescription(HistoryItem.STATE_PHONE_SCANNING_FLAG, "phone_scanning", "Psc"), new BitDescription(HistoryItem.STATE_AUDIO_ON_FLAG, "audio", "a"), new BitDescription(HistoryItem.STATE_VIDEO_ON_FLAG, "video", "v"), new BitDescription(HistoryItem.STATE_WAKE_LOCK_FLAG, "wake_lock", "w"), new BitDescription(HistoryItem.STATE_SENSOR_ON_FLAG, "sensor", "s"), new BitDescription(HistoryItem.STATE_BRIGHTNESS_MASK, HistoryItem.STATE_BRIGHTNESS_SHIFT, "brightness", "Sb", SCREEN_BRIGHTNESS_NAMES, SCREEN_BRIGHTNESS_SHORT_NAMES), new BitDescription(HistoryItem.STATE_SCREEN_ON_FLAG, "screen", "S"), new BitDescription(HistoryItem.STATE_BATTERY_PLUGGED_FLAG, "plugged", "BP"), new BitDescription(HistoryItem.STATE_PHONE_IN_CALL_FLAG, "phone_in_call", "Pcl"), new BitDescription(HistoryItem.STATE_WIFI_ON_FLAG, "wifi", "W"), new BitDescription(HistoryItem.STATE_BLUETOOTH_ON_FLAG, "bluetooth", "b"), new BitDescription(HistoryItem.STATE_DATA_CONNECTION_MASK, HistoryItem.STATE_DATA_CONNECTION_SHIFT, "data_conn", "Pcn", DATA_CONNECTION_NAMES, DATA_CONNECTION_NAMES), new BitDescription(HistoryItem.STATE_PHONE_STATE_MASK, HistoryItem.STATE_PHONE_STATE_SHIFT, "phone_state", "Pst", new String[] {"in", "out", "emergency", "off"}, new String[] {"in", "out", "em", "off"}), new BitDescription(HistoryItem.STATE_SIGNAL_STRENGTH_MASK, HistoryItem.STATE_SIGNAL_STRENGTH_SHIFT, "signal_strength", "Pss", SignalStrength.SIGNAL_STRENGTH_NAMES, new String[] { "0", "1", "2", "3", "4" }), new BitDescription(HistoryItem.STATE_PHONE_STATE_MASK, HistoryItem.STATE_PHONE_STATE_SHIFT, "phone_state", "Pst", new String[] {"in", "out", "emergency", "off"}, new String[] {"in", "out", "em", "off"}), new BitDescription(HistoryItem.STATE_DATA_CONNECTION_MASK, HistoryItem.STATE_DATA_CONNECTION_SHIFT, "data_conn", "Pcn", DATA_CONNECTION_NAMES, DATA_CONNECTION_NAMES), new BitDescription(HistoryItem.STATE_BRIGHTNESS_MASK, HistoryItem.STATE_BRIGHTNESS_SHIFT, "brightness", "Sb", SCREEN_BRIGHTNESS_NAMES, SCREEN_BRIGHTNESS_SHORT_NAMES), }; /** Loading Loading @@ -2464,7 +2436,8 @@ public abstract class BatteryStats implements Parcelable { else if (rec.batteryLevel < 100) pw.print("0"); pw.print(rec.batteryLevel); pw.print(" "); if (rec.states < 0x10) pw.print("0000000"); if (rec.states < 0) ; else if (rec.states < 0x10) pw.print("0000000"); else if (rec.states < 0x100) pw.print("000000"); else if (rec.states < 0x1000) pw.print("00000"); else if (rec.states < 0x10000) pw.print("0000"); Loading
core/java/android/os/PowerManager.java +20 −2 Original line number Diff line number Diff line Loading @@ -222,6 +222,13 @@ public final class PowerManager { */ public static final int ON_AFTER_RELEASE = 0x20000000; /** * Wake lock flag: This wake lock is not important for logging events. If a later * wake lock is acquired that is important, it will be considered the one to log. * @hide */ public static final int UNIMPORTANT_FOR_LOGGING = 0x40000000; /** * Flag for {@link WakeLock#release release(int)} to defer releasing a * {@link #PROXIMITY_SCREEN_OFF_WAKE_LOCK} wake lock until the proximity sensor returns Loading Loading @@ -634,8 +641,8 @@ public final class PowerManager { * </p> */ public final class WakeLock { private final int mFlags; private final String mTag; private int mFlags; private String mTag; private final String mPackageName; private final IBinder mToken; private int mCount; Loading Loading @@ -829,6 +836,17 @@ public final class PowerManager { } } /** @hide */ public void setTag(String tag) { mTag = tag; } /** @hide */ public void setUnimportantForLogging(boolean state) { if (state) mFlags |= UNIMPORTANT_FOR_LOGGING; else mFlags &= ~UNIMPORTANT_FOR_LOGGING; } @Override public String toString() { synchronized (mToken) { Loading
core/java/com/android/internal/app/IBatteryStats.aidl +3 −2 Original line number Diff line number Diff line Loading @@ -35,10 +35,11 @@ interface IBatteryStats { void noteEvent(int code, String name, int uid); void noteStartWakelock(int uid, int pid, String name, int type); void noteStartWakelock(int uid, int pid, String name, int type, boolean unimportantForLogging); void noteStopWakelock(int uid, int pid, String name, int type); void noteStartWakelockFromSource(in WorkSource ws, int pid, String name, int type); void noteStartWakelockFromSource(in WorkSource ws, int pid, String name, int type, boolean unimportantForLogging); void noteStopWakelockFromSource(in WorkSource ws, int pid, String name, int type); void noteVibratorOn(int uid, long durationMillis); Loading
core/java/com/android/internal/os/BatteryStatsImpl.java +100 −49 File changed.Preview size limit exceeded, changes collapsed. Show changes
services/core/java/com/android/server/AlarmManagerService.java +123 −63 Original line number Diff line number Diff line Loading @@ -39,8 +39,10 @@ import android.os.SystemProperties; import android.os.UserHandle; import android.os.WorkSource; import android.text.TextUtils; import android.util.ArrayMap; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; import android.util.TimeUtils; import java.io.ByteArrayOutputStream; Loading @@ -53,9 +55,7 @@ import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.TimeZone; import static android.app.AlarmManager.RTC_WAKEUP; Loading Loading @@ -314,6 +314,21 @@ class AlarmManagerService extends SystemService { } } final Comparator<Alarm> mAlarmDispatchComparator = new Comparator<Alarm>() { @Override public int compare(Alarm lhs, Alarm rhs) { if (lhs.wakeup != rhs.wakeup) { return lhs.wakeup ? -1 : 1; } if (lhs.whenElapsed < rhs.whenElapsed) { return -1; } else if (lhs.whenElapsed > rhs.whenElapsed) { return 1; } return 0; } }; // minimum recurrence period or alarm futurity for us to be able to fuzz it static final long MIN_FUZZABLE_INTERVAL = 10000; static final BatchTimeOrder sBatchOrder = new BatchTimeOrder(); Loading Loading @@ -442,6 +457,7 @@ class AlarmManagerService extends SystemService { } static final class BroadcastStats { final int mUid; final String mPackageName; long aggregateTime; Loading @@ -449,16 +465,17 @@ class AlarmManagerService extends SystemService { int numWakeup; long startTime; int nesting; final HashMap<Pair<String, ComponentName>, FilterStats> filterStats = new HashMap<Pair<String, ComponentName>, FilterStats>(); final ArrayMap<Pair<String, ComponentName>, FilterStats> filterStats = new ArrayMap<Pair<String, ComponentName>, FilterStats>(); BroadcastStats(String packageName) { BroadcastStats(int uid, String packageName) { mUid = uid; mPackageName = packageName; } } final HashMap<String, BroadcastStats> mBroadcastStats = new HashMap<String, BroadcastStats>(); final SparseArray<ArrayMap<String, BroadcastStats>> mBroadcastStats = new SparseArray<ArrayMap<String, BroadcastStats>>(); @Override public void onStart() { Loading @@ -470,7 +487,7 @@ class AlarmManagerService extends SystemService { setTimeZoneImpl(SystemProperties.get(TIMEZONE_PROPERTY)); PowerManager pm = (PowerManager) getContext().getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*alarm*"); mTimeTickSender = PendingIntent.getBroadcastAsUser(getContext(), 0, new Intent(Intent.ACTION_TIME_TICK).addFlags( Loading Loading @@ -743,11 +760,12 @@ class AlarmManagerService extends SystemService { } }; int len = 0; for (Map.Entry<String, BroadcastStats> be : mBroadcastStats.entrySet()) { BroadcastStats bs = be.getValue(); for (Map.Entry<Pair<String, ComponentName>, FilterStats> fe : bs.filterStats.entrySet()) { FilterStats fs = fe.getValue(); for (int iu=0; iu<mBroadcastStats.size(); iu++) { ArrayMap<String, BroadcastStats> uidStats = mBroadcastStats.valueAt(iu); for (int ip=0; ip<uidStats.size(); ip++) { BroadcastStats bs = uidStats.valueAt(ip); for (int is=0; is<bs.filterStats.size(); is++) { FilterStats fs = bs.filterStats.valueAt(is); int pos = len > 0 ? Arrays.binarySearch(topFilters, 0, len, fs, comparator) : 0; if (pos < 0) { Loading @@ -765,6 +783,7 @@ class AlarmManagerService extends SystemService { } } } } if (len > 0) { pw.println(" Top Alarms:"); for (int i=0; i<len; i++) { Loading @@ -774,7 +793,8 @@ class AlarmManagerService extends SystemService { TimeUtils.formatDuration(fs.aggregateTime, pw); pw.print(" running, "); pw.print(fs.numWakeup); pw.print(" wakeups, "); pw.print(fs.count); pw.print(" alarms: "); pw.print(fs.mBroadcastStats.mPackageName); pw.print(" alarms: "); UserHandle.formatUid(pw, fs.mBroadcastStats.mUid); pw.print(":"); pw.print(fs.mBroadcastStats.mPackageName); pw.println(); pw.print(" "); if (fs.mTarget.first != null) { Loading @@ -790,18 +810,21 @@ class AlarmManagerService extends SystemService { pw.println(" "); pw.println(" Alarm Stats:"); final ArrayList<FilterStats> tmpFilters = new ArrayList<FilterStats>(); for (Map.Entry<String, BroadcastStats> be : mBroadcastStats.entrySet()) { BroadcastStats bs = be.getValue(); for (int iu=0; iu<mBroadcastStats.size(); iu++) { ArrayMap<String, BroadcastStats> uidStats = mBroadcastStats.valueAt(iu); for (int ip=0; ip<uidStats.size(); ip++) { BroadcastStats bs = uidStats.valueAt(ip); pw.print(" "); if (bs.nesting > 0) pw.print("*ACTIVE* "); pw.print(be.getKey()); UserHandle.formatUid(pw, bs.mUid); pw.print(":"); pw.print(bs.mPackageName); pw.print(" "); TimeUtils.formatDuration(bs.aggregateTime, pw); pw.print(" running, "); pw.print(bs.numWakeup); pw.println(" wakeups:"); tmpFilters.clear(); for (Map.Entry<Pair<String, ComponentName>, FilterStats> fe : bs.filterStats.entrySet()) { tmpFilters.add(fe.getValue()); for (int is=0; is<bs.filterStats.size(); is++) { tmpFilters.add(bs.filterStats.valueAt(is)); } Collections.sort(tmpFilters, comparator); for (int i=0; i<tmpFilters.size(); i++) { Loading @@ -821,6 +844,7 @@ class AlarmManagerService extends SystemService { pw.println(); } } } if (WAKEUP_STATS) { pw.println(); Loading Loading @@ -1037,7 +1061,8 @@ class AlarmManagerService extends SystemService { private native int waitForAlarm(long nativeData); private native int setKernelTimezone(long nativeData, int minuteswest); void triggerAlarmsLocked(ArrayList<Alarm> triggerList, long nowELAPSED, long nowRTC) { void triggerAlarmsLocked(ArrayList<Alarm> triggerList, final long nowELAPSED, final long nowRTC) { // batches are temporally sorted, so we need only pull from the // start of the list until we either empty it or hit a batch // that is not yet deliverable Loading Loading @@ -1076,6 +1101,14 @@ class AlarmManagerService extends SystemService { } } Collections.sort(triggerList, mAlarmDispatchComparator); if (localLOGV) { for (int i=0; i<triggerList.size(); i++) { Slog.v(TAG, "Triggering alarm #" + i + ": " + triggerList.get(i)); } } } /** Loading @@ -1096,7 +1129,8 @@ class AlarmManagerService extends SystemService { } private static class Alarm { public int type; public final int type; public final boolean wakeup; public int count; public long when; public long windowLength; Loading @@ -1109,6 +1143,8 @@ class AlarmManagerService extends SystemService { public Alarm(int _type, long _when, long _whenElapsed, long _windowLength, long _maxWhen, long _interval, PendingIntent _op, WorkSource _ws) { type = _type; wakeup = _type == AlarmManager.ELAPSED_REALTIME_WAKEUP || _type == AlarmManager.RTC_WAKEUP; when = _when; whenElapsed = _whenElapsed; windowLength = _windowLength; Loading @@ -1126,6 +1162,8 @@ class AlarmManagerService extends SystemService { sb.append(Integer.toHexString(System.identityHashCode(this))); sb.append(" type "); sb.append(type); sb.append(" when "); sb.append(when); sb.append(" "); sb.append(operation.getTargetPackage()); sb.append('}'); Loading Loading @@ -1231,6 +1269,15 @@ class AlarmManagerService extends SystemService { // we have an active broadcast so stay awake. if (mBroadcastRefCount == 0) { setWakelockWorkSource(alarm.operation, alarm.workSource); mWakeLock.setUnimportantForLogging( alarm.operation == mTimeTickSender); // XXX debugging /* Intent intent = alarm.operation.getIntent(); mWakeLock.setTag(intent.getAction() != null ? intent.getAction() : (intent.getComponent() != null ? intent.getComponent().toShortString() : TAG)); */ mWakeLock.acquire(); } final InFlight inflight = new InFlight(AlarmManagerService.this, Loading Loading @@ -1450,7 +1497,14 @@ class AlarmManagerService extends SystemService { if (pkgList != null && (pkgList.length > 0)) { for (String pkg : pkgList) { removeLocked(pkg); mBroadcastStats.remove(pkg); for (int i=mBroadcastStats.size()-1; i>=0; i--) { ArrayMap<String, BroadcastStats> uidStats = mBroadcastStats.valueAt(i); if (uidStats.remove(pkg) != null) { if (uidStats.size() <= 0) { mBroadcastStats.removeAt(i); } } } } } } Loading @@ -1458,11 +1512,17 @@ class AlarmManagerService extends SystemService { } private final BroadcastStats getStatsLocked(PendingIntent pi) { String pkg = pi.getTargetPackage(); BroadcastStats bs = mBroadcastStats.get(pkg); String pkg = pi.getCreatorPackage(); int uid = pi.getCreatorUid(); ArrayMap<String, BroadcastStats> uidStats = mBroadcastStats.get(uid); if (uidStats == null) { uidStats = new ArrayMap<String, BroadcastStats>(); mBroadcastStats.put(uid, uidStats); } BroadcastStats bs = uidStats.get(pkg); if (bs == null) { bs = new BroadcastStats(pkg); mBroadcastStats.put(pkg, bs); bs = new BroadcastStats(uid, pkg); uidStats.put(pkg, bs); } return bs; } Loading