From 58e0eefeb5e2e270e2b04369bbf29fc22abda8d5 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Thu, 16 Sep 2010 01:22:10 -0700 Subject: Improve power tracking of WIFI use. We now distribute "wifi started" time across all apps that are holding WIFI locks that cause it to be started. But only when WIFI would not normally be running. Also have a mechanism to distribute other WIFI work that has happened across those processes based on their use. Also fixed a bug where we were not retaining the CPU speed step stats across boots...! Change-Id: I00e3153b98429166273750512cc37e7975211ab9 --- core/java/android/os/BatteryStats.java | 32 +-- .../com/android/internal/app/IBatteryStats.aidl | 9 +- .../com/android/internal/os/BatteryStatsImpl.java | 245 ++++++++++++++------- services/java/com/android/server/WifiService.java | 42 +++- .../com/android/server/am/BatteryStatsService.java | 23 +- wifi/java/android/net/wifi/WifiStateTracker.java | 57 ++++- 6 files changed, 295 insertions(+), 113 deletions(-) diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index f182a7ad6d71..1e88c5647666 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 bd87a0d05261..351714ec8522 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 753dbf0e4141..c2d003e96293 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