diff options
author | Dianne Hackborn <hackbod@google.com> | 2014-01-22 22:18:13 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-01-22 22:18:13 +0000 |
commit | 39e79006cf22f10eb62ac721238778aa6b7d3473 (patch) | |
tree | dab4804b372140219524e581f2f10e35d9d0be32 | |
parent | afc4deb7b3d6731075c532ab4f829d145b1112c5 (diff) | |
parent | 099bc627c463d9941e23e480f25a78a154429c55 (diff) | |
download | frameworks_base-39e79006cf22f10eb62ac721238778aa6b7d3473.zip frameworks_base-39e79006cf22f10eb62ac721238778aa6b7d3473.tar.gz frameworks_base-39e79006cf22f10eb62ac721238778aa6b7d3473.tar.bz2 |
Merge "Battery stats improvements."
10 files changed, 351 insertions, 105 deletions
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 7b81713..b40008e 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -101,9 +101,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM } } - static public void noteWakeupAlarm(PendingIntent ps) { + static public void noteWakeupAlarm(PendingIntent ps, int sourceUid, String sourcePkg) { try { - getDefault().noteWakeupAlarm(ps.getTarget()); + getDefault().noteWakeupAlarm(ps.getTarget(), sourceUid, sourcePkg); } catch (RemoteException ex) { } } @@ -1258,7 +1258,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM data.enforceInterface(IActivityManager.descriptor); IIntentSender is = IIntentSender.Stub.asInterface( data.readStrongBinder()); - noteWakeupAlarm(is); + int sourceUid = data.readInt(); + String sourcePkg = data.readString(); + noteWakeupAlarm(is, sourceUid, sourcePkg); reply.writeNoException(); return true; } @@ -3651,10 +3653,13 @@ class ActivityManagerProxy implements IActivityManager mRemote.transact(ENTER_SAFE_MODE_TRANSACTION, data, null, 0); data.recycle(); } - public void noteWakeupAlarm(IIntentSender sender) throws RemoteException { + public void noteWakeupAlarm(IIntentSender sender, int sourceUid, String sourcePkg) + throws RemoteException { Parcel data = Parcel.obtain(); - data.writeStrongBinder(sender.asBinder()); data.writeInterfaceToken(IActivityManager.descriptor); + data.writeStrongBinder(sender.asBinder()); + data.writeInt(sourceUid); + data.writeString(sourcePkg); mRemote.transact(NOTE_WAKEUP_ALARM_TRANSACTION, data, null, 0); data.recycle(); } diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 3ed3f7b..8c7fe10 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -243,7 +243,8 @@ public interface IActivityManager extends IInterface { public void enterSafeMode() throws RemoteException; - public void noteWakeupAlarm(IIntentSender sender) throws RemoteException; + public void noteWakeupAlarm(IIntentSender sender, int sourceUid, String sourcePkg) + throws RemoteException; public boolean killPids(int[] pids, String reason, boolean secure) throws RemoteException; public boolean killProcessesBelowForeground(String reason) throws RemoteException; diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 935ec9a..1ce958b 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -162,6 +162,7 @@ public abstract class BatteryStats implements Parcelable { private static final String WIFI_DATA = "wfl"; private static final String MISC_DATA = "m"; private static final String GLOBAL_NETWORK_DATA = "gn"; + private static final String HISTORY_STRING_POOL = "hsp"; private static final String HISTORY_DATA = "h"; private static final String SCREEN_BRIGHTNESS_DATA = "br"; private static final String SIGNAL_STRENGTH_TIME_DATA = "sgt"; @@ -355,6 +356,11 @@ public abstract class BatteryStats implements Parcelable { } /** + * Returns true if this process is still active in the battery stats. + */ + public abstract boolean isActive(); + + /** * Returns the total time (in 1/100 sec) spent executing in user code. * * @param which one of STATS_TOTAL, STATS_LAST, or STATS_CURRENT. @@ -446,9 +452,6 @@ public abstract class BatteryStats implements Parcelable { } public final static class HistoryItem implements Parcelable { - static final String TAG = "HistoryItem"; - static final boolean DEBUG = false; - public HistoryItem next; public long time; @@ -526,12 +529,14 @@ public abstract class BatteryStats implements Parcelable { public int states; public static final int EVENT_NONE = 0; - public static final int EVENT_APP_FOREGROUND = 1; + public static final int EVENT_PROC_STARTED = 1; + public static final int EVENT_PROC_FINISHED = 2; // For CMD_EVENT. public int eventCode; - public int eventUid; public String eventName; + public int eventNameIdx; // only filled in when iterating. + public int eventUid; public HistoryItem() { } @@ -579,6 +584,7 @@ public abstract class BatteryStats implements Parcelable { eventCode = src.readInt(); eventUid = src.readInt(); eventName = src.readString(); + eventNameIdx = 0; } else { eventCode = EVENT_NONE; } @@ -612,6 +618,7 @@ public abstract class BatteryStats implements Parcelable { eventCode = o.eventCode; eventUid = o.eventUid; eventName = o.eventName; + eventNameIdx = o.eventNameIdx; } public void setTo(long time, byte cmd, int eventCode, int eventUid, String eventName, @@ -621,6 +628,7 @@ public abstract class BatteryStats implements Parcelable { this.eventCode = eventCode; this.eventUid = eventUid; this.eventName = eventName; + this.eventNameIdx = 0; batteryLevel = o.batteryLevel; batteryStatus = o.batteryStatus; batteryHealth = o.batteryHealth; @@ -681,6 +689,10 @@ public abstract class BatteryStats implements Parcelable { public abstract boolean startIteratingHistoryLocked(); + public abstract int getHistoryStringPoolSize(); + + public abstract String getHistoryStringPoolItem(int index); + public abstract boolean getNextHistoryLocked(HistoryItem out); public abstract void finishIteratingHistoryLocked(); @@ -1316,7 +1328,7 @@ public abstract class BatteryStats implements Parcelable { if (sippers != null && sippers.size() > 0) { dumpLine(pw, 0 /* uid */, category, POWER_USE_SUMMARY_DATA, BatteryStatsHelper.makemAh(helper.getPowerProfile().getBatteryCapacity()), - BatteryStatsHelper.makemAh(helper.getTotalPower()), + BatteryStatsHelper.makemAh(helper.getComputedPower()), BatteryStatsHelper.makemAh(helper.getMinDrainedPower()), BatteryStatsHelper.makemAh(helper.getMaxDrainedPower())); for (int i=0; i<sippers.size(); i++) { @@ -1835,7 +1847,7 @@ public abstract class BatteryStats implements Parcelable { pw.print(prefix); pw.println(" Estimated power use (mAh):"); pw.print(prefix); pw.print(" Capacity: "); printmAh(pw, helper.getPowerProfile().getBatteryCapacity()); - pw.print(", Computed drain: "); printmAh(pw, helper.getTotalPower()); + pw.print(", Computed drain: "); printmAh(pw, helper.getComputedPower()); pw.print(", Min drain: "); printmAh(pw, helper.getMinDrainedPower()); pw.print(", Max drain: "); printmAh(pw, helper.getMaxDrainedPower()); pw.println(); @@ -2244,10 +2256,14 @@ public abstract class BatteryStats implements Parcelable { if (diff == 0) return; for (int i=0; i<descriptions.length; i++) { BitDescription bd = descriptions[i]; - if ((diff&bd.mask) != 0) { + int mask = bd.mask; + if (bd.shift > 0) { + mask <<= bd.shift; + } + if ((diff&mask) != 0) { pw.print(longNames ? " " : ","); if (bd.shift < 0) { - pw.print((newval&bd.mask) != 0 ? "+" : "-"); + pw.print((newval&mask) != 0 ? "+" : "-"); pw.print(longNames ? bd.name : bd.shortName); } else { pw.print(longNames ? bd.name : bd.shortName); @@ -2404,6 +2420,38 @@ public abstract class BatteryStats implements Parcelable { } printBitDescriptions(pw, oldState, rec.states, HISTORY_STATE_DESCRIPTIONS, !checkin); + if (rec.eventCode != HistoryItem.EVENT_NONE) { + switch (rec.eventCode) { + case HistoryItem.EVENT_PROC_STARTED: + pw.print(checkin ? ",PrSt=" : " procstart="); + break; + case HistoryItem.EVENT_PROC_FINISHED: + pw.print(checkin ? ",PrFn=" : " procfin="); + break; + default: + if (checkin) { + pw.print(",?cmd_"); + pw.print(rec.eventCode); + pw.print("="); + } else { + pw.print(" cmd_"); + pw.print(rec.eventCode); + pw.print("="); + } + break; + } + if (checkin) { + pw.print(rec.eventUid); + } else { + UserHandle.formatUid(pw, rec.eventUid); + } + pw.print(":"); + if (checkin) { + pw.print(rec.eventNameIdx); + } else { + pw.print(rec.eventName); + } + } pw.println(); } oldState = rec.states; @@ -2416,7 +2464,8 @@ public abstract class BatteryStats implements Parcelable { * @param pw a Printer to receive the dump output. */ @SuppressWarnings("unused") - public void dumpLocked(Context context, PrintWriter pw, boolean isUnpluggedOnly, int reqUid) { + public void dumpLocked(Context context, PrintWriter pw, boolean isUnpluggedOnly, int reqUid, + boolean historyOnly) { prepareForDumpLocked(); long now = getHistoryBaseTime() + SystemClock.elapsedRealtime(); @@ -2441,7 +2490,11 @@ public abstract class BatteryStats implements Parcelable { finishIteratingOldHistoryLocked(); pw.println(""); } - + + if (historyOnly) { + return; + } + SparseArray<? extends Uid> uidStats = getUidStats(); final int NU = uidStats.size(); boolean didPid = false; @@ -2483,14 +2536,22 @@ public abstract class BatteryStats implements Parcelable { @SuppressWarnings("unused") public void dumpCheckinLocked(Context context, PrintWriter pw, List<ApplicationInfo> apps, boolean isUnpluggedOnly, - boolean includeHistory) { + boolean includeHistory, boolean historyOnly) { prepareForDumpLocked(); long now = getHistoryBaseTime() + SystemClock.elapsedRealtime(); - if (includeHistory) { + if (includeHistory || historyOnly) { final HistoryItem rec = new HistoryItem(); if (startIteratingHistoryLocked()) { + for (int i=0; i<getHistoryStringPoolSize(); i++) { + pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); + pw.print(HISTORY_STRING_POOL); pw.print(','); + pw.print(i); + pw.print(','); + pw.print(getHistoryStringPoolItem(i)); + pw.println(); + } HistoryPrinter hprinter = new HistoryPrinter(); while (getNextHistoryLocked(rec)) { pw.print(BATTERY_STATS_CHECKIN_VERSION); pw.print(','); @@ -2501,6 +2562,10 @@ public abstract class BatteryStats implements Parcelable { } } + if (historyOnly) { + return; + } + if (apps != null) { SparseArray<ArrayList<String>> uids = new SparseArray<ArrayList<String>>(); for (int i=0; i<apps.size(); i++) { diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl index 0771329..1946d86 100644 --- a/core/java/com/android/internal/app/IBatteryStats.aidl +++ b/core/java/com/android/internal/app/IBatteryStats.aidl @@ -29,6 +29,12 @@ interface IBatteryStats { // Remaining methods are only used in Java. byte[] getStatistics(); + + void addIsolatedUid(int isolatedUid, int appUid); + void removeIsolatedUid(int isolatedUid, int appUid); + + void noteEvent(int code, String name, int uid); + void noteStartWakelock(int uid, int pid, String name, int type); void noteStopWakelock(int uid, int pid, String name, int type); diff --git a/core/java/com/android/internal/os/BatteryStatsHelper.java b/core/java/com/android/internal/os/BatteryStatsHelper.java index 0131f68..e7e8006 100644 --- a/core/java/com/android/internal/os/BatteryStatsHelper.java +++ b/core/java/com/android/internal/os/BatteryStatsHelper.java @@ -41,7 +41,6 @@ import android.util.SparseArray; import com.android.internal.app.IBatteryStats; import com.android.internal.os.BatterySipper.DrainType; -import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -84,6 +83,7 @@ public class BatteryStatsHelper { private long mStatsPeriod = 0; private double mMaxPower = 1; + private double mComputedPower; private double mTotalPower; private double mWifiPower; private double mBluetoothPower; @@ -156,6 +156,7 @@ public class BatteryStatsHelper { getStats(); mMaxPower = 0; + mComputedPower = 0; mTotalPower = 0; mWifiPower = 0; mBluetoothPower = 0; @@ -195,21 +196,17 @@ public class BatteryStatsHelper { processMiscUsage(); if (DEBUG) { - Log.d(TAG, "Accuracy: total computed=" + makemAh(mTotalPower) + ", min discharge=" + Log.d(TAG, "Accuracy: total computed=" + makemAh(mComputedPower) + ", min discharge=" + makemAh(mMinDrainedPower) + ", max discharge=" + makemAh(mMaxDrainedPower)); } - if (true || mStats.getLowDischargeAmountSinceCharge() > 10) { - if (mMinDrainedPower > mTotalPower) { - double amount = mMinDrainedPower - mTotalPower; - if (mMaxPower < amount) { - mMaxPower = amount; - } + mTotalPower = mComputedPower; + if (mStats.getLowDischargeAmountSinceCharge() > 1) { + if (mMinDrainedPower > mComputedPower) { + double amount = mMinDrainedPower - mComputedPower; + mTotalPower = mMinDrainedPower; addEntryNoTotal(BatterySipper.DrainType.UNACCOUNTED, 0, amount); - } else if (mMaxDrainedPower < mTotalPower) { - double amount = mTotalPower - mMaxDrainedPower; - if (mMaxPower < amount) { - mMaxPower = amount; - } + } else if (mMaxDrainedPower < mComputedPower) { + double amount = mComputedPower - mMaxDrainedPower; addEntryNoTotal(BatterySipper.DrainType.OVERCOUNTED, 0, amount); } } @@ -442,7 +439,7 @@ public class BatteryStatsHelper { } else { mUsageList.add(app); if (power > mMaxPower) mMaxPower = power; - mTotalPower += power; + mComputedPower += power; } if (u.getUid() == 0) { osApp = app; @@ -467,7 +464,7 @@ public class BatteryStatsHelper { osApp.value += power; osApp.values[0] += power; if (osApp.value > mMaxPower) mMaxPower = osApp.value; - mTotalPower += power; + mComputedPower += power; } } } @@ -476,7 +473,9 @@ public class BatteryStatsHelper { long phoneOnTimeMs = mStats.getPhoneOnTime(mBatteryRealtime, mStatsType) / 1000; double phoneOnPower = mPowerProfile.getAveragePower(PowerProfile.POWER_RADIO_ACTIVE) * phoneOnTimeMs / (60*60*1000); - addEntry(BatterySipper.DrainType.PHONE, phoneOnTimeMs, phoneOnPower); + if (phoneOnPower != 0) { + addEntry(BatterySipper.DrainType.PHONE, phoneOnTimeMs, phoneOnPower); + } } private void addScreenUsage() { @@ -493,12 +492,14 @@ public class BatteryStatsHelper { double p = screenBinPower*brightnessTime; if (DEBUG && p != 0) { Log.d(TAG, "Screen bin #" + i + ": time=" + brightnessTime - + " power=" + makemAh(p/(60*60*1000))); + + " power=" + makemAh(p / (60 * 60 * 1000))); } power += p; } power /= (60*60*1000); // To hours - addEntry(BatterySipper.DrainType.SCREEN, screenOnTimeMs, power); + if (power != 0) { + addEntry(BatterySipper.DrainType.SCREEN, screenOnTimeMs, power); + } } private void addRadioUsage() { @@ -530,10 +531,12 @@ public class BatteryStatsHelper { Log.d(TAG, "Cell radio scanning: time=" + scanningTimeMs + " power=" + makemAh(p)); } power += p; - BatterySipper bs = - addEntry(BatterySipper.DrainType.CELL, signalTimeMs, power); - if (signalTimeMs != 0) { - bs.noCoveragePercent = noCoverageTimeMs * 100.0 / signalTimeMs; + if (power != 0) { + BatterySipper bs = + addEntry(BatterySipper.DrainType.CELL, signalTimeMs, power); + if (signalTimeMs != 0) { + bs.noCoveragePercent = noCoverageTimeMs * 100.0 / signalTimeMs; + } } } @@ -571,9 +574,11 @@ public class BatteryStatsHelper { if (DEBUG && wifiPower != 0) { Log.d(TAG, "Wifi: time=" + runningTimeMs + " power=" + makemAh(wifiPower)); } - BatterySipper bs = addEntry(BatterySipper.DrainType.WIFI, runningTimeMs, - wifiPower + mWifiPower); - aggregateSippers(bs, mWifiSippers, "WIFI"); + if ((wifiPower+mWifiPower) != 0) { + BatterySipper bs = addEntry(BatterySipper.DrainType.WIFI, runningTimeMs, + wifiPower + mWifiPower); + aggregateSippers(bs, mWifiSippers, "WIFI"); + } } private void addIdleUsage() { @@ -584,7 +589,9 @@ public class BatteryStatsHelper { if (DEBUG && idlePower != 0) { Log.d(TAG, "Idle: time=" + idleTimeMs + " power=" + makemAh(idlePower)); } - addEntry(BatterySipper.DrainType.IDLE, idleTimeMs, idlePower); + if (idlePower != 0) { + addEntry(BatterySipper.DrainType.IDLE, idleTimeMs, idlePower); + } } private void addBluetoothUsage() { @@ -602,9 +609,11 @@ public class BatteryStatsHelper { Log.d(TAG, "Bluetooth ping: count=" + btPingCount + " power=" + makemAh(pingPower)); } btPower += pingPower; - BatterySipper bs = addEntry(BatterySipper.DrainType.BLUETOOTH, btOnTimeMs, - btPower + mBluetoothPower); - aggregateSippers(bs, mBluetoothSippers, "Bluetooth"); + if ((btPower+mBluetoothPower) != 0) { + BatterySipper bs = addEntry(BatterySipper.DrainType.BLUETOOTH, btOnTimeMs, + btPower + mBluetoothPower); + aggregateSippers(bs, mBluetoothSippers, "Bluetooth"); + } } private void addUserUsage() { @@ -665,7 +674,7 @@ public class BatteryStatsHelper { } private BatterySipper addEntry(DrainType drainType, long time, double power) { - mTotalPower += power; + mComputedPower += power; return addEntryNoTotal(drainType, time, power); } @@ -689,6 +698,8 @@ public class BatteryStatsHelper { public double getTotalPower() { return mTotalPower; } + public double getComputedPower() { return mComputedPower; } + public double getMinDrainedPower() { return mMinDrainedPower; } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index f692948..70ba4e3 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -45,6 +45,7 @@ import android.util.PrintWriterPrinter; import android.util.Printer; import android.util.Slog; import android.util.SparseArray; +import android.util.SparseIntArray; import android.util.TimeUtils; import com.android.internal.annotations.GuardedBy; @@ -86,7 +87,7 @@ public final class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 69 + (USE_OLD_HISTORY ? 1000 : 0); + private static final int VERSION = 70 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 2000; @@ -142,6 +143,11 @@ public final class BatteryStatsImpl extends BatteryStats { private BatteryCallback mCallback; /** + * Mapping isolated uids to the actual owning app uid. + */ + final SparseIntArray mIsolatedUids = new SparseIntArray(); + + /** * The statistics we have collected organized by uids. */ final SparseArray<BatteryStatsImpl.Uid> mUidStats = @@ -183,6 +189,9 @@ public final class BatteryStatsImpl extends BatteryStats { final HistoryItem mHistoryLastWritten = new HistoryItem(); final HistoryItem mHistoryLastLastWritten = new HistoryItem(); final HistoryItem mHistoryReadTmp = new HistoryItem(); + final HashMap<String, Integer> mHistoryStringPool = new HashMap<String, Integer>(); + String[] mReadHistoryStrings; + int mNextHistoryStringIdx = 0; int mHistoryBufferLastPos = -1; boolean mHistoryOverflow = false; long mLastHistoryTime = 0; @@ -343,8 +352,6 @@ public final class BatteryStatsImpl extends BatteryStats { private final Map<String, KernelWakelockStats> mProcWakelockFileStats = new HashMap<String, KernelWakelockStats>(); - private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>(); - private final NetworkStatsFactory mNetworkStatsFactory = new NetworkStatsFactory(); private NetworkStats mLastSnapshot; @@ -1554,9 +1561,19 @@ public final class BatteryStatsImpl extends BatteryStats { + " states=0x" + Integer.toHexString(cur.states)); } if (cur.cmd == HistoryItem.CMD_EVENT) { - dest.writeInt(cur.eventCode); + Integer idxObj = mHistoryStringPool.get(cur.eventName); + int codeAndIndex = (cur.eventCode&0xffff); + int idx; + if (idxObj != null) { + idx = idxObj; + } else { + idx = mNextHistoryStringIdx; + mHistoryStringPool.put(cur.eventName, mNextHistoryStringIdx); + mNextHistoryStringIdx++; + } + codeAndIndex |= (idx<<16); + dest.writeInt(codeAndIndex); dest.writeInt(cur.eventUid); - dest.writeString(cur.eventName); } } @@ -1625,9 +1642,12 @@ public final class BatteryStatsImpl extends BatteryStats { } if (cur.cmd == HistoryItem.CMD_EVENT) { - cur.eventCode = src.readInt(); + int codeAndIndex = src.readInt(); + cur.eventCode = (codeAndIndex&0xffff); + int index = ((codeAndIndex>>16)&0xffff); + cur.eventName = mReadHistoryStrings[index]; + cur.eventNameIdx = index; cur.eventUid = src.readInt(); - cur.eventName = src.readString(); } else { cur.eventCode = HistoryItem.EVENT_NONE; } @@ -1688,15 +1708,15 @@ public final class BatteryStatsImpl extends BatteryStats { } void addHistoryBufferLocked(long curTime, byte cmd) { - addHistoryBufferLocked(curTime, cmd, HistoryItem.EVENT_NONE, 0, null); + addHistoryBufferLocked(curTime, cmd, HistoryItem.EVENT_NONE, null, 0); } - void addHistoryBufferEventLocked(long curTime, int eventCode, int eventUid, String eventName) { - addHistoryBufferLocked(curTime, HistoryItem.CMD_EVENT, eventCode, eventUid, eventName); + void addHistoryBufferEventLocked(long curTime, int eventCode, String eventName, int eventUid) { + addHistoryBufferLocked(curTime, HistoryItem.CMD_EVENT, eventCode, eventName, eventUid); } private void addHistoryBufferLocked(long curTime, byte cmd, - int eventCode, int eventUid, String eventName) { + int eventCode, String eventName, int eventUid) { int origPos = 0; if (mIteratingHistory) { origPos = mHistoryBuffer.dataPosition(); @@ -1778,6 +1798,10 @@ public final class BatteryStatsImpl extends BatteryStats { addHistoryRecordLocked(curTime, HistoryItem.CMD_UPDATE); } + void addHistoryEventLocked(long curTime, int code, String name, int uid) { + addHistoryBufferEventLocked(curTime, code, name, uid); + } + void addHistoryRecordLocked(long curTime, byte cmd) { HistoryItem rec = mHistoryCache; if (rec != null) { @@ -1822,6 +1846,8 @@ public final class BatteryStatsImpl extends BatteryStats { mHistoryBuffer.setDataCapacity(MAX_HISTORY_BUFFER/2); mHistoryLastLastWritten.cmd = HistoryItem.CMD_NULL; mHistoryLastWritten.cmd = HistoryItem.CMD_NULL; + mHistoryStringPool.clear(); + mNextHistoryStringIdx = 0; mHistoryBufferLastPos = -1; mHistoryOverflow = false; } @@ -1856,7 +1882,29 @@ public final class BatteryStatsImpl extends BatteryStats { int mWakeLockNesting; + public void addIsolatedUidLocked(int isolatedUid, int appUid) { + mIsolatedUids.put(isolatedUid, appUid); + } + + public void removeIsolatedUidLocked(int isolatedUid, int appUid) { + int curUid = mIsolatedUids.get(isolatedUid, -1); + if (curUid == appUid) { + mIsolatedUids.delete(isolatedUid); + } + } + + public int mapUid(int uid) { + int isolated = mIsolatedUids.get(uid, -1); + return isolated > 0 ? isolated : uid; + } + + public void noteEventLocked(int code, String name, int uid) { + uid = mapUid(uid); + addHistoryEventLocked(SystemClock.elapsedRealtime(), code, name, uid); + } + public void noteStartWakeLocked(int uid, int pid, String name, int type) { + uid = mapUid(uid); if (type == WAKE_TYPE_PARTIAL) { // Only care about partial wake locks, since full wake locks // will be canceled when the user puts the screen to sleep. @@ -1878,6 +1926,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteStopWakeLocked(int uid, int pid, String name, int type) { + uid = mapUid(uid); if (type == WAKE_TYPE_PARTIAL) { mWakeLockNesting--; if (mWakeLockNesting == 0) { @@ -2009,6 +2058,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteProcessDiedLocked(int uid, int pid) { + uid = mapUid(uid); Uid u = mUidStats.get(uid); if (u != null) { u.mPids.remove(pid); @@ -2016,6 +2066,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public long getProcessWakeTime(int uid, int pid, long realtime) { + uid = mapUid(uid); Uid u = mUidStats.get(uid); if (u != null) { Uid.Pid p = u.mPids.get(pid); @@ -2027,6 +2078,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void reportExcessiveWakeLocked(int uid, String proc, long overTime, long usedTime) { + uid = mapUid(uid); Uid u = mUidStats.get(uid); if (u != null) { u.reportExcessiveWakeLocked(proc, overTime, usedTime); @@ -2034,6 +2086,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void reportExcessiveCpuLocked(int uid, String proc, long overTime, long usedTime) { + uid = mapUid(uid); Uid u = mUidStats.get(uid); if (u != null) { u.reportExcessiveCpuLocked(proc, overTime, usedTime); @@ -2043,6 +2096,7 @@ public final class BatteryStatsImpl extends BatteryStats { int mSensorNesting; public void noteStartSensorLocked(int uid, int sensor) { + uid = mapUid(uid); if (mSensorNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_SENSOR_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Start sensor to: " @@ -2054,6 +2108,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteStopSensorLocked(int uid, int sensor) { + uid = mapUid(uid); mSensorNesting--; if (mSensorNesting == 0) { mHistoryCur.states &= ~HistoryItem.STATE_SENSOR_ON_FLAG; @@ -2067,6 +2122,7 @@ public final class BatteryStatsImpl extends BatteryStats { int mGpsNesting; public void noteStartGpsLocked(int uid) { + uid = mapUid(uid); if (mGpsNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_GPS_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: " @@ -2078,6 +2134,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteStopGpsLocked(int uid) { + uid = mapUid(uid); mGpsNesting--; if (mGpsNesting == 0) { mHistoryCur.states &= ~HistoryItem.STATE_GPS_ON_FLAG; @@ -2158,6 +2215,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteUserActivityLocked(int uid, int event) { + uid = mapUid(uid); getUidStatsLocked(uid).noteUserActivityLocked(event); } @@ -2400,6 +2458,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteAudioOnLocked(int uid) { + uid = mapUid(uid); if (!mAudioOn) { mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: " @@ -2412,6 +2471,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteAudioOffLocked(int uid) { + uid = mapUid(uid); if (mAudioOn) { mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: " @@ -2424,6 +2484,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteVideoOnLocked(int uid) { + uid = mapUid(uid); if (!mVideoOn) { mHistoryCur.states |= HistoryItem.STATE_VIDEO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: " @@ -2436,6 +2497,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteVideoOffLocked(int uid) { + uid = mapUid(uid); if (mVideoOn) { mHistoryCur.states &= ~HistoryItem.STATE_VIDEO_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: " @@ -2448,18 +2510,22 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteActivityResumedLocked(int uid) { + uid = mapUid(uid); getUidStatsLocked(uid).noteActivityResumedLocked(); } public void noteActivityPausedLocked(int uid) { + uid = mapUid(uid); getUidStatsLocked(uid).noteActivityPausedLocked(); } public void noteVibratorOnLocked(int uid, long durationMillis) { + uid = mapUid(uid); getUidStatsLocked(uid).noteVibratorOnLocked(durationMillis); } public void noteVibratorOffLocked(int uid) { + uid = mapUid(uid); getUidStatsLocked(uid).noteVibratorOffLocked(); } @@ -2473,7 +2539,8 @@ public final class BatteryStatsImpl extends BatteryStats { mGlobalWifiRunningTimer.startRunningLocked(this); int N = ws.size(); for (int i=0; i<N; i++) { - getUidStatsLocked(ws.get(i)).noteWifiRunningLocked(); + int uid = mapUid(ws.get(i)); + getUidStatsLocked(uid).noteWifiRunningLocked(); } } else { Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running"); @@ -2484,11 +2551,13 @@ public final class BatteryStatsImpl extends BatteryStats { if (mGlobalWifiRunning) { int N = oldWs.size(); for (int i=0; i<N; i++) { - getUidStatsLocked(oldWs.get(i)).noteWifiStoppedLocked(); + int uid = mapUid(oldWs.get(i)); + getUidStatsLocked(uid).noteWifiStoppedLocked(); } N = newWs.size(); for (int i=0; i<N; i++) { - getUidStatsLocked(newWs.get(i)).noteWifiRunningLocked(); + int uid = mapUid(newWs.get(i)); + getUidStatsLocked(uid).noteWifiRunningLocked(); } } else { Log.w(TAG, "noteWifiRunningChangedLocked -- called while WIFI not running"); @@ -2505,7 +2574,8 @@ public final class BatteryStatsImpl extends BatteryStats { mGlobalWifiRunningTimer.stopRunningLocked(this); int N = ws.size(); for (int i=0; i<N; i++) { - getUidStatsLocked(ws.get(i)).noteWifiStoppedLocked(); + int uid = mapUid(ws.get(i)); + getUidStatsLocked(uid).noteWifiStoppedLocked(); } } else { Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running"); @@ -2537,6 +2607,7 @@ public final class BatteryStatsImpl extends BatteryStats { int mWifiFullLockNesting = 0; public void noteFullWifiLockAcquiredLocked(int uid) { + uid = mapUid(uid); if (mWifiFullLockNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: " @@ -2548,6 +2619,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteFullWifiLockReleasedLocked(int uid) { + uid = mapUid(uid); mWifiFullLockNesting--; if (mWifiFullLockNesting == 0) { mHistoryCur.states &= ~HistoryItem.STATE_WIFI_FULL_LOCK_FLAG; @@ -2561,6 +2633,7 @@ public final class BatteryStatsImpl extends BatteryStats { int mWifiScanNesting = 0; public void noteWifiScanStartedLocked(int uid) { + uid = mapUid(uid); if (mWifiScanNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan started for: " @@ -2572,6 +2645,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteWifiScanStoppedLocked(int uid) { + uid = mapUid(uid); mWifiScanNesting--; if (mWifiScanNesting == 0) { mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_FLAG; @@ -2583,16 +2657,19 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteWifiBatchedScanStartedLocked(int uid, int csph) { + uid = mapUid(uid); getUidStatsLocked(uid).noteWifiBatchedScanStartedLocked(csph); } public void noteWifiBatchedScanStoppedLocked(int uid) { + uid = mapUid(uid); getUidStatsLocked(uid).noteWifiBatchedScanStoppedLocked(); } int mWifiMulticastNesting = 0; public void noteWifiMulticastEnabledLocked(int uid) { + uid = mapUid(uid); if (mWifiMulticastNesting == 0) { mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: " @@ -2604,6 +2681,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void noteWifiMulticastDisabledLocked(int uid) { + uid = mapUid(uid); mWifiMulticastNesting--; if (mWifiMulticastNesting == 0) { mHistoryCur.states &= ~HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG; @@ -3781,6 +3859,11 @@ public final class BatteryStatsImpl extends BatteryStats { */ public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable { /** + * Remains true until removed from the stats. + */ + boolean mActive = true; + + /** * Total time (in 1/100 sec) spent executing in user code. */ long mUserTime; @@ -3880,6 +3963,7 @@ public final class BatteryStatsImpl extends BatteryStats { } void detach() { + mActive = false; mUnpluggables.remove(this); for (int i = 0; i < mSpeedBins.length; i++) { SamplingCounter c = mSpeedBins[i]; @@ -4038,6 +4122,11 @@ public final class BatteryStatsImpl extends BatteryStats { } @Override + public boolean isActive() { + return mActive; + } + + @Override public long getUserTime(int which) { long val; if (which == STATS_LAST) { @@ -4812,10 +4901,24 @@ public final class BatteryStatsImpl extends BatteryStats { mHistoryBuffer.setDataPosition(0); mReadOverflow = false; mIteratingHistory = true; + mReadHistoryStrings = new String[mHistoryStringPool.size()]; + for (HashMap.Entry<String, Integer> ent : mHistoryStringPool.entrySet()) { + mReadHistoryStrings[ent.getValue()] = ent.getKey(); + } return mHistoryBuffer.dataSize() > 0; } @Override + public int getHistoryStringPoolSize() { + return mReadHistoryStrings.length; + } + + @Override + public String getHistoryStringPoolItem(int index) { + return mReadHistoryStrings[index]; + } + + @Override public boolean getNextHistoryLocked(HistoryItem out) { final int pos = mHistoryBuffer.dataPosition(); if (pos == 0) { @@ -4834,6 +4937,7 @@ public final class BatteryStatsImpl extends BatteryStats { public void finishIteratingHistoryLocked() { mIteratingHistory = false; mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize()); + mReadHistoryStrings = null; } @Override @@ -5396,24 +5500,6 @@ public final class BatteryStatsImpl extends BatteryStats { } /** - * Retrieve the statistics object for a particular process, given - * the name of the process. - * @param name process name - * @return the statistics object for the process - */ - public Uid.Proc getProcessStatsLocked(String name, int pid) { - int uid; - if (mUidCache.containsKey(name)) { - uid = mUidCache.get(name); - } else { - uid = Process.getUidForPid(pid); - mUidCache.put(name, uid); - } - Uid u = getUidStatsLocked(uid); - return u.getProcessStatsLocked(name); - } - - /** * Retrieve the statistics object for a particular process, creating * if needed. */ @@ -5624,6 +5710,18 @@ public final class BatteryStatsImpl extends BatteryStats { mHistoryBuffer.setDataSize(0); mHistoryBuffer.setDataPosition(0); + mHistoryStringPool.clear(); + mNextHistoryStringIdx = 0; + + int numStrings = in.readInt(); + for (int i=0; i<numStrings; i++) { + String str = in.readString(); + int idx = in.readInt(); + mHistoryStringPool.put(str, idx); + if (idx >= mNextHistoryStringIdx) { + mNextHistoryStringIdx = idx+1; + } + } int bufSize = in.readInt(); int curPos = in.dataPosition(); @@ -5692,6 +5790,11 @@ public final class BatteryStatsImpl extends BatteryStats { Slog.i(TAG, sb.toString()); } out.writeLong(mHistoryBaseTime + mLastHistoryTime); + out.writeInt(mHistoryStringPool.size()); + for (HashMap.Entry<String, Integer> ent : mHistoryStringPool.entrySet()) { + out.writeString(ent.getKey()); + out.writeInt(ent.getValue()); + } out.writeInt(mHistoryBuffer.dataSize()); if (DEBUG_HISTORY) Slog.i(TAG, "***************** WRITING HISTORY: " + mHistoryBuffer.dataSize() + " bytes at " + out.dataPosition()); @@ -6399,7 +6502,8 @@ public final class BatteryStatsImpl extends BatteryStats { pullPendingStateUpdatesLocked(); } - public void dumpLocked(Context context, PrintWriter pw, boolean isUnpluggedOnly, int reqUid) { + public void dumpLocked(Context context, PrintWriter pw, boolean isUnpluggedOnly, int reqUid, + boolean historyOnly) { if (DEBUG) { Printer pr = new PrintWriterPrinter(pw); pr.println("*** Screen timer:"); @@ -6429,6 +6533,6 @@ public final class BatteryStatsImpl extends BatteryStats { pr.println("*** Bluetooth timer:"); mBluetoothOnTimer.logState(pr, " "); } - super.dumpLocked(context, pw, isUnpluggedOnly, reqUid); + super.dumpLocked(context, pw, isUnpluggedOnly, reqUid, historyOnly); } } diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index 3cdf170..cb5ae96 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -1258,8 +1258,16 @@ class AlarmManagerService extends SystemService { || alarm.type == RTC_WAKEUP) { bs.numWakeup++; fs.numWakeup++; - ActivityManagerNative.noteWakeupAlarm( - alarm.operation); + if (alarm.workSource != null && alarm.workSource.size() > 0) { + for (int wi=0; wi<alarm.workSource.size(); wi++) { + ActivityManagerNative.noteWakeupAlarm( + alarm.operation, alarm.workSource.get(wi), + alarm.workSource.getName(wi)); + } + } else { + ActivityManagerNative.noteWakeupAlarm( + alarm.operation, -1, null); + } } } catch (PendingIntent.CanceledException e) { if (alarm.repeatInterval > 0) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 522cda6..a21157f 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -32,6 +32,7 @@ import android.app.IActivityContainer; import android.app.IActivityContainerCallback; import android.appwidget.AppWidgetManager; import android.graphics.Rect; +import android.os.BatteryStats; import android.util.ArrayMap; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; @@ -2101,29 +2102,24 @@ public final class ActivityManagerService extends ActivityManagerNative totalUTime += otherUTime; totalSTime += otherSTime; if (pr != null) { - BatteryStatsImpl.Uid.Proc ps = bstats.getProcessStatsLocked( - st.name, st.pid); + BatteryStatsImpl.Uid.Proc ps = pr.curProcBatteryStats; + if (ps == null || !ps.isActive()) { + pr.curProcBatteryStats = ps = bstats.getProcessStatsLocked( + pr.info.uid, pr.processName); + } ps.addCpuTimeLocked(st.rel_utime-otherUTime, st.rel_stime-otherSTime); ps.addSpeedStepTimes(cpuSpeedTimes); pr.curCpuTime += (st.rel_utime+st.rel_stime) * 10; - } else if (st.uid >= Process.FIRST_APPLICATION_UID) { + } else { BatteryStatsImpl.Uid.Proc ps = st.batteryStats; - if (ps == null) { - st.batteryStats = ps = bstats.getProcessStatsLocked(st.uid, - "(Unknown)"); + if (ps == null || !ps.isActive()) { + st.batteryStats = ps = bstats.getProcessStatsLocked( + bstats.mapUid(st.uid), st.name); } ps.addCpuTimeLocked(st.rel_utime-otherUTime, st.rel_stime-otherSTime); ps.addSpeedStepTimes(cpuSpeedTimes); - } else { - BatteryStatsImpl.Uid.Proc ps = - bstats.getProcessStatsLocked(st.name, st.pid); - if (ps != null) { - ps.addCpuTimeLocked(st.rel_utime-otherUTime, - st.rel_stime-otherSTime); - ps.addSpeedStepTimes(cpuSpeedTimes); - } } } bstats.finishAddingCpuLocked(perc, totalUTime, @@ -2772,6 +2768,11 @@ public final class ActivityManagerService extends ActivityManagerNative mHandler.sendMessageDelayed(msg, startResult.usingWrapper ? PROC_START_TIMEOUT_WITH_WRAPPER : PROC_START_TIMEOUT); } + mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_STARTED, + app.processName, app.info.uid); + if (app.isolated) { + mBatteryStatsService.addIsolatedUid(app.uid, app.info.uid); + } } catch (RuntimeException e) { // XXX do better error recovery. app.setPid(0); @@ -4726,6 +4727,11 @@ public final class ActivityManagerService extends ActivityManagerNative mPidsSelfLocked.remove(pid); mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); } + mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_FINISHED, + app.processName, app.info.uid); + if (app.isolated) { + mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); + } killUnneededProcessLocked(app, reason); handleAppDiedLocked(app, true, allowRestart); removeLruProcessLocked(app); @@ -4766,6 +4772,11 @@ public final class ActivityManagerService extends ActivityManagerNative mHeavyWeightProcess.userId, 0)); mHeavyWeightProcess = null; } + mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_FINISHED, + app.processName, app.info.uid); + if (app.isolated) { + mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); + } // Take care of any launching providers waiting for this process. checkAppInLaunchingProvidersLocked(app, true); // Take care of any services that are waiting for the process. @@ -8720,7 +8731,7 @@ public final class ActivityManagerService extends ActivityManagerNative Context.WINDOW_SERVICE)).addView(v, lp); } - public void noteWakeupAlarm(IIntentSender sender) { + public void noteWakeupAlarm(IIntentSender sender, int sourceUid, String sourcePkg) { if (!(sender instanceof PendingIntentRecord)) { return; } @@ -8732,7 +8743,8 @@ public final class ActivityManagerService extends ActivityManagerNative int MY_UID = Binder.getCallingUid(); int uid = rec.uid == MY_UID ? Process.SYSTEM_UID : rec.uid; BatteryStatsImpl.Uid.Pkg pkg = - stats.getPackageStatsLocked(uid, rec.key.packageName); + stats.getPackageStatsLocked(sourceUid >= 0 ? sourceUid : uid, + sourcePkg != null ? sourcePkg : rec.key.packageName); pkg.incWakeupsLocked(); } } @@ -12447,10 +12459,16 @@ public final class ActivityManagerService extends ActivityManagerNative startProcessLocked(app, "restart", app.processName); } else if (app.pid > 0 && app.pid != MY_PID) { // Goodbye! + boolean removed; synchronized (mPidsSelfLocked) { mPidsSelfLocked.remove(app.pid); mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); } + mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_PROC_FINISHED, + app.processName, app.info.uid); + if (app.isolated) { + mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); + } app.setPid(0); } } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index d2dfb0d..eda08a9 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -105,6 +105,27 @@ public final class BatteryStatsService extends IBatteryStats.Stub { return data; } + public void addIsolatedUid(int isolatedUid, int appUid) { + enforceCallingPermission(); + synchronized (mStats) { + mStats.addIsolatedUidLocked(isolatedUid, appUid); + } + } + + public void removeIsolatedUid(int isolatedUid, int appUid) { + enforceCallingPermission(); + synchronized (mStats) { + mStats.removeIsolatedUidLocked(isolatedUid, appUid); + } + } + + public void noteEvent(int code, String name, int uid) { + enforceCallingPermission(); + synchronized (mStats) { + mStats.noteEventLocked(code, name, uid); + } + } + public void noteStartWakelock(int uid, int pid, String name, int type) { enforceCallingPermission(); synchronized (mStats) { @@ -496,8 +517,10 @@ public final class BatteryStatsService extends IBatteryStats.Stub { private void dumpHelp(PrintWriter pw) { pw.println("Battery stats (batterystats) dump options:"); - pw.println(" [--checkin] [-c] [--unplugged] [--reset] [--write] [-h] [<package.name>]"); + pw.println(" [--checkin] [--history] [-c] [--unplugged] [--reset] [--write]"); + pw.println(" [-h] [<package.name>]"); pw.println(" --checkin: format output for a checkin report."); + pw.println(" --history: show only history data."); pw.println(" --unplugged: only output data since last unplugged."); pw.println(" --reset: reset the stats, clearing all current data."); pw.println(" --write: force write current collected stats to disk."); @@ -517,6 +540,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub { boolean isCheckin = false; boolean includeHistory = false; + boolean historyOnly = false; boolean isUnpluggedOnly = false; boolean noOutput = false; int reqUid = -1; @@ -524,6 +548,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub { for (String arg : args) { if ("--checkin".equals(arg)) { isCheckin = true; + } else if ("--history".equals(arg)) { + historyOnly = true; } else if ("-c".equals(arg)) { isCheckin = true; includeHistory = true; @@ -569,11 +595,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub { if (isCheckin) { List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(0); synchronized (mStats) { - mStats.dumpCheckinLocked(mContext, pw, apps, isUnpluggedOnly, includeHistory); + mStats.dumpCheckinLocked(mContext, pw, apps, isUnpluggedOnly, includeHistory, + historyOnly); } } else { synchronized (mStats) { - mStats.dumpLocked(mContext, pw, isUnpluggedOnly, reqUid); + mStats.dumpLocked(mContext, pw, isUnpluggedOnly, reqUid, historyOnly); } } } diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 217a8d6..1f0fc3a 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -59,6 +59,7 @@ final class ProcessRecord { // 'persistent' is true (in which case we // are in the process of launching the app) ProcessStats.ProcessState baseProcessTracker; + BatteryStatsImpl.Uid.Proc curProcBatteryStats; int pid; // The process of this application; 0 if none boolean starting; // True if the process is being started long lastActivityTime; // For managing the LRU list |