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/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index d1b6efd..49cc621 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -1719,31 +1719,50 @@
configuration.windowConfiguration.getActivityType());
pw.println(); pw.print(" ");
- pw.print(" id=" + persistentId);
- pw.print(" stackId=" + stackId);
- pw.print(" userId=" + userId);
- pw.print(" hasTask=" + (id != -1));
- pw.print(" lastActiveTime=" + lastActiveTime);
- pw.println(); pw.print(" ");
- pw.print(" baseIntent=" + baseIntent);
- pw.println(); pw.print(" ");
- pw.print(" isExcluded="
- + ((baseIntent.getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0));
- pw.print(" activityType=" + activityType);
- pw.print(" windowingMode=" + windowingMode);
- pw.print(" supportsSplitScreenMultiWindow=" + supportsSplitScreenMultiWindow);
+ pw.print(" id="); pw.print(persistentId);
+ pw.print(" stackId="); pw.print(stackId);
+ pw.print(" userId="); pw.print(userId);
+ pw.print(" hasTask="); pw.print((id != -1));
+ pw.print(" lastActiveTime="); pw.println(lastActiveTime);
+ pw.print(" "); pw.print(" baseIntent="); pw.println(baseIntent);
+ if (baseActivity != null) {
+ pw.print(" "); pw.print(" baseActivity=");
+ pw.println(baseActivity.toShortString());
+ }
+ if (topActivity != null) {
+ pw.print(" "); pw.print(" topActivity="); pw.println(topActivity.toShortString());
+ }
+ if (origActivity != null) {
+ pw.print(" "); pw.print(" origActivity=");
+ pw.println(origActivity.toShortString());
+ }
+ if (realActivity != null) {
+ pw.print(" "); pw.print(" realActivity=");
+ pw.println(realActivity.toShortString());
+ }
+ pw.print(" ");
+ pw.print(" isExcluded=");
+ pw.print(((baseIntent.getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) != 0));
+ pw.print(" activityType="); pw.print(activityType);
+ pw.print(" windowingMode="); pw.print(windowingMode);
+ pw.print(" supportsSplitScreenMultiWindow=");
+ pw.println(supportsSplitScreenMultiWindow);
if (taskDescription != null) {
- pw.println(); pw.print(" ");
+ pw.print(" ");
final ActivityManager.TaskDescription td = taskDescription;
pw.print(" taskDescription {");
- pw.print(" colorBackground=#" + Integer.toHexString(td.getBackgroundColor()));
- pw.print(" colorPrimary=#" + Integer.toHexString(td.getPrimaryColor()));
- pw.print(" iconRes=" + td.getIconResourcePackage() + "/" + td.getIconResource());
- pw.print(" iconBitmap=" + (td.getIconFilename() != null
- || td.getInMemoryIcon() != null));
- pw.print(" resizeMode=" + ActivityInfo.resizeModeToString(td.getResizeMode()));
- pw.print(" minWidth=" + td.getMinWidth());
- pw.print(" minHeight=" + td.getMinHeight());
+ pw.print(" colorBackground=#");
+ pw.print(Integer.toHexString(td.getBackgroundColor()));
+ pw.print(" colorPrimary=#");
+ pw.print(Integer.toHexString(td.getPrimaryColor()));
+ pw.print(" iconRes=");
+ pw.print(td.getIconResourcePackage() + "/" + td.getIconResource());
+ pw.print(" iconBitmap=");
+ pw.print(td.getIconFilename() != null || td.getInMemoryIcon() != null);
+ pw.print(" resizeMode=");
+ pw.print(ActivityInfo.resizeModeToString(td.getResizeMode()));
+ pw.print(" minWidth="); pw.print(td.getMinWidth());
+ pw.print(" minHeight="); pw.print(td.getMinHeight());
pw.println(" }");
}
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 0bd134c..8d35152 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -10535,12 +10535,14 @@
}
mAtmInternal.dump(
DUMP_STARTER_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
- pw.println();
- if (dumpAll) {
- pw.println("-------------------------------------------------------------------------------");
+ if (dumpPackage == null) {
+ pw.println();
+ if (dumpAll) {
+ pw.println("-------------------------------------------------------------------------------");
+ }
+ mAtmInternal.dump(
+ DUMP_CONTAINERS_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
}
- mAtmInternal.dump(
- DUMP_CONTAINERS_CMD, fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
// Activities section is dumped as part of the Critical priority dump. Exclude the
// section if priority is Normal.
if (!dumpNormalPriority) {
@@ -10558,6 +10560,11 @@
}
dumpAssociationsLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage);
}
+ pw.println();
+ if (dumpAll) {
+ pw.println("-------------------------------------------------------------------------------");
+ }
+ mProcessList.mAppExitInfoTracker.dumpHistoryProcessExitInfo(pw, dumpPackage);
if (dumpPackage == null) {
pw.println();
if (dumpAll) {
@@ -10574,17 +10581,6 @@
if (dumpAll) {
pw.println("-------------------------------------------------------------------------------");
}
- dumpLruLocked(pw, dumpPackage);
- pw.println();
- if (dumpAll) {
- pw.println("-------------------------------------------------------------------------------");
- }
- mProcessList.mAppExitInfoTracker.dumpHistoryProcessExitInfo(pw, dumpPackage);
- pw.println();
- if (dumpAll) {
- pw.println("-------------------------------------------------------------------"
- + "------------");
- }
dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage, dumpAppId);
pw.println();
if (dumpAll) {
@@ -10788,7 +10784,7 @@
}
} else if ("oom".equals(cmd) || "o".equals(cmd)) {
synchronized (this) {
- dumpOomLocked(fd, pw, args, opti, true);
+ dumpOomLocked(fd, pw, false, args, opti, true, dumpPackage, true);
}
} else if ("lmk".equals(cmd)) {
synchronized (this) {
@@ -10796,11 +10792,11 @@
}
} else if ("lru".equals(cmd)) {
synchronized (this) {
- dumpLruLocked(pw, null);
+ dumpLruLocked(pw, dumpPackage, null);
}
} else if ("permissions".equals(cmd) || "perm".equals(cmd)) {
synchronized (this) {
- dumpPermissionsLocked(fd, pw, args, opti, true, null);
+ dumpPermissionsLocked(fd, pw, args, opti, true, dumpPackage);
}
} else if ("provider".equals(cmd)) {
String[] newArgs;
@@ -10820,7 +10816,7 @@
}
} else if ("providers".equals(cmd) || "prov".equals(cmd)) {
synchronized (this) {
- dumpProvidersLocked(fd, pw, args, opti, true, null);
+ dumpProvidersLocked(fd, pw, args, opti, true, dumpPackage);
}
} else if ("service".equals(cmd)) {
String[] newArgs;
@@ -11106,8 +11102,9 @@
" Counts of Binder Proxies held by SYSTEM");
}
- void dumpLruEntryLocked(PrintWriter pw, int index, ProcessRecord proc) {
- pw.print(" #");
+ void dumpLruEntryLocked(PrintWriter pw, int index, ProcessRecord proc, String prefix) {
+ pw.print(prefix);
+ pw.print("#");
pw.print(index);
pw.print(": ");
pw.print(ProcessList.makeOomAdjString(proc.setAdj, false));
@@ -11149,9 +11146,29 @@
}
// TODO: Move to ProcessList?
- void dumpLruLocked(PrintWriter pw, String dumpPackage) {
- pw.println("ACTIVITY MANAGER LRU PROCESSES (dumpsys activity lru)");
+ boolean dumpLruLocked(PrintWriter pw, String dumpPackage, String prefix) {
final int N = mProcessList.mLruProcesses.size();
+ final String innerPrefix;
+ if (prefix == null) {
+ pw.println("ACTIVITY MANAGER LRU PROCESSES (dumpsys activity lru)");
+ innerPrefix = " ";
+ } else {
+ boolean haveAny = false;
+ for (int i = N - 1; i >= 0; i--) {
+ final ProcessRecord r = mProcessList.mLruProcesses.get(i);
+ if (dumpPackage != null && !r.pkgList.containsKey(dumpPackage)) {
+ continue;
+ }
+ haveAny = true;
+ break;
+ }
+ if (!haveAny) {
+ return false;
+ }
+ pw.print(prefix);
+ pw.println("Raw LRU list (dumpsys activity lru):");
+ innerPrefix = prefix + " ";
+ }
int i;
boolean first = true;
for (i = N - 1; i >= mProcessList.mLruProcessActivityStart; i--) {
@@ -11160,10 +11177,11 @@
continue;
}
if (first) {
- pw.println(" Activities:");
+ pw.print(innerPrefix);
+ pw.println("Activities:");
first = false;
}
- dumpLruEntryLocked(pw, i, r);
+ dumpLruEntryLocked(pw, i, r, innerPrefix);
}
first = true;
for (; i >= mProcessList.mLruProcessServiceStart; i--) {
@@ -11172,10 +11190,11 @@
continue;
}
if (first) {
- pw.println(" Services:");
+ pw.print(innerPrefix);
+ pw.println("Services:");
first = false;
}
- dumpLruEntryLocked(pw, i, r);
+ dumpLruEntryLocked(pw, i, r, innerPrefix);
}
first = true;
for (; i >= 0; i--) {
@@ -11184,11 +11203,13 @@
continue;
}
if (first) {
- pw.println(" Other:");
+ pw.print(innerPrefix);
+ pw.println("Other:");
first = false;
}
- dumpLruEntryLocked(pw, i, r);
+ dumpLruEntryLocked(pw, i, r, innerPrefix);
}
+ return true;
}
// TODO: Move to ProcessList?
@@ -11200,7 +11221,7 @@
pw.println("ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes)");
- if (dumpAll) {
+ if (dumpAll || dumpPackage != null) {
final int NP = mProcessList.mProcessNames.getMap().size();
for (int ip=0; ip<NP; ip++) {
SparseArray<ProcessRecord> procs = mProcessList.mProcessNames.getMap().valueAt(ip);
@@ -11267,6 +11288,12 @@
}
}
+ if (dumpOomLocked(fd, pw, needSep, args, opti, dumpAll, dumpPackage, false)) {
+ needSep = true;
+ }
+
+ needSep = dumpProcessesToGc(pw, needSep, dumpPackage);
+
if (mProcessList.mActiveUids.size() > 0) {
if (dumpUids(pw, dumpPackage, dumpAppId, mProcessList.mActiveUids,
"UID states:", needSep)) {
@@ -11283,6 +11310,13 @@
}
}
+ if (needSep) {
+ pw.println();
+ }
+ if (dumpLruLocked(pw, dumpPackage, " ")) {
+ needSep = true;
+ }
+
if (mProcessList.getLruSizeLocked() > 0) {
if (needSep) {
pw.println();
@@ -11387,8 +11421,6 @@
"OnHold Norm", "OnHold PERS", dumpPackage);
}
- needSep = dumpProcessesToGc(pw, needSep, dumpPackage);
-
needSep = mAppErrors.dumpLocked(fd, pw, needSep, dumpPackage);
needSep = mAtmInternal.dumpForProcesses(fd, pw, dumpAll, dumpPackage, dumpAppId, needSep,
@@ -11931,10 +11963,8 @@
pw.println(")");
}
- boolean dumpOomLocked(FileDescriptor fd, PrintWriter pw, String[] args,
- int opti, boolean dumpAll) {
- boolean needSep = false;
-
+ boolean dumpOomLocked(FileDescriptor fd, PrintWriter pw, boolean needSep, String[] args,
+ int opti, boolean dumpAll, String dumpPackage, boolean inclGc) {
if (mProcessList.getLruSizeLocked() > 0) {
if (needSep) pw.println();
needSep = true;
@@ -11965,11 +11995,11 @@
- mProcessList.mLruProcessServiceStart);
pw.println("):");
dumpProcessOomList(pw, this, mProcessList.mLruProcesses, " ", "Proc", "PERS", true,
- null);
+ dumpPackage);
needSep = true;
}
- dumpProcessesToGc(pw, needSep, null);
+ dumpProcessesToGc(pw, needSep, dumpPackage);
pw.println();
mAtmInternal.dumpForOom(pw);
diff --git a/services/core/java/com/android/server/am/AppExitInfoTracker.java b/services/core/java/com/android/server/am/AppExitInfoTracker.java
index 0c3d02d..02fb34e 100644
--- a/services/core/java/com/android/server/am/AppExitInfoTracker.java
+++ b/services/core/java/com/android/server/am/AppExitInfoTracker.java
@@ -785,7 +785,7 @@
}
void dumpHistoryProcessExitInfo(PrintWriter pw, String packageName) {
- pw.println("ACTIVITY MANAGER LRU PROCESSES (dumpsys activity exit-info)");
+ pw.println("ACTIVITY MANAGER PROCESS EXIT INFO (dumpsys activity exit-info)");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
synchronized (mLock) {
pw.println("Last Timestamp of Persistence Into Persistent Storage: "
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)");
}