summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2014-01-22 22:18:13 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-01-22 22:18:13 +0000
commit39e79006cf22f10eb62ac721238778aa6b7d3473 (patch)
treedab4804b372140219524e581f2f10e35d9d0be32
parentafc4deb7b3d6731075c532ab4f829d145b1112c5 (diff)
parent099bc627c463d9941e23e480f25a78a154429c55 (diff)
downloadframeworks_base-39e79006cf22f10eb62ac721238778aa6b7d3473.zip
frameworks_base-39e79006cf22f10eb62ac721238778aa6b7d3473.tar.gz
frameworks_base-39e79006cf22f10eb62ac721238778aa6b7d3473.tar.bz2
Merge "Battery stats improvements."
-rw-r--r--core/java/android/app/ActivityManagerNative.java15
-rw-r--r--core/java/android/app/IActivityManager.java3
-rw-r--r--core/java/android/os/BatteryStats.java91
-rw-r--r--core/java/com/android/internal/app/IBatteryStats.aidl6
-rw-r--r--core/java/com/android/internal/os/BatteryStatsHelper.java71
-rw-r--r--core/java/com/android/internal/os/BatteryStatsImpl.java174
-rw-r--r--services/core/java/com/android/server/AlarmManagerService.java12
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java50
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java33
-rw-r--r--services/core/java/com/android/server/am/ProcessRecord.java1
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