Fix issue #3154576: battery stats checkin should include UID -> packages+ map
Includes some other small fixes to battery collection and a few
other things.
Output of package info looks like this:
5,0,i,uid,1000,com.android.settings
5,0,i,uid,1000,com.android.providers.subscribedfeeds
5,0,i,uid,1000,com.android.providers.settings
5,0,i,uid,1000,com.android.server.vpn
5,0,i,uid,1000,android
5,0,i,uid,1000,com.android.systemui
5,0,i,uid,1000,com.google.android.backup
5,0,i,uid,1001,com.android.phone
5,0,i,uid,1001,com.android.providers.telephony
5,0,i,uid,1022,com.android.nfc
5,0,i,uid,10021,com.google.android.location
5,0,i,uid,10021,com.google.android.syncadapters.calendar
5,0,i,uid,10021,com.google.android.gsf
5,0,i,uid,10021,com.google.android.syncadapters.contacts
5,0,i,uid,10026,com.android.providers.downloads.ui
5,0,i,uid,10026,com.android.providers.media
5,0,i,uid,10026,com.android.providers.drm
5,0,i,uid,10026,com.android.providers.downloads
5,0,i,uid,10032,com.android.launcher
5,0,i,uid,10039,com.google.android.gm
5,0,i,uid,10041,com.google.android.gallery3d
5,0,i,uid,10049,com.android.providers.calendar
Change-Id: I9e38f254eef146339113ad270f5c6e8b60fb7a1d
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index d67e6f5..e4485d1 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -17,9 +17,12 @@
package android.os;
import java.io.PrintWriter;
+import java.util.ArrayList;
import java.util.Formatter;
+import java.util.List;
import java.util.Map;
+import android.content.pm.ApplicationInfo;
import android.util.Log;
import android.util.Printer;
import android.util.SparseArray;
@@ -120,6 +123,7 @@
private static final long BYTES_PER_GB = 1073741824; //1024^3
+ private static final String UID_DATA = "uid";
private static final String APK_DATA = "apk";
private static final String PROCESS_DATA = "pr";
private static final String SENSOR_DATA = "sr";
@@ -1460,7 +1464,7 @@
for (int iu=0; iu<NU; iu++) {
final int uid = uidStats.keyAt(iu);
- if (reqUid >= 0 && uid != reqUid) {
+ if (reqUid >= 0 && uid != reqUid && uid != Process.SYSTEM_UID) {
continue;
}
@@ -1877,7 +1881,7 @@
}
@SuppressWarnings("unused")
- public void dumpCheckinLocked(PrintWriter pw, String[] args) {
+ public void dumpCheckinLocked(PrintWriter pw, String[] args, List<ApplicationInfo> apps) {
boolean isUnpluggedOnly = false;
for (String arg : args) {
@@ -1887,6 +1891,33 @@
}
}
+ if (apps != null) {
+ SparseArray<ArrayList<String>> uids = new SparseArray<ArrayList<String>>();
+ for (int i=0; i<apps.size(); i++) {
+ ApplicationInfo ai = apps.get(i);
+ ArrayList<String> pkgs = uids.get(ai.uid);
+ if (pkgs == null) {
+ pkgs = new ArrayList<String>();
+ uids.put(ai.uid, pkgs);
+ }
+ pkgs.add(ai.packageName);
+ }
+ SparseArray<? extends Uid> uidStats = getUidStats();
+ final int NU = uidStats.size();
+ String[] lineArgs = new String[2];
+ for (int i=0; i<NU; i++) {
+ int uid = uidStats.keyAt(i);
+ ArrayList<String> pkgs = uids.get(uid);
+ if (pkgs != null) {
+ for (int j=0; j<pkgs.size(); j++) {
+ lineArgs[0] = Integer.toString(uid);
+ lineArgs[1] = pkgs.get(j);
+ dumpLine(pw, 0 /* uid */, "i" /* category */, UID_DATA,
+ (Object[])lineArgs);
+ }
+ }
+ }
+ }
if (isUnpluggedOnly) {
dumpCheckinLocked(pw, STATS_SINCE_UNPLUGGED, -1);
}