diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index bdb3e808b6f1b..64bba79949e93 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -9176,6 +9176,7 @@ public class ActivityManagerService extends IActivityManager.Stub boolean dumpVisibleStacksOnly = false; boolean dumpFocusedStackOnly = false; String dumpPackage = null; + int dumpUserId = UserHandle.USER_ALL; int opti = 0; while (opti < args.length) { @@ -9207,6 +9208,17 @@ public class ActivityManagerService extends IActivityManager.Stub dumpCheckinFormat = true; } else if ("--normal-priority".equals(opt)) { dumpNormalPriority = true; + } else if ("--user".equals(opt)) { + if (opti < args.length) { + dumpUserId = UserHandle.parseUserArg(args[opti]); + if (dumpUserId == UserHandle.USER_CURRENT) { + dumpUserId = mUserController.getCurrentUserId(); + } + opti++; + } else { + pw.println("Error: --user option requires user id argument"); + return; + } } else if ("-h".equals(opt)) { ActivityManagerShellCommand.dumpHelp(pw, true); return; @@ -9397,29 +9409,17 @@ public class ActivityManagerService extends IActivityManager.Stub } else if ("service".equals(cmd)) { String[] newArgs; String name; - int[] users = null; if (opti >= args.length) { name = null; newArgs = EMPTY_STRING_ARRAY; } else { name = args[opti]; opti++; - if ("--user".equals(name) && opti < args.length) { - int userId = UserHandle.parseUserArg(args[opti]); - opti++; - if (userId != UserHandle.USER_ALL) { - if (userId == UserHandle.USER_CURRENT) { - userId = getCurrentUser().id; - } - users = new int[] { userId }; - } - name = args[opti]; - opti++; - } newArgs = new String[args.length - opti]; if (args.length > 2) System.arraycopy(args, opti, newArgs, 0, args.length - opti); } + int[] users = dumpUserId == UserHandle.USER_ALL ? null : new int[] { dumpUserId }; if (!mServices.dumpService(fd, pw, name, users, newArgs, 0, dumpAll)) { pw.println("No services match: " + name); pw.println("Use -h for help."); @@ -9480,7 +9480,7 @@ public class ActivityManagerService extends IActivityManager.Stub } else { // Dumping a single activity? if (!mAtmInternal.dumpActivity(fd, pw, cmd, args, opti, dumpAll, - dumpVisibleStacksOnly, dumpFocusedStackOnly)) { + dumpVisibleStacksOnly, dumpFocusedStackOnly, dumpUserId)) { ActivityManagerShellCommand shell = new ActivityManagerShellCommand(this, true); int res = shell.exec(this, null, fd, null, args, null, new ResultReceiver(null)); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index 25c4d200d76bc..cecfccd1f836b 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -471,7 +471,7 @@ public abstract class ActivityTaskManagerInternal { /** Dump the current activities state. */ public abstract boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args, int opti, boolean dumpAll, boolean dumpVisibleRootTasksOnly, - boolean dumpFocusedRootTaskOnly); + boolean dumpFocusedRootTaskOnly, @UserIdInt int userId); /** Dump the current state for inclusion in oom dump. */ public abstract void dumpForOom(PrintWriter pw); diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 049747728ade7..fe4eae9154222 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -4062,12 +4062,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { */ protected boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args, int opti, boolean dumpAll, boolean dumpVisibleRootTasksOnly, - boolean dumpFocusedRootTaskOnly) { + boolean dumpFocusedRootTaskOnly, @UserIdInt int userId) { ArrayList activities; synchronized (mGlobalLock) { activities = mRootWindowContainer.getDumpActivities(name, dumpVisibleRootTasksOnly, - dumpFocusedRootTaskOnly); + dumpFocusedRootTaskOnly, userId); } if (activities.size() <= 0) { @@ -6410,9 +6410,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { @Override public boolean dumpActivity(FileDescriptor fd, PrintWriter pw, String name, String[] args, int opti, boolean dumpAll, boolean dumpVisibleRootTasksOnly, - boolean dumpFocusedRootTaskOnly) { + boolean dumpFocusedRootTaskOnly, @UserIdInt int userId) { return ActivityTaskManagerService.this.dumpActivity(fd, pw, name, args, opti, dumpAll, - dumpVisibleRootTasksOnly, dumpFocusedRootTaskOnly); + dumpVisibleRootTasksOnly, dumpFocusedRootTaskOnly, userId); } @Override diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 8ab2ee03a1e3a..ac5ed7b200f2b 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -3434,11 +3434,11 @@ class RootWindowContainer extends WindowContainer * or all visible root tasks if {@param dumpVisibleRootTasksOnly} is true. */ ArrayList getDumpActivities(String name, boolean dumpVisibleRootTasksOnly, - boolean dumpFocusedRootTaskOnly) { + boolean dumpFocusedRootTaskOnly, @UserIdInt int userId) { if (dumpFocusedRootTaskOnly) { final Task topFocusedRootTask = getTopDisplayFocusedRootTask(); if (topFocusedRootTask != null) { - return topFocusedRootTask.getDumpActivitiesLocked(name); + return topFocusedRootTask.getDumpActivitiesLocked(name, userId); } else { return new ArrayList<>(); } @@ -3446,7 +3446,7 @@ class RootWindowContainer extends WindowContainer final ArrayList activities = new ArrayList<>(); forAllRootTasks(rootTask -> { if (!dumpVisibleRootTasksOnly || rootTask.shouldBeVisible(null)) { - activities.addAll(rootTask.getDumpActivitiesLocked(name)); + activities.addAll(rootTask.getDumpActivitiesLocked(name, userId)); } }); return activities; diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 98c74f8ad81dc..693cc0588894e 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -137,6 +137,7 @@ import static java.lang.Integer.MAX_VALUE; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.UserIdInt; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RecentTaskInfo.PersistedTaskSnapshotData; @@ -5691,7 +5692,7 @@ class Task extends TaskFragment { } } - ArrayList getDumpActivitiesLocked(String name) { + ArrayList getDumpActivitiesLocked(String name, @UserIdInt int userId) { ArrayList activities = new ArrayList<>(); if ("all".equals(name)) { @@ -5711,7 +5712,13 @@ class Task extends TaskFragment { } }); } - + if (userId != UserHandle.USER_ALL) { + for (int i = activities.size() - 1; i >= 0; --i) { + if (activities.get(i).mUserId != userId) { + activities.remove(i); + } + } + } return activities; }