diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index f182a7ad6d714..1e88c5647666f 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -56,9 +56,9 @@ public abstract class BatteryStats implements Parcelable { public static final int SENSOR = 3; /** - * A constant indicating a a wifi turn on timer + * A constant indicating a a wifi running timer */ - public static final int WIFI_TURNED_ON = 4; + public static final int WIFI_RUNNING = 4; /** * A constant indicating a full wifi lock timer @@ -249,8 +249,8 @@ public abstract class BatteryStats implements Parcelable { */ public abstract long getTcpBytesSent(int which); - public abstract void noteWifiTurnedOnLocked(); - public abstract void noteWifiTurnedOffLocked(); + public abstract void noteWifiRunningLocked(); + public abstract void noteWifiStoppedLocked(); public abstract void noteFullWifiLockAcquiredLocked(); public abstract void noteFullWifiLockReleasedLocked(); public abstract void noteScanWifiLockAcquiredLocked(); @@ -261,7 +261,7 @@ public abstract class BatteryStats implements Parcelable { public abstract void noteAudioTurnedOffLocked(); public abstract void noteVideoTurnedOnLocked(); public abstract void noteVideoTurnedOffLocked(); - public abstract long getWifiTurnedOnTime(long batteryRealtime, int which); + public abstract long getWifiRunningTime(long batteryRealtime, int which); public abstract long getFullWifiLockTime(long batteryRealtime, int which); public abstract long getScanWifiLockTime(long batteryRealtime, int which); public abstract long getWifiMulticastTime(long batteryRealtime, @@ -701,7 +701,7 @@ public abstract class BatteryStats implements Parcelable { * * {@hide} */ - public abstract long getWifiRunningTime(long batteryRealtime, int which); + public abstract long getGlobalWifiRunningTime(long batteryRealtime, int which); /** * Returns the time in microseconds that bluetooth has been on while the device was @@ -977,7 +977,7 @@ public abstract class BatteryStats implements Parcelable { final long screenOnTime = getScreenOnTime(batteryRealtime, which); final long phoneOnTime = getPhoneOnTime(batteryRealtime, which); final long wifiOnTime = getWifiOnTime(batteryRealtime, which); - final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which); + final long wifiRunningTime = getGlobalWifiRunningTime(batteryRealtime, which); final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which); StringBuilder sb = new StringBuilder(128); @@ -1091,14 +1091,14 @@ public abstract class BatteryStats implements Parcelable { long tx = u.getTcpBytesSent(which); long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which); long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which); - long wifiTurnedOnTime = u.getWifiTurnedOnTime(batteryRealtime, which); + long uidWifiRunningTime = u.getWifiRunningTime(batteryRealtime, which); if (rx > 0 || tx > 0) dumpLine(pw, uid, category, NETWORK_DATA, rx, tx); if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0 - || wifiTurnedOnTime != 0) { + || uidWifiRunningTime != 0) { dumpLine(pw, uid, category, WIFI_LOCK_DATA, - fullWifiLockOnTime, scanWifiLockOnTime, wifiTurnedOnTime); + fullWifiLockOnTime, scanWifiLockOnTime, uidWifiRunningTime); } if (u.hasUserActivity()) { @@ -1240,7 +1240,7 @@ public abstract class BatteryStats implements Parcelable { final long screenOnTime = getScreenOnTime(batteryRealtime, which); final long phoneOnTime = getPhoneOnTime(batteryRealtime, which); - final long wifiRunningTime = getWifiRunningTime(batteryRealtime, which); + final long wifiRunningTime = getGlobalWifiRunningTime(batteryRealtime, which); final long wifiOnTime = getWifiOnTime(batteryRealtime, which); final long bluetoothOnTime = getBluetoothOnTime(batteryRealtime, which); sb.setLength(0); @@ -1449,7 +1449,7 @@ public abstract class BatteryStats implements Parcelable { long tcpSent = u.getTcpBytesSent(which); long fullWifiLockOnTime = u.getFullWifiLockTime(batteryRealtime, which); long scanWifiLockOnTime = u.getScanWifiLockTime(batteryRealtime, which); - long wifiTurnedOnTime = u.getWifiTurnedOnTime(batteryRealtime, which); + long uidWifiRunningTime = u.getWifiRunningTime(batteryRealtime, which); if (tcpReceived != 0 || tcpSent != 0) { pw.print(prefix); pw.print(" Network: "); @@ -1480,11 +1480,11 @@ public abstract class BatteryStats implements Parcelable { } if (fullWifiLockOnTime != 0 || scanWifiLockOnTime != 0 - || wifiTurnedOnTime != 0) { + || uidWifiRunningTime != 0) { sb.setLength(0); - sb.append(prefix); sb.append(" Turned Wifi On: "); - formatTimeMs(sb, wifiTurnedOnTime / 1000); - sb.append("("); sb.append(formatRatioLocked(wifiTurnedOnTime, + sb.append(prefix); sb.append(" Wifi Running: "); + formatTimeMs(sb, uidWifiRunningTime / 1000); + sb.append("("); sb.append(formatRatioLocked(uidWifiRunningTime, whichBatteryRealtime)); sb.append(")\n"); sb.append(prefix); sb.append(" Full Wifi Lock: "); formatTimeMs(sb, fullWifiLockOnTime / 1000); diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index bd87a0d05261c..351714ec85225 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -49,10 +49,11 @@ interface IBatteryStats { void notePhoneSignalStrength(in SignalStrength signalStrength); void notePhoneDataConnectionState(int dataType, boolean hasData); void notePhoneState(int phoneState); - void noteWifiOn(int uid); - void noteWifiOff(int uid); - void noteWifiRunning(); - void noteWifiStopped(); + void noteWifiOn(); + void noteWifiOff(); + void noteWifiRunning(in WorkSource ws); + void noteWifiRunningChanged(in WorkSource oldWs, in WorkSource newWs); + void noteWifiStopped(in WorkSource ws); void noteBluetoothOn(); void noteBluetoothOff(); void noteFullWifiLockAcquired(int uid); diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 753dbf0e41416..c2d003e96293d 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -66,7 +66,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 50; + private static final int VERSION = 51; // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 2000; @@ -129,6 +129,10 @@ public final class BatteryStatsImpl extends BatteryStats { final ArrayList mWindowTimers = new ArrayList(); final SparseArray> mSensorTimers = new SparseArray>(); + final ArrayList mWifiRunningTimers = new ArrayList(); + final ArrayList mFullWifiLockTimers = new ArrayList(); + final ArrayList mScanWifiLockTimers = new ArrayList(); + final ArrayList mWifiMulticastTimers = new ArrayList(); // Last partial timers we use for distributing CPU usage. final ArrayList mLastPartialTimers = new ArrayList(); @@ -194,8 +198,8 @@ public final class BatteryStatsImpl extends BatteryStats { StopwatchTimer mWifiOnTimer; int mWifiOnUid = -1; - boolean mWifiRunning; - StopwatchTimer mWifiRunningTimer; + boolean mGlobalWifiRunning; + StopwatchTimer mGlobalWifiRunningTimer; boolean mBluetoothOn; StopwatchTimer mBluetoothOnTimer; @@ -1769,7 +1773,7 @@ public final class BatteryStatsImpl extends BatteryStats { } } - public void noteWifiOnLocked(int uid) { + public void noteWifiOnLocked() { if (!mWifiOn) { mHistoryCur.states |= HistoryItem.STATE_WIFI_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: " @@ -1778,16 +1782,9 @@ public final class BatteryStatsImpl extends BatteryStats { mWifiOn = true; mWifiOnTimer.startRunningLocked(this); } - if (mWifiOnUid != uid) { - if (mWifiOnUid >= 0) { - getUidStatsLocked(mWifiOnUid).noteWifiTurnedOffLocked(); - } - mWifiOnUid = uid; - getUidStatsLocked(uid).noteWifiTurnedOnLocked(); - } } - public void noteWifiOffLocked(int uid) { + public void noteWifiOffLocked() { if (mWifiOn) { mHistoryCur.states &= ~HistoryItem.STATE_WIFI_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: " @@ -1797,7 +1794,7 @@ public final class BatteryStatsImpl extends BatteryStats { mWifiOnTimer.stopRunningLocked(this); } if (mWifiOnUid >= 0) { - getUidStatsLocked(mWifiOnUid).noteWifiTurnedOffLocked(); + getUidStatsLocked(mWifiOnUid).noteWifiStoppedLocked(); mWifiOnUid = -1; } } @@ -1850,25 +1847,52 @@ public final class BatteryStatsImpl extends BatteryStats { getUidStatsLocked(uid).noteVideoTurnedOffLocked(); } - public void noteWifiRunningLocked() { - if (!mWifiRunning) { + public void noteWifiRunningLocked(WorkSource ws) { + if (!mGlobalWifiRunning) { mHistoryCur.states |= HistoryItem.STATE_WIFI_RUNNING_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: " + Integer.toHexString(mHistoryCur.states)); addHistoryRecordLocked(SystemClock.elapsedRealtime()); - mWifiRunning = true; - mWifiRunningTimer.startRunningLocked(this); + mGlobalWifiRunning = true; + mGlobalWifiRunningTimer.startRunningLocked(this); + int N = ws.size(); + for (int i=0; i 0) { + Uid.Proc uidProc = uid.getProcessStatsLocked("*wifi*"); + long time = proc.getUserTime(which); + time = (time*uidRunningTime)/totalRunningTime; + uidProc.mUserTime += time; + proc.mUserTime -= time; + time = proc.getSystemTime(which); + time = (time*uidRunningTime)/totalRunningTime; + uidProc.mSystemTime += time; + proc.mSystemTime -= time; + time = proc.getForegroundTime(which); + time = (time*uidRunningTime)/totalRunningTime; + uidProc.mForegroundTime += time; + proc.mForegroundTime -= time; + for (int sb=0; sb