Merge "Work on issue #18486438: Reduce size of bugreport output" into lmp-mr1-dev

This commit is contained in:
Dianne Hackborn
2014-11-24 17:53:48 +00:00
committed by Android (Google) Code Review
7 changed files with 195 additions and 79 deletions

View File

@@ -538,7 +538,7 @@ public abstract class WallpaperService extends Service {
out.print(prefix); out.print("mType="); out.print(mType);
out.print(" mWindowFlags="); out.print(mWindowFlags);
out.print(" mCurWindowFlags="); out.println(mCurWindowFlags);
out.print(" mWindowPrivateFlags="); out.print(mWindowPrivateFlags);
out.print(prefix); out.print("mWindowPrivateFlags="); out.print(mWindowPrivateFlags);
out.print(" mCurWindowPrivateFlags="); out.println(mCurWindowPrivateFlags);
out.print(prefix); out.print("mVisibleInsets=");
out.print(mVisibleInsets.toShortString());

View File

@@ -1079,7 +1079,9 @@ public final class ProcessStats implements Parcelable {
ProcessDataCollection totals = new ProcessDataCollection(screenStates,
memStates, procStates);
computeProcessData(proc, totals, now);
if (totals.totalTime != 0 || totals.numPss != 0) {
double percentage = (double) totals.totalTime / (double) totalTime * 100;
// We don't print percentages < .01, so just drop those.
if (percentage >= 0.005 || totals.numPss != 0) {
if (prefix != null) {
pw.print(prefix);
}
@@ -2470,7 +2472,7 @@ public final class ProcessStats implements Parcelable {
totalMem.totalTime, totalPss, totalMem.sysMemSamples);
totalPss = printMemoryCategory(pw, " ", "Free ", totalMem.sysMemFreeWeight,
totalMem.totalTime, totalPss, totalMem.sysMemSamples);
totalPss = printMemoryCategory(pw, " ", "Z-Ram ", totalMem.sysMemZRamWeight,
totalPss = printMemoryCategory(pw, " ", "Z-Ram ", totalMem.sysMemZRamWeight,
totalMem.totalTime, totalPss, totalMem.sysMemSamples);
pw.print(" TOTAL : ");
printSizeValue(pw, totalPss);

View File

@@ -23,7 +23,6 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import android.net.Uri;
@@ -31,6 +30,7 @@ import android.util.FastImmutableArraySet;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.MutableInt;
import android.util.PrintWriterPrinter;
import android.util.Slog;
import android.util.LogPrinter;
@@ -213,36 +213,65 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> {
}
boolean dumpMap(PrintWriter out, String titlePrefix, String title,
String prefix, Map<String, F[]> map, String packageName,
boolean printFilter) {
String eprefix = prefix + " ";
String fprefix = prefix + " ";
String prefix, ArrayMap<String, F[]> map, String packageName,
boolean printFilter, boolean collapseDuplicates) {
final String eprefix = prefix + " ";
final String fprefix = prefix + " ";
final ArrayMap<Object, MutableInt> found = new ArrayMap<>();
boolean printedSomething = false;
Printer printer = null;
for (Map.Entry<String, F[]> e : map.entrySet()) {
F[] a = e.getValue();
for (int mapi=0; mapi<map.size(); mapi++) {
F[] a = map.valueAt(mapi);
final int N = a.length;
boolean printedHeader = false;
F filter;
for (int i=0; i<N && (filter=a[i]) != null; i++) {
if (packageName != null && !isPackageForFilter(packageName, filter)) {
continue;
}
if (title != null) {
out.print(titlePrefix); out.println(title);
title = null;
}
if (!printedHeader) {
out.print(eprefix); out.print(e.getKey()); out.println(":");
printedHeader = true;
}
printedSomething = true;
dumpFilter(out, fprefix, filter);
if (printFilter) {
if (printer == null) {
printer = new PrintWriterPrinter(out);
if (collapseDuplicates) {
found.clear();
for (int i=0; i<N && (filter=a[i]) != null; i++) {
if (packageName != null && !isPackageForFilter(packageName, filter)) {
continue;
}
Object label = filterToLabel(filter);
int index = found.indexOfKey(label);
if (index < 0) {
found.put(label, new MutableInt(1));
} else {
found.valueAt(index).value++;
}
}
for (int i=0; i<found.size(); i++) {
if (title != null) {
out.print(titlePrefix); out.println(title);
title = null;
}
if (!printedHeader) {
out.print(eprefix); out.print(map.keyAt(mapi)); out.println(":");
printedHeader = true;
}
printedSomething = true;
dumpFilterLabel(out, fprefix, found.keyAt(i), found.valueAt(i).value);
}
} else {
for (int i=0; i<N && (filter=a[i]) != null; i++) {
if (packageName != null && !isPackageForFilter(packageName, filter)) {
continue;
}
if (title != null) {
out.print(titlePrefix); out.println(title);
title = null;
}
if (!printedHeader) {
out.print(eprefix); out.print(map.keyAt(mapi)); out.println(":");
printedHeader = true;
}
printedSomething = true;
dumpFilter(out, fprefix, filter);
if (printFilter) {
if (printer == null) {
printer = new PrintWriterPrinter(out);
}
filter.dump(printer, fprefix + " ");
}
filter.dump(printer, fprefix + " ");
}
}
}
@@ -250,32 +279,32 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> {
}
public boolean dump(PrintWriter out, String title, String prefix, String packageName,
boolean printFilter) {
boolean printFilter, boolean collapseDuplicates) {
String innerPrefix = prefix + " ";
String sepPrefix = "\n" + prefix;
String curPrefix = title + "\n" + prefix;
if (dumpMap(out, curPrefix, "Full MIME Types:", innerPrefix,
mTypeToFilter, packageName, printFilter)) {
mTypeToFilter, packageName, printFilter, collapseDuplicates)) {
curPrefix = sepPrefix;
}
if (dumpMap(out, curPrefix, "Base MIME Types:", innerPrefix,
mBaseTypeToFilter, packageName, printFilter)) {
mBaseTypeToFilter, packageName, printFilter, collapseDuplicates)) {
curPrefix = sepPrefix;
}
if (dumpMap(out, curPrefix, "Wild MIME Types:", innerPrefix,
mWildTypeToFilter, packageName, printFilter)) {
mWildTypeToFilter, packageName, printFilter, collapseDuplicates)) {
curPrefix = sepPrefix;
}
if (dumpMap(out, curPrefix, "Schemes:", innerPrefix,
mSchemeToFilter, packageName, printFilter)) {
mSchemeToFilter, packageName, printFilter, collapseDuplicates)) {
curPrefix = sepPrefix;
}
if (dumpMap(out, curPrefix, "Non-Data Actions:", innerPrefix,
mActionToFilter, packageName, printFilter)) {
mActionToFilter, packageName, printFilter, collapseDuplicates)) {
curPrefix = sepPrefix;
}
if (dumpMap(out, curPrefix, "MIME Typed Actions:", innerPrefix,
mTypedActionToFilter, packageName, printFilter)) {
mTypedActionToFilter, packageName, printFilter, collapseDuplicates)) {
curPrefix = sepPrefix;
}
return curPrefix == sepPrefix;
@@ -479,6 +508,14 @@ public abstract class IntentResolver<F extends IntentFilter, R extends Object> {
out.print(prefix); out.println(filter);
}
protected Object filterToLabel(F filter) {
return "IntentFilter";
}
protected void dumpFilterLabel(PrintWriter out, String prefix, Object label, int count) {
out.print(prefix); out.print(label); out.print(": "); out.println(count);
}
private final void addFilter(ArrayMap<String, F[]> map, String name, F filter) {
F[] array = map.get(name);
if (array == null) {

View File

@@ -13232,7 +13232,7 @@ public final class ActivityManagerService extends ActivityManagerNative
if (mReceiverResolver.dump(pw, needSep ?
"\n Receiver Resolver Table:" : " Receiver Resolver Table:",
" ", dumpPackage, false)) {
" ", dumpPackage, false, false)) {
needSep = true;
printedAnything = true;
}

View File

@@ -582,9 +582,10 @@ public final class ProcessStatsService extends IProcessStats.Stub {
pw.println("Process stats (procstats) dump options:");
pw.println(" [--checkin|-c|--csv] [--csv-screen] [--csv-proc] [--csv-mem]");
pw.println(" [--details] [--full-details] [--current] [--hours N] [--last N]");
pw.println(" [--active] [--commit] [--reset] [--clear] [--write] [-h] [<package.name>]");
pw.println(" [--max N] --active] [--commit] [--reset] [--clear] [--write] [-h]");
pw.println(" [<package.name>]");
pw.println(" --checkin: perform a checkin: print and delete old committed states.");
pw.println(" --c: print only state in checkin format.");
pw.println(" -c: print only state in checkin format.");
pw.println(" --csv: output data suitable for putting in a spreadsheet.");
pw.println(" --csv-screen: on, off.");
pw.println(" --csv-mem: norm, mod, low, crit.");
@@ -595,6 +596,7 @@ public final class ProcessStatsService extends IProcessStats.Stub {
pw.println(" --current: only dump current state.");
pw.println(" --hours: aggregate over about N last hours.");
pw.println(" --last: only show the last committed stats at index N (starting at 1).");
pw.println(" --max: for -a, max num of historical batches to print.");
pw.println(" --active: only show currently active processes/services.");
pw.println(" --commit: commit current stats to disk and reset to start new stats.");
pw.println(" --reset: reset current stats, without committing.");
@@ -636,6 +638,7 @@ public final class ProcessStatsService extends IProcessStats.Stub {
boolean dumpAll = false;
int aggregateHours = 0;
int lastIndex = 0;
int maxNum = 2;
boolean activeOnly = false;
String reqPackage = null;
boolean csvSepScreenStats = false;
@@ -734,6 +737,20 @@ public final class ProcessStatsService extends IProcessStats.Stub {
dumpHelp(pw);
return;
}
} else if ("--max".equals(arg)) {
i++;
if (i >= args.length) {
pw.println("Error: argument required for --max");
dumpHelp(pw);
return;
}
try {
maxNum = Integer.parseInt(args[i]);
} catch (NumberFormatException e) {
pw.println("Error: --max argument not an int -- " + args[i]);
dumpHelp(pw);
return;
}
} else if ("--active".equals(arg)) {
activeOnly = true;
currentOnly = true;
@@ -892,7 +909,11 @@ public final class ProcessStatsService extends IProcessStats.Stub {
try {
ArrayList<String> files = getCommittedFiles(0, false, !isCheckin);
if (files != null) {
for (int i=0; i<files.size(); i++) {
int start = isCheckin ? 0 : (files.size() - maxNum);
if (start < 0) {
start = 0;
}
for (int i=start; i<files.size(); i++) {
if (DEBUG) Slog.d(TAG, "Retrieving state: " + files.get(i));
try {
AtomicFile file = new AtomicFile(new File(files.get(i)));
@@ -947,19 +968,6 @@ public final class ProcessStatsService extends IProcessStats.Stub {
}
}
if (!isCheckin) {
if (!currentOnly) {
if (sepNeeded) {
pw.println();
}
pw.println("AGGREGATED OVER LAST 24 HOURS:");
dumpAggregatedStats(pw, 24, now, reqPackage, isCompact,
dumpDetails, dumpFullDetails, dumpAll, activeOnly);
pw.println();
pw.println("AGGREGATED OVER LAST 3 HOURS:");
dumpAggregatedStats(pw, 3, now, reqPackage, isCompact,
dumpDetails, dumpFullDetails, dumpAll, activeOnly);
sepNeeded = true;
}
synchronized (mAm) {
if (isCompact) {
mProcessStats.dumpCheckinLocked(pw, reqPackage);
@@ -977,8 +985,21 @@ public final class ProcessStatsService extends IProcessStats.Stub {
} else {
mProcessStats.dumpSummaryLocked(pw, reqPackage, now, activeOnly);
}
sepNeeded = true;
}
}
if (!currentOnly) {
if (sepNeeded) {
pw.println();
}
pw.println("AGGREGATED OVER LAST 24 HOURS:");
dumpAggregatedStats(pw, 24, now, reqPackage, isCompact,
dumpDetails, dumpFullDetails, dumpAll, activeOnly);
pw.println();
pw.println("AGGREGATED OVER LAST 3 HOURS:");
dumpAggregatedStats(pw, 3, now, reqPackage, isCompact,
dumpDetails, dumpFullDetails, dumpAll, activeOnly);
}
}
}
}

View File

@@ -7379,6 +7379,23 @@ public class PackageManagerService extends IPackageManager.Stub {
out.println(Integer.toHexString(System.identityHashCode(filter)));
}
@Override
protected Object filterToLabel(PackageParser.ActivityIntentInfo filter) {
return filter.activity;
}
protected void dumpFilterLabel(PrintWriter out, String prefix, Object label, int count) {
PackageParser.Activity activity = (PackageParser.Activity)label;
out.print(prefix); out.print(
Integer.toHexString(System.identityHashCode(activity)));
out.print(' ');
activity.printComponentShortName(out);
if (count > 1) {
out.print(" ("); out.print(count); out.print(" filters)");
}
out.println();
}
// List<ResolveInfo> filterEnabled(List<ResolveInfo> resolveInfoList) {
// final Iterator<ResolveInfo> i = resolveInfoList.iterator();
// final List<ResolveInfo> retList = Lists.newArrayList();
@@ -7578,6 +7595,23 @@ public class PackageManagerService extends IPackageManager.Stub {
out.println(Integer.toHexString(System.identityHashCode(filter)));
}
@Override
protected Object filterToLabel(PackageParser.ServiceIntentInfo filter) {
return filter.service;
}
protected void dumpFilterLabel(PrintWriter out, String prefix, Object label, int count) {
PackageParser.Service service = (PackageParser.Service)label;
out.print(prefix); out.print(
Integer.toHexString(System.identityHashCode(service)));
out.print(' ');
service.printComponentShortName(out);
if (count > 1) {
out.print(" ("); out.print(count); out.print(" filters)");
}
out.println();
}
// List<ResolveInfo> filterEnabled(List<ResolveInfo> resolveInfoList) {
// final Iterator<ResolveInfo> i = resolveInfoList.iterator();
// final List<ResolveInfo> retList = Lists.newArrayList();
@@ -7785,6 +7819,23 @@ public class PackageManagerService extends IPackageManager.Stub {
out.println(Integer.toHexString(System.identityHashCode(filter)));
}
@Override
protected Object filterToLabel(PackageParser.ProviderIntentInfo filter) {
return filter.provider;
}
protected void dumpFilterLabel(PrintWriter out, String prefix, Object label, int count) {
PackageParser.Provider provider = (PackageParser.Provider)label;
out.print(prefix); out.print(
Integer.toHexString(System.identityHashCode(provider)));
out.print(' ');
provider.printComponentShortName(out);
if (count > 1) {
out.print(" ("); out.print(count); out.print(" filters)");
}
out.println();
}
private final ArrayMap<ComponentName, PackageParser.Provider> mProviders
= new ArrayMap<ComponentName, PackageParser.Provider>();
private int mFlags;
@@ -12555,22 +12606,22 @@ public class PackageManagerService extends IPackageManager.Stub {
if (!checkin && dumpState.isDumping(DumpState.DUMP_RESOLVERS)) {
if (mActivities.dump(pw, dumpState.getTitlePrinted() ? "\nActivity Resolver Table:"
: "Activity Resolver Table:", " ", packageName,
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) {
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS), true)) {
dumpState.setTitlePrinted(true);
}
if (mReceivers.dump(pw, dumpState.getTitlePrinted() ? "\nReceiver Resolver Table:"
: "Receiver Resolver Table:", " ", packageName,
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) {
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS), true)) {
dumpState.setTitlePrinted(true);
}
if (mServices.dump(pw, dumpState.getTitlePrinted() ? "\nService Resolver Table:"
: "Service Resolver Table:", " ", packageName,
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) {
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS), true)) {
dumpState.setTitlePrinted(true);
}
if (mProviders.dump(pw, dumpState.getTitlePrinted() ? "\nProvider Resolver Table:"
: "Provider Resolver Table:", " ", packageName,
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS))) {
dumpState.isOptionEnabled(DumpState.OPTION_SHOW_FILTERS), true)) {
dumpState.setTitlePrinted(true);
}
}
@@ -12583,7 +12634,7 @@ public class PackageManagerService extends IPackageManager.Stub {
dumpState.getTitlePrinted()
? "\nPreferred Activities User " + user + ":"
: "Preferred Activities User " + user + ":", " ",
packageName, true)) {
packageName, true, false)) {
dumpState.setTitlePrinted(true);
}
}
@@ -12676,8 +12727,8 @@ public class PackageManagerService extends IPackageManager.Stub {
mSettings.dumpPackagesLPr(pw, packageName, dumpState, checkin);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_SHARED_USERS)) {
mSettings.dumpSharedUsersLPr(pw, packageName, dumpState);
if (dumpState.isDumping(DumpState.DUMP_SHARED_USERS)) {
mSettings.dumpSharedUsersLPr(pw, packageName, dumpState, checkin);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_INSTALLS) && packageName == null) {

View File

@@ -3608,31 +3608,36 @@ final class Settings {
}
}
void dumpSharedUsersLPr(PrintWriter pw, String packageName, DumpState dumpState) {
void dumpSharedUsersLPr(PrintWriter pw, String packageName, DumpState dumpState,
boolean checkin) {
boolean printedSomething = false;
for (SharedUserSetting su : mSharedUsers.values()) {
if (packageName != null && su != dumpState.getSharedUser()) {
continue;
}
if (!printedSomething) {
if (dumpState.onTitlePrinted())
pw.println();
pw.println("Shared users:");
printedSomething = true;
}
pw.print(" SharedUser [");
pw.print(su.name);
pw.print("] (");
pw.print(Integer.toHexString(System.identityHashCode(su)));
pw.println("):");
pw.print(" userId=");
pw.print(su.userId);
pw.print(" gids=");
pw.println(PackageManagerService.arrayToString(su.gids));
pw.println(" grantedPermissions:");
for (String s : su.grantedPermissions) {
pw.print(" ");
pw.println(s);
if (!checkin) {
if (!printedSomething) {
if (dumpState.onTitlePrinted())
pw.println();
pw.println("Shared users:");
printedSomething = true;
}
pw.print(" SharedUser [");
pw.print(su.name);
pw.print("] (");
pw.print(Integer.toHexString(System.identityHashCode(su)));
pw.println("):");
pw.print(" userId=");
pw.print(su.userId);
pw.print(" gids=");
pw.println(PackageManagerService.arrayToString(su.gids));
pw.println(" grantedPermissions:");
for (String s : su.grantedPermissions) {
pw.print(" ");
pw.println(s);
}
} else {
pw.print("suid,"); pw.print(su.userId); pw.print(","); pw.println(su.name);
}
}
}