diff options
6 files changed, 94 insertions, 33 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index cd929c1883d0..ddd3b479c90a 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -10828,8 +10828,12 @@ public class ActivityManagerService extends IActivityManager.Stub opti++; } synchronized (this) { + // TODO: b/361161826 - Always pass in the dumpAll and let + // BroadcastController decide how to treat it. + final boolean requestDumpAll = "filter".equals(dumpPackage) + ? dumpAll : true; mBroadcastController.dumpBroadcastsLocked(fd, pw, args, opti, - /* dumpAll= */ true, dumpPackage); + requestDumpAll, dumpPackage); } } else if ("broadcast-stats".equals(cmd)) { if (opti < args.length) { diff --git a/services/core/java/com/android/server/am/BroadcastController.java b/services/core/java/com/android/server/am/BroadcastController.java index aa06b7ecf76c..fe0cbbd960a8 100644 --- a/services/core/java/com/android/server/am/BroadcastController.java +++ b/services/core/java/com/android/server/am/BroadcastController.java @@ -2178,6 +2178,8 @@ class BroadcastController { boolean printedAnything = false; boolean onlyReceivers = false; int filteredUid = Process.INVALID_UID; + boolean onlyFilter = false; + String dumpIntentAction = null; if ("history".equals(dumpPackage)) { if (opti < args.length && "-s".equals(args[opti])) { @@ -2185,8 +2187,7 @@ class BroadcastController { } onlyHistory = true; dumpPackage = null; - } - if ("receivers".equals(dumpPackage)) { + } else if ("receivers".equals(dumpPackage)) { onlyReceivers = true; dumpPackage = null; if (opti + 2 <= args.length) { @@ -2205,7 +2206,23 @@ class BroadcastController { } } } + } else if ("filter".equals(dumpPackage)) { + onlyFilter = true; + dumpPackage = null; + if (opti + 2 <= args.length) { + if ("--action".equals(args[opti++])) { + dumpIntentAction = args[opti++]; + if (dumpIntentAction == null) { + pw.printf("Missing argument for --action option\n"); + return; + } + } else { + pw.printf("Unknown argument: %s\n", args[opti]); + return; + } + } } + if (DEBUG_BROADCAST) { Slogf.d(TAG_BROADCAST, "dumpBroadcastsLocked(): dumpPackage=%s, onlyHistory=%b, " + "onlyReceivers=%b, filteredUid=%d", dumpPackage, onlyHistory, @@ -2213,7 +2230,7 @@ class BroadcastController { } pw.println("ACTIVITY MANAGER BROADCAST STATE (dumpsys activity broadcasts)"); - if (!onlyHistory && dumpAll) { + if (!onlyHistory && !onlyFilter && dumpAll) { if (mRegisteredReceivers.size() > 0) { boolean printed = false; Iterator it = mRegisteredReceivers.values().iterator(); @@ -2257,14 +2274,14 @@ class BroadcastController { if (!onlyReceivers) { needSep = mBroadcastQueue.dumpLocked(fd, pw, args, opti, - dumpConstants, dumpHistory, dumpAll, dumpPackage, needSep); + dumpConstants, dumpHistory, dumpAll, dumpPackage, dumpIntentAction, needSep); printedAnything |= needSep; } needSep = true; synchronized (mStickyBroadcasts) { - if (!onlyHistory && !onlyReceivers && mStickyBroadcasts != null + if (!onlyHistory && !onlyReceivers && !onlyFilter && mStickyBroadcasts != null && dumpPackage == null) { for (int user = 0; user < mStickyBroadcasts.size(); user++) { if (needSep) { @@ -2312,13 +2329,12 @@ class BroadcastController { } } - if (!onlyHistory && !onlyReceivers && dumpAll) { + if (!onlyHistory && !onlyReceivers && !onlyFilter && dumpAll) { pw.println(); - pw.println(" Queue " + mBroadcastQueue.toString() + ": " + pw.println(" Queue " + mBroadcastQueue + ": " + mBroadcastQueue.describeStateLocked()); pw.println(" mHandler:"); mService.mHandler.dump(new PrintWriterPrinter(pw), " "); - needSep = true; printedAnything = true; } diff --git a/services/core/java/com/android/server/am/BroadcastHistory.java b/services/core/java/com/android/server/am/BroadcastHistory.java index d6e3d4336e8e..6ddf60b369e6 100644 --- a/services/core/java/com/android/server/am/BroadcastHistory.java +++ b/services/core/java/com/android/server/am/BroadcastHistory.java @@ -29,6 +29,7 @@ import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.Objects; /** * Collection of recent historical broadcasts that are available to be dumped @@ -163,10 +164,11 @@ public class BroadcastHistory { @NeverCompile public boolean dumpLocked(@NonNull PrintWriter pw, @Nullable String dumpPackage, - @NonNull String queueName, @NonNull SimpleDateFormat sdf, - boolean dumpAll, boolean needSep) { - dumpBroadcastList(pw, sdf, mFrozenBroadcasts, "Frozen"); - dumpBroadcastList(pw, sdf, mPendingBroadcasts, "Pending"); + @Nullable String dumpIntentAction, @NonNull String queueName, + @NonNull SimpleDateFormat sdf, boolean dumpAll) { + boolean needSep = true; + dumpBroadcastList(pw, sdf, mFrozenBroadcasts, dumpIntentAction, dumpAll, "Frozen"); + dumpBroadcastList(pw, sdf, mPendingBroadcasts, dumpIntentAction, dumpAll, "Pending"); int i; boolean printed = false; @@ -187,6 +189,10 @@ public class BroadcastHistory { if (dumpPackage != null && !dumpPackage.equals(r.callerPackage)) { continue; } + if (dumpIntentAction != null && !Objects.equals(dumpIntentAction, + r.intent.getAction())) { + continue; + } if (!printed) { if (needSep) { pw.println(); @@ -195,9 +201,16 @@ public class BroadcastHistory { pw.println(" Historical broadcasts [" + queueName + "]:"); printed = true; } - if (dumpAll) { + if (dumpIntentAction != null) { + pw.print(" Historical Broadcast " + queueName + " #"); + pw.print(i); pw.println(":"); + r.dump(pw, " ", sdf); + if (!dumpAll) { + break; + } + } else if (dumpAll) { pw.print(" Historical Broadcast " + queueName + " #"); - pw.print(i); pw.println(":"); + pw.print(i); pw.println(":"); r.dump(pw, " ", sdf); } else { pw.print(" #"); pw.print(i); pw.print(": "); pw.println(r); @@ -213,7 +226,7 @@ public class BroadcastHistory { } } while (ringIndex != lastIndex); - if (dumpPackage == null) { + if (dumpPackage == null && dumpIntentAction == null) { lastIndex = ringIndex = mSummaryHistoryNext; if (dumpAll) { printed = false; @@ -276,15 +289,28 @@ public class BroadcastHistory { } private void dumpBroadcastList(@NonNull PrintWriter pw, @NonNull SimpleDateFormat sdf, - @NonNull ArrayList<BroadcastRecord> broadcasts, @NonNull String flavor) { + @NonNull ArrayList<BroadcastRecord> broadcasts, @Nullable String dumpIntentAction, + boolean dumpAll, @NonNull String flavor) { pw.print(" "); pw.print(flavor); pw.println(" broadcasts:"); if (broadcasts.isEmpty()) { pw.println(" <empty>"); } else { + boolean printedAnything = false; for (int idx = broadcasts.size() - 1; idx >= 0; --idx) { final BroadcastRecord r = broadcasts.get(idx); + if (dumpIntentAction != null && !Objects.equals(dumpIntentAction, + r.intent.getAction())) { + continue; + } pw.print(flavor); pw.print(" broadcast #"); pw.print(idx); pw.println(":"); r.dump(pw, " ", sdf); + printedAnything = true; + if (dumpIntentAction != null && !dumpAll) { + break; + } + } + if (!printedAnything) { + pw.println(" <no-matches>"); } } } diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 6386af673e8b..a7d74a9fe54a 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -264,7 +264,8 @@ public abstract class BroadcastQueue { @GuardedBy("mService") public abstract boolean dumpLocked(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args, int opti, boolean dumpConstants, boolean dumpHistory, - boolean dumpAll, @Nullable String dumpPackage, boolean needSep); + boolean dumpAll, @Nullable String dumpPackage, @Nullable String dumpIntentAction, + boolean needSep); /** * Execute {@link #dumpLocked} and store the output into @@ -276,7 +277,7 @@ public abstract class BroadcastQueue { PrintWriter pw = new PrintWriter(out)) { pw.print("Message: "); pw.println(msg); - dumpLocked(fd, pw, null, 0, false, false, false, null, false); + dumpLocked(fd, pw, null, 0, false, false, false, null, null, false); pw.flush(); } }, DropBoxManager.IS_TEXT); diff --git a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java index 9e4666cca140..398cf260949d 100644 --- a/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java +++ b/services/core/java/com/android/server/am/BroadcastQueueModernImpl.java @@ -2417,12 +2417,33 @@ class BroadcastQueueModernImpl extends BroadcastQueue { @GuardedBy("mService") public boolean dumpLocked(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args, int opti, boolean dumpConstants, boolean dumpHistory, - boolean dumpAll, @Nullable String dumpPackage, boolean needSep) { + boolean dumpAll, @Nullable String dumpPackage, @Nullable String dumpIntentAction, + boolean needSep) { final long now = SystemClock.uptimeMillis(); final IndentingPrintWriter ipw = new IndentingPrintWriter(pw); ipw.increaseIndent(); ipw.println(); + if (dumpIntentAction == null) { + dumpProcessQueues(ipw, now); + dumpBroadcastsWithIgnoredPolicies(ipw); + dumpForegroundUids(ipw); + + if (dumpConstants) { + mFgConstants.dump(ipw); + mBgConstants.dump(ipw); + } + } + + if (dumpHistory) { + final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + needSep = mHistory.dumpLocked(ipw, dumpPackage, dumpIntentAction, mQueueName, + sdf, dumpAll); + } + return needSep; + } + + private void dumpProcessQueues(@NonNull IndentingPrintWriter ipw, @UptimeMillisLong long now) { ipw.println("📋 Per-process queues:"); ipw.increaseIndent(); for (int i = 0; i < mProcessQueues.size(); i++) { @@ -2470,28 +2491,21 @@ class BroadcastQueueModernImpl extends BroadcastQueue { } ipw.decreaseIndent(); ipw.println(); + } + private void dumpBroadcastsWithIgnoredPolicies(@NonNull IndentingPrintWriter ipw) { ipw.println("Broadcasts with ignored delivery group policies:"); ipw.increaseIndent(); mService.dumpDeliveryGroupPolicyIgnoredActions(ipw); ipw.decreaseIndent(); ipw.println(); + } + private void dumpForegroundUids(@NonNull IndentingPrintWriter ipw) { ipw.println("Foreground UIDs:"); ipw.increaseIndent(); ipw.println(mUidForeground); ipw.decreaseIndent(); ipw.println(); - - if (dumpConstants) { - mFgConstants.dump(ipw); - mBgConstants.dump(ipw); - } - - if (dumpHistory) { - final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); - needSep = mHistory.dumpLocked(ipw, dumpPackage, mQueueName, sdf, dumpAll, needSep); - } - return needSep; } } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java index ea80f283793e..db6aeebecce7 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/BroadcastQueueTest.java @@ -602,7 +602,7 @@ public class BroadcastQueueTest extends BaseBroadcastQueueTest { mQueue.dumpDebug(new ProtoOutputStream(), ActivityManagerServiceDumpBroadcastsProto.BROADCAST_QUEUE); mQueue.dumpLocked(FileDescriptor.err, new PrintWriter(Writer.nullWriter()), - null, 0, true, true, true, null, false); + null, 0, true, true, true, null, null, false); mQueue.dumpToDropBoxLocked(TAG); BroadcastQueue.logv(TAG); @@ -1019,7 +1019,7 @@ public class BroadcastQueueTest extends BaseBroadcastQueueTest { mQueue.dumpDebug(new ProtoOutputStream(), ActivityManagerServiceDumpBroadcastsProto.BROADCAST_QUEUE); mQueue.dumpLocked(FileDescriptor.err, new PrintWriter(Writer.nullWriter()), - null, 0, true, true, true, null, false); + null, 0, true, true, true, null, null, false); } waitForIdle(); |