Fix #155437855: "dumpsys activity" package filtering doesn't filter everything
Clean up various code paths to correctly use the "packageName" option to
limit its output to only information about that package.
Also do a little re-arranging of the output to cleanup a bit recent
stuff that was added, so the end of the output is still the important
high-level summary of process states.
Bug: 155437855
Test: manually inspected various "dumpsys activity" output.
Change-Id: I2ebe6f7ab3d433281993eb3959d375e2e53e0df9
diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 9edc03e..5df84f2 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -803,7 +803,7 @@
pw.print(" icon=0x"); pw.print(Integer.toHexString(icon));
pw.print(" theme=0x"); pw.println(Integer.toHexString(theme));
pw.println(prefix + "mLastReportedConfigurations:");
- mLastReportedConfiguration.dump(pw, prefix + " ");
+ mLastReportedConfiguration.dump(pw, prefix + " ");
pw.print(prefix); pw.print("CurrentConfiguration="); pw.println(getConfiguration());
if (!getRequestedOverrideConfiguration().equals(EMPTY)) {
@@ -839,7 +839,7 @@
pw.print(" iconFilename="); pw.print(taskDescription.getIconFilename());
pw.print(" primaryColor=");
pw.println(Integer.toHexString(taskDescription.getPrimaryColor()));
- pw.print(prefix + " backgroundColor=");
+ pw.print(prefix); pw.print(" backgroundColor=");
pw.print(Integer.toHexString(taskDescription.getBackgroundColor()));
pw.print(" statusBarColor=");
pw.print(Integer.toHexString(taskDescription.getStatusBarColor()));
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 68c6627..d71381e 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -162,6 +162,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
/**
@@ -2802,67 +2803,91 @@
}
boolean dump(FileDescriptor fd, PrintWriter pw, boolean dumpAll, boolean dumpClient,
- String dumpPackage, boolean needSep) {
- pw.println(" Stack #" + getRootTaskId()
- + ": type=" + activityTypeToString(getActivityType())
- + " mode=" + windowingModeToString(getWindowingMode()));
- pw.println(" isSleeping=" + shouldSleepActivities());
- pw.println(" mBounds=" + getRequestedOverrideBounds());
-
- boolean printed = dumpActivities(fd, pw, dumpAll, dumpClient, dumpPackage, needSep);
-
- needSep = printed;
- boolean pr = printThisActivity(pw, mPausingActivity, dumpPackage, needSep,
- " mPausingActivity: ");
- if (pr) {
- printed = true;
- needSep = false;
- }
- pr = printThisActivity(pw, getResumedActivity(), dumpPackage, needSep,
- " mResumedActivity: ");
- if (pr) {
- printed = true;
- needSep = false;
- }
- if (dumpAll) {
- pr = printThisActivity(pw, mLastPausedActivity, dumpPackage, needSep,
- " mLastPausedActivity: ");
- if (pr) {
- printed = true;
- needSep = true;
+ String dumpPackage, final boolean needSep) {
+ Runnable headerPrinter = () -> {
+ if (needSep) {
+ pw.println();
}
- printed |= printThisActivity(pw, mLastNoHistoryActivity, dumpPackage,
- needSep, " mLastNoHistoryActivity: ");
+ pw.println(" Stack #" + getRootTaskId()
+ + ": type=" + activityTypeToString(getActivityType())
+ + " mode=" + windowingModeToString(getWindowingMode()));
+ pw.println(" isSleeping=" + shouldSleepActivities());
+ pw.println(" mBounds=" + getRequestedOverrideBounds());
+ };
+
+ boolean printed = false;
+
+ if (dumpPackage == null) {
+ // If we are not filtering by package, we want to print absolutely everything,
+ // so always print the header even if there are no tasks/activities inside.
+ headerPrinter.run();
+ headerPrinter = null;
+ printed = true;
}
+
+ printed |= printThisActivity(pw, mPausingActivity, dumpPackage, false,
+ " mPausingActivity: ", null);
+ printed |= printThisActivity(pw, getResumedActivity(), dumpPackage, false,
+ " mResumedActivity: ", null);
+ if (dumpAll) {
+ printed |= printThisActivity(pw, mLastPausedActivity, dumpPackage, false,
+ " mLastPausedActivity: ", null);
+ printed |= printThisActivity(pw, mLastNoHistoryActivity, dumpPackage,
+ false, " mLastNoHistoryActivity: ", null);
+ }
+
+ printed |= dumpActivities(fd, pw, dumpAll, dumpClient, dumpPackage, false, headerPrinter);
+
return printed;
}
private boolean dumpActivities(FileDescriptor fd, PrintWriter pw, boolean dumpAll,
- boolean dumpClient, String dumpPackage, boolean needSep) {
+ boolean dumpClient, String dumpPackage, boolean needSep, Runnable header) {
if (!hasChild()) {
return false;
}
- final String prefix = " ";
+ final AtomicBoolean printedHeader = new AtomicBoolean(false);
+ final AtomicBoolean printed = new AtomicBoolean(false);
forAllLeafTasks((task) -> {
- if (needSep) {
- pw.println("");
+ final String prefix = " ";
+ Runnable headerPrinter = () -> {
+ printed.set(true);
+ if (!printedHeader.get()) {
+ if (needSep) {
+ pw.println("");
+ }
+ if (header != null) {
+ header.run();
+ }
+ printedHeader.set(true);
+ }
+ pw.print(prefix); pw.print("* "); pw.println(task);
+ pw.print(prefix); pw.print(" mBounds=");
+ pw.println(task.getRequestedOverrideBounds());
+ pw.print(prefix); pw.print(" mMinWidth="); pw.print(task.mMinWidth);
+ pw.print(" mMinHeight="); pw.println(task.mMinHeight);
+ if (mLastNonFullscreenBounds != null) {
+ pw.print(prefix);
+ pw.print(" mLastNonFullscreenBounds=");
+ pw.println(task.mLastNonFullscreenBounds);
+ }
+ task.dump(pw, prefix + " ");
+ };
+ if (dumpPackage == null) {
+ // If we are not filtering by package, we want to print absolutely everything,
+ // so always print the header even if there are no activities inside.
+ headerPrinter.run();
+ headerPrinter = null;
}
- pw.println(prefix + "Task id #" + task.mTaskId);
- pw.println(prefix + "mBounds=" + task.getRequestedOverrideBounds());
- pw.println(prefix + "mMinWidth=" + task.mMinWidth);
- pw.println(prefix + "mMinHeight=" + task.mMinHeight);
- pw.println(prefix + "mLastNonFullscreenBounds=" + task.mLastNonFullscreenBounds);
- pw.println(prefix + "* " + task);
- task.dump(pw, prefix + " ");
final ArrayList<ActivityRecord> activities = new ArrayList<>();
// Add activities by traversing the hierarchy from bottom to top, since activities
// are dumped in reverse order in {@link ActivityStackSupervisor#dumpHistoryList()}.
task.forAllActivities((Consumer<ActivityRecord>) activities::add,
false /* traverseTopToBottom */);
dumpHistoryList(fd, pw, activities, prefix, "Hist", true, !dumpAll, dumpClient,
- dumpPackage, false, null, task);
+ dumpPackage, false, headerPrinter, task);
}, true /* traverseTopToBottom */);
- return true;
+ return printed.get();
}
ArrayList<ActivityRecord> getDumpActivitiesLocked(String name) {
diff --git a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
index 6f0a339..f692660 100644
--- a/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityStackSupervisor.java
@@ -1937,12 +1937,15 @@
}
static boolean printThisActivity(PrintWriter pw, ActivityRecord activity, String dumpPackage,
- boolean needSep, String prefix) {
+ boolean needSep, String prefix, Runnable header) {
if (activity != null) {
if (dumpPackage == null || dumpPackage.equals(activity.packageName)) {
if (needSep) {
pw.println();
}
+ if (header != null) {
+ header.run();
+ }
pw.print(prefix);
pw.println(activity);
return true;
@@ -1953,7 +1956,7 @@
static boolean dumpHistoryList(FileDescriptor fd, PrintWriter pw, List<ActivityRecord> list,
String prefix, String label, boolean complete, boolean brief, boolean client,
- String dumpPackage, boolean needNL, String header, Task lastTask) {
+ String dumpPackage, boolean needNL, Runnable header, Task lastTask) {
String innerPrefix = null;
String[] args = null;
boolean printed = false;
@@ -1973,7 +1976,7 @@
needNL = false;
}
if (header != null) {
- pw.println(header);
+ header.run();
header = null;
}
if (lastTask != r.getTask()) {
diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java
index 7fad395..dfa3fe0 100644
--- a/services/core/java/com/android/server/wm/ActivityStartController.java
+++ b/services/core/java/com/android/server/wm/ActivityStartController.java
@@ -549,19 +549,28 @@
return mPendingRemoteAnimationRegistry;
}
- void dump(PrintWriter pw, String prefix, String dumpPackage) {
+ void dumpLastHomeActivityStartResult(PrintWriter pw, String prefix) {
pw.print(prefix);
pw.print("mLastHomeActivityStartResult=");
pw.println(mLastHomeActivityStartResult);
+ }
- if (mLastHomeActivityStartRecord != null) {
+ void dump(PrintWriter pw, String prefix, String dumpPackage) {
+ boolean dumped = false;
+
+ final boolean dumpPackagePresent = dumpPackage != null;
+
+ if (mLastHomeActivityStartRecord != null && (!dumpPackagePresent
+ || dumpPackage.equals(mLastHomeActivityStartRecord.packageName))) {
+ if (!dumped) {
+ dumped = true;
+ dumpLastHomeActivityStartResult(pw, prefix);
+ }
pw.print(prefix);
pw.println("mLastHomeActivityStartRecord:");
mLastHomeActivityStartRecord.dump(pw, prefix + " ", true /* dumpAll */);
}
- final boolean dumpPackagePresent = dumpPackage != null;
-
if (mLastStarter != null) {
final boolean dump = !dumpPackagePresent
|| mLastStarter.relatedToPackage(dumpPackage)
@@ -569,6 +578,10 @@
&& dumpPackage.equals(mLastHomeActivityStartRecord.packageName));
if (dump) {
+ if (!dumped) {
+ dumped = true;
+ dumpLastHomeActivityStartResult(pw, prefix);
+ }
pw.print(prefix);
mLastStarter.dump(pw, prefix + " ");
@@ -578,7 +591,7 @@
}
}
- if (dumpPackagePresent) {
+ if (!dumped) {
pw.print(prefix);
pw.println("(nothing)");
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 511baa5..6a8d5d9 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -4926,7 +4926,7 @@
boolean printed = ActivityStackSupervisor.printThisActivity(pw,
mRootWindowContainer.getTopResumedActivity(), dumpPackage, needSep,
- " ResumedActivity: ");
+ " ResumedActivity: ", null);
if (printed) {
printedAnything = true;
needSep = false;
diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java
index 09700c5..ccd51de 100644
--- a/services/core/java/com/android/server/wm/RecentTasks.java
+++ b/services/core/java/com/android/server/wm/RecentTasks.java
@@ -1718,9 +1718,31 @@
final int size = mTasks.size();
for (int i = 0; i < size; i++) {
final Task task = mTasks.get(i);
- if (dumpPackage != null && (task.realActivity == null ||
- !dumpPackage.equals(task.realActivity.getPackageName()))) {
- continue;
+ if (dumpPackage != null) {
+ boolean match = task.intent != null
+ && task.intent.getComponent() != null
+ && dumpPackage.equals(
+ task.intent.getComponent().getPackageName());
+ if (!match) {
+ match |= task.affinityIntent != null
+ && task.affinityIntent.getComponent() != null
+ && dumpPackage.equals(
+ task.affinityIntent.getComponent().getPackageName());
+ }
+ if (!match) {
+ match |= task.origActivity != null
+ && dumpPackage.equals(task.origActivity.getPackageName());
+ }
+ if (!match) {
+ match |= task.realActivity != null
+ && dumpPackage.equals(task.realActivity.getPackageName());
+ }
+ if (!match) {
+ match |= dumpPackage.equals(task.mCallingPackage);
+ }
+ if (!match) {
+ continue;
+ }
}
if (!printedHeader) {
@@ -1743,6 +1765,31 @@
0, true /* getTasksAllowed */, mService.getCurrentUserId(), SYSTEM_UID);
for (int i = 0; i < tasks.size(); i++) {
final ActivityManager.RecentTaskInfo taskInfo = tasks.get(i);
+ if (dumpPackage != null) {
+ boolean match = taskInfo.baseIntent != null
+ && taskInfo.baseIntent.getComponent() != null
+ && dumpPackage.equals(
+ taskInfo.baseIntent.getComponent().getPackageName());
+ if (!match) {
+ match |= taskInfo.baseActivity != null
+ && dumpPackage.equals(taskInfo.baseActivity.getPackageName());
+ }
+ if (!match) {
+ match |= taskInfo.topActivity != null
+ && dumpPackage.equals(taskInfo.topActivity.getPackageName());
+ }
+ if (!match) {
+ match |= taskInfo.origActivity != null
+ && dumpPackage.equals(taskInfo.origActivity.getPackageName());
+ }
+ if (!match) {
+ match |= taskInfo.realActivity != null
+ && dumpPackage.equals(taskInfo.realActivity.getPackageName());
+ }
+ if (!match) {
+ continue;
+ }
+ }
if (!printedHeader) {
if (printedAnything) {
// Separate from the last block if it printed
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 77841dc..a691736 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -3602,31 +3602,40 @@
boolean needSep = false;
for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
DisplayContent displayContent = getChildAt(displayNdx);
+ if (printed) {
+ pw.println();
+ }
pw.print("Display #"); pw.print(displayContent.mDisplayId);
pw.println(" (activities from top to bottom):");
for (int tdaNdx = displayContent.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) {
final TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(tdaNdx);
for (int sNdx = taskDisplayArea.getStackCount() - 1; sNdx >= 0; --sNdx) {
final ActivityStack stack = taskDisplayArea.getStackAt(sNdx);
- pw.println();
- printed = stack.dump(fd, pw, dumpAll, dumpClient, dumpPackage, needSep);
- needSep = printed;
+ if (needSep) {
+ pw.println();
+ }
+ needSep = stack.dump(fd, pw, dumpAll, dumpClient, dumpPackage, false);
+ printed |= needSep;
}
}
- pw.println(" (resumed activities in task display areas from top to bottom):");
for (int tdaNdx = displayContent.getTaskDisplayAreaCount() - 1; tdaNdx >= 0; --tdaNdx) {
final TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(tdaNdx);
- printThisActivity(pw, taskDisplayArea.getFocusedActivity(), dumpPackage, needSep,
- " ResumedActivity:");
+ printed |= printThisActivity(pw, taskDisplayArea.getFocusedActivity(),
+ dumpPackage, needSep, " Resumed: ", () -> {
+ pw.println(" Resumed activities in task display areas"
+ + " (from top to bottom):");
+ });
}
}
printed |= dumpHistoryList(fd, pw, mStackSupervisor.mFinishingActivities, " ",
"Fin", false, !dumpAll,
- false, dumpPackage, true, " Activities waiting to finish:", null);
+ false, dumpPackage, true,
+ () -> { pw.println(" Activities waiting to finish:"); }, null);
printed |= dumpHistoryList(fd, pw, mStackSupervisor.mStoppingActivities, " ",
"Stop", false, !dumpAll,
- false, dumpPackage, true, " Activities waiting to stop:", null);
+ false, dumpPackage, true,
+ () -> { pw.println(" Activities waiting to stop:"); }, null);
return printed;
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 8f8ca77..6c872a6 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -3875,11 +3875,12 @@
pw.print(prefix); pw.print("mRootProcess="); pw.println(mRootProcess);
}
pw.print(prefix); pw.print("taskId=" + mTaskId); pw.println(" stackId=" + getRootTaskId());
- pw.print(prefix + "mHasBeenVisible=" + getHasBeenVisible());
- pw.print(" mResizeMode=" + ActivityInfo.resizeModeToString(mResizeMode));
- pw.print(" mSupportsPictureInPicture=" + mSupportsPictureInPicture);
- pw.print(" isResizeable=" + isResizeable());
- pw.print(" lastActiveTime=" + lastActiveTime);
+ pw.print(prefix); pw.print("mHasBeenVisible="); pw.println(getHasBeenVisible());
+ pw.print(prefix); pw.print("mResizeMode=");
+ pw.print(ActivityInfo.resizeModeToString(mResizeMode));
+ pw.print(" mSupportsPictureInPicture="); pw.print(mSupportsPictureInPicture);
+ pw.print(" isResizeable="); pw.println(isResizeable());
+ pw.print(prefix); pw.print("lastActiveTime="); pw.print(lastActiveTime);
pw.println(" (inactive for " + (getInactiveDuration() / 1000) + "s)");
}