From d052a9416ae3f7e42fc1e7de0740021df385ee48 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Fri, 21 Nov 2014 15:23:13 -0800 Subject: [PATCH] Work on issue #18486438: Reduce size of bugreport output Reduce how much stuff ProcessStats spews, and do collapsing of repeated intent filter targets when dumping IntentResolvers. Also add to pm's checkout output to include shared user ids, and fix output formatting in a few places. Change-Id: Ic9fc6731f0439101ba9343535e66cdbbad47e291 --- .../service/wallpaper/WallpaperService.java | 2 +- .../android/internal/app/ProcessStats.java | 6 +- .../com/android/server/IntentResolver.java | 101 ++++++++++++------ .../server/am/ActivityManagerService.java | 2 +- .../server/am/ProcessStatsService.java | 53 ++++++--- .../server/pm/PackageManagerService.java | 65 +++++++++-- .../java/com/android/server/pm/Settings.java | 45 ++++---- 7 files changed, 195 insertions(+), 79 deletions(-) diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index ceaf5f8f6fc35..275dab0f396d3 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -549,7 +549,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()); diff --git a/core/java/com/android/internal/app/ProcessStats.java b/core/java/com/android/internal/app/ProcessStats.java index 1b254866d2acb..70fb51072acf5 100644 --- a/core/java/com/android/internal/app/ProcessStats.java +++ b/core/java/com/android/internal/app/ProcessStats.java @@ -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); diff --git a/services/core/java/com/android/server/IntentResolver.java b/services/core/java/com/android/server/IntentResolver.java index 387eabc85d6b8..cea1ebe2f72ba 100644 --- a/services/core/java/com/android/server/IntentResolver.java +++ b/services/core/java/com/android/server/IntentResolver.java @@ -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 { } boolean dumpMap(PrintWriter out, String titlePrefix, String title, - String prefix, Map map, String packageName, - boolean printFilter) { - String eprefix = prefix + " "; - String fprefix = prefix + " "; + String prefix, ArrayMap map, String packageName, + boolean printFilter, boolean collapseDuplicates) { + final String eprefix = prefix + " "; + final String fprefix = prefix + " "; + final ArrayMap found = new ArrayMap<>(); boolean printedSomething = false; Printer printer = null; - for (Map.Entry e : map.entrySet()) { - F[] a = e.getValue(); + for (int mapi=0; mapi { } 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 { 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 map, String name, F filter) { F[] array = map.get(name); if (array == null) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index f0fb9e627f7c1..c9e7da8863d99 100755 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -13224,7 +13224,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; } diff --git a/services/core/java/com/android/server/am/ProcessStatsService.java b/services/core/java/com/android/server/am/ProcessStatsService.java index bffb5419a70e0..d05910b6addf1 100644 --- a/services/core/java/com/android/server/am/ProcessStatsService.java +++ b/services/core/java/com/android/server/am/ProcessStatsService.java @@ -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] []"); + pw.println(" [--max N] --active] [--commit] [--reset] [--clear] [--write] [-h]"); + pw.println(" []"); 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 files = getCommittedFiles(0, false, !isCheckin); if (files != null) { - for (int i=0; i 1) { + out.print(" ("); out.print(count); out.print(" filters)"); + } + out.println(); + } + // List filterEnabled(List resolveInfoList) { // final Iterator i = resolveInfoList.iterator(); // final List 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 filterEnabled(List resolveInfoList) { // final Iterator i = resolveInfoList.iterator(); // final List 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 mProviders = new ArrayMap(); 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) { diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index f0506a68daa3c..393ebd6916b75 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -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); } } }