Loading services/core/java/com/android/server/pm/ShortcutLauncher.java +2 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.util.ArraySet; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.server.pm.ShortcutService.DumpFilter; import com.android.server.pm.ShortcutUser.PackageWithUser; import org.json.JSONException; Loading Loading @@ -293,7 +294,7 @@ class ShortcutLauncher extends ShortcutPackageItem { return ret; } public void dump(@NonNull PrintWriter pw, @NonNull String prefix) { public void dump(@NonNull PrintWriter pw, @NonNull String prefix, DumpFilter filter) { pw.println(); pw.print(prefix); Loading services/core/java/com/android/server/pm/ShortcutPackage.java +2 −1 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import com.android.server.pm.ShortcutService.DumpFilter; import com.android.server.pm.ShortcutService.ShortcutOperation; import com.android.server.pm.ShortcutService.Stats; Loading Loading @@ -1144,7 +1145,7 @@ class ShortcutPackage extends ShortcutPackageItem { return false; } public void dump(@NonNull PrintWriter pw, @NonNull String prefix) { public void dump(@NonNull PrintWriter pw, @NonNull String prefix, DumpFilter filter) { pw.println(); pw.print(prefix); Loading services/core/java/com/android/server/pm/ShortcutService.java +235 −90 Original line number Diff line number Diff line Loading @@ -134,6 +134,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.regex.Pattern; /** * TODO: Loading Loading @@ -3455,59 +3456,197 @@ public class ShortcutService extends IShortcutService.Stub { @VisibleForTesting void dumpNoCheck(FileDescriptor fd, PrintWriter pw, String[] args) { final DumpFilter filter = parseDumpArgs(args); boolean dumpMain = true; boolean checkin = false; boolean clear = false; boolean dumpUid = false; boolean dumpFiles = false; if (filter.shouldDumpCheckIn()) { // Other flags are not supported for checkin. dumpCheckin(pw, filter.shouldCheckInClear()); } else { if (filter.shouldDumpMain()) { dumpInner(pw, filter); pw.println(); } if (filter.shouldDumpUid()) { dumpUid(pw); pw.println(); } if (filter.shouldDumpFiles()) { dumpDumpFiles(pw); pw.println(); } } } private static DumpFilter parseDumpArgs(String[] args) { final DumpFilter filter = new DumpFilter(); if (args == null) { return filter; } int argIndex = 0; while (argIndex < args.length) { final String arg = args[argIndex++]; if (args != null) { for (String arg : args) { if ("-c".equals(arg)) { checkin = true; filter.setDumpCheckIn(true); continue; } if ("--checkin".equals(arg)) { filter.setDumpCheckIn(true); filter.setCheckInClear(true); continue; } if ("-a".equals(arg) || "--all".equals(arg)) { filter.setDumpUid(true); filter.setDumpFiles(true); continue; } if ("-u".equals(arg) || "--uid".equals(arg)) { filter.setDumpUid(true); continue; } if ("-f".equals(arg) || "--files".equals(arg)) { filter.setDumpFiles(true); continue; } if ("-n".equals(arg) || "--no-main".equals(arg)) { filter.setDumpMain(false); continue; } if ("--user".equals(arg)) { if (argIndex >= args.length) { throw new IllegalArgumentException("Missing user ID for --user"); } try { filter.addUser(Integer.parseInt(args[argIndex++])); } catch (NumberFormatException e) { throw new IllegalArgumentException("Invalid user ID", e); } continue; } if ("-p".equals(arg) || "--package".equals(arg)) { if (argIndex >= args.length) { throw new IllegalArgumentException("Missing package name for --package"); } filter.addPackageRegex(args[argIndex++]); filter.setDumpDetails(false); continue; } if (arg.startsWith("-")) { throw new IllegalArgumentException("Unknown option " + arg); } break; } while (argIndex < args.length) { filter.addPackage(args[argIndex++]); } return filter; } } else if ("--checkin".equals(arg)) { checkin = true; clear = true; static class DumpFilter { private boolean mDumpCheckIn = false; private boolean mCheckInClear = false; } else if ("-a".equals(arg) || "--all".equals(arg)) { dumpUid = true; dumpFiles = true; private boolean mDumpMain = true; private boolean mDumpUid = false; private boolean mDumpFiles = false; } else if ("-u".equals(arg) || "--uid".equals(arg)) { dumpUid = true; private boolean mDumpDetails = true; private List<Pattern> mPackagePatterns = new ArrayList<>(); private List<Integer> mUsers = new ArrayList<>(); } else if ("-f".equals(arg) || "--files".equals(arg)) { dumpFiles = true; void addPackageRegex(String regex) { mPackagePatterns.add(Pattern.compile(regex)); } } else if ("-n".equals(arg) || "--no-main".equals(arg)) { dumpMain = false; public void addPackage(String packageName) { addPackageRegex(Pattern.quote(packageName)); } void addUser(int userId) { mUsers.add(userId); } boolean isPackageMatch(String packageName) { if (mPackagePatterns.size() == 0) { return true; } for (int i = 0; i < mPackagePatterns.size(); i++) { if (mPackagePatterns.get(i).matcher(packageName).find()) { return true; } } return false; } if (checkin) { // Other flags are not supported for checkin. dumpCheckin(pw, clear); } else { if (dumpMain) { dumpInner(pw); pw.println(); boolean isUserMatch(int userId) { if (mUsers.size() == 0) { return true; } if (dumpUid) { dumpUid(pw); pw.println(); for (int i = 0; i < mUsers.size(); i++) { if (mUsers.get(i) == userId) { return true; } if (dumpFiles) { dumpDumpFiles(pw); pw.println(); } return false; } public boolean shouldDumpCheckIn() { return mDumpCheckIn; } public void setDumpCheckIn(boolean dumpCheckIn) { mDumpCheckIn = dumpCheckIn; } public boolean shouldCheckInClear() { return mCheckInClear; } public void setCheckInClear(boolean checkInClear) { mCheckInClear = checkInClear; } public boolean shouldDumpMain() { return mDumpMain; } public void setDumpMain(boolean dumpMain) { mDumpMain = dumpMain; } public boolean shouldDumpUid() { return mDumpUid; } public void setDumpUid(boolean dumpUid) { mDumpUid = dumpUid; } public boolean shouldDumpFiles() { return mDumpFiles; } public void setDumpFiles(boolean dumpFiles) { mDumpFiles = dumpFiles; } public boolean shouldDumpDetails() { return mDumpDetails; } public void setDumpDetails(boolean dumpDetails) { mDumpDetails = dumpDetails; } } private void dumpInner(PrintWriter pw) { dumpInner(pw, new DumpFilter()); } private void dumpInner(PrintWriter pw, DumpFilter filter) { synchronized (mLock) { if (filter.shouldDumpDetails()) { final long now = injectCurrentTimeMillis(); pw.print("Now: ["); pw.print(now); Loading Loading @@ -3567,9 +3706,15 @@ public class ShortcutService extends IShortcutService.Stub { pw.println(); mShortcutBitmapSaver.dumpLocked(pw, " "); pw.println(); } for (int i = 0; i < mUsers.size(); i++) { final ShortcutUser user = mUsers.valueAt(i); if (filter.isUserMatch(user.getUserId())) { user.dump(pw, " ", filter); pw.println(); mUsers.valueAt(i).dump(pw, " "); } } } } Loading services/core/java/com/android/server/pm/ShortcutUser.java +42 −31 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.server.pm.ShortcutService.DumpFilter; import com.android.server.pm.ShortcutService.InvalidFileFormatException; import libcore.util.Objects; Loading Loading @@ -531,7 +532,8 @@ class ShortcutUser { + " S=" + restoredShortcuts[0]); } public void dump(@NonNull PrintWriter pw, @NonNull String prefix) { public void dump(@NonNull PrintWriter pw, @NonNull String prefix, DumpFilter filter) { if (filter.shouldDumpDetails()) { pw.print(prefix); pw.print("User: "); pw.print(mUserId); Loading @@ -556,20 +558,29 @@ class ShortcutUser { pw.print("Last known launcher: "); pw.print(mLastKnownLauncher); pw.println(); } for (int i = 0; i < mLaunchers.size(); i++) { mLaunchers.valueAt(i).dump(pw, prefix); ShortcutLauncher launcher = mLaunchers.valueAt(i); if (filter.isPackageMatch(launcher.getPackageName())) { launcher.dump(pw, prefix, filter); } } for (int i = 0; i < mPackages.size(); i++) { mPackages.valueAt(i).dump(pw, prefix); ShortcutPackage pkg = mPackages.valueAt(i); if (filter.isPackageMatch(pkg.getPackageName())) { pkg.dump(pw, prefix, filter); } } if (filter.shouldDumpDetails()) { pw.println(); pw.print(prefix); pw.println("Bitmap directories: "); dumpDirectorySize(pw, prefix + " ", mService.getUserBitmapFilePath(mUserId)); } } private void dumpDirectorySize(@NonNull PrintWriter pw, @NonNull String prefix, File path) { Loading Loading
services/core/java/com/android/server/pm/ShortcutLauncher.java +2 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import android.util.ArraySet; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.server.pm.ShortcutService.DumpFilter; import com.android.server.pm.ShortcutUser.PackageWithUser; import org.json.JSONException; Loading Loading @@ -293,7 +294,7 @@ class ShortcutLauncher extends ShortcutPackageItem { return ret; } public void dump(@NonNull PrintWriter pw, @NonNull String prefix) { public void dump(@NonNull PrintWriter pw, @NonNull String prefix, DumpFilter filter) { pw.println(); pw.print(prefix); Loading
services/core/java/com/android/server/pm/ShortcutPackage.java +2 −1 Original line number Diff line number Diff line Loading @@ -33,6 +33,7 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import com.android.server.pm.ShortcutService.DumpFilter; import com.android.server.pm.ShortcutService.ShortcutOperation; import com.android.server.pm.ShortcutService.Stats; Loading Loading @@ -1144,7 +1145,7 @@ class ShortcutPackage extends ShortcutPackageItem { return false; } public void dump(@NonNull PrintWriter pw, @NonNull String prefix) { public void dump(@NonNull PrintWriter pw, @NonNull String prefix, DumpFilter filter) { pw.println(); pw.print(prefix); Loading
services/core/java/com/android/server/pm/ShortcutService.java +235 −90 Original line number Diff line number Diff line Loading @@ -134,6 +134,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.regex.Pattern; /** * TODO: Loading Loading @@ -3455,59 +3456,197 @@ public class ShortcutService extends IShortcutService.Stub { @VisibleForTesting void dumpNoCheck(FileDescriptor fd, PrintWriter pw, String[] args) { final DumpFilter filter = parseDumpArgs(args); boolean dumpMain = true; boolean checkin = false; boolean clear = false; boolean dumpUid = false; boolean dumpFiles = false; if (filter.shouldDumpCheckIn()) { // Other flags are not supported for checkin. dumpCheckin(pw, filter.shouldCheckInClear()); } else { if (filter.shouldDumpMain()) { dumpInner(pw, filter); pw.println(); } if (filter.shouldDumpUid()) { dumpUid(pw); pw.println(); } if (filter.shouldDumpFiles()) { dumpDumpFiles(pw); pw.println(); } } } private static DumpFilter parseDumpArgs(String[] args) { final DumpFilter filter = new DumpFilter(); if (args == null) { return filter; } int argIndex = 0; while (argIndex < args.length) { final String arg = args[argIndex++]; if (args != null) { for (String arg : args) { if ("-c".equals(arg)) { checkin = true; filter.setDumpCheckIn(true); continue; } if ("--checkin".equals(arg)) { filter.setDumpCheckIn(true); filter.setCheckInClear(true); continue; } if ("-a".equals(arg) || "--all".equals(arg)) { filter.setDumpUid(true); filter.setDumpFiles(true); continue; } if ("-u".equals(arg) || "--uid".equals(arg)) { filter.setDumpUid(true); continue; } if ("-f".equals(arg) || "--files".equals(arg)) { filter.setDumpFiles(true); continue; } if ("-n".equals(arg) || "--no-main".equals(arg)) { filter.setDumpMain(false); continue; } if ("--user".equals(arg)) { if (argIndex >= args.length) { throw new IllegalArgumentException("Missing user ID for --user"); } try { filter.addUser(Integer.parseInt(args[argIndex++])); } catch (NumberFormatException e) { throw new IllegalArgumentException("Invalid user ID", e); } continue; } if ("-p".equals(arg) || "--package".equals(arg)) { if (argIndex >= args.length) { throw new IllegalArgumentException("Missing package name for --package"); } filter.addPackageRegex(args[argIndex++]); filter.setDumpDetails(false); continue; } if (arg.startsWith("-")) { throw new IllegalArgumentException("Unknown option " + arg); } break; } while (argIndex < args.length) { filter.addPackage(args[argIndex++]); } return filter; } } else if ("--checkin".equals(arg)) { checkin = true; clear = true; static class DumpFilter { private boolean mDumpCheckIn = false; private boolean mCheckInClear = false; } else if ("-a".equals(arg) || "--all".equals(arg)) { dumpUid = true; dumpFiles = true; private boolean mDumpMain = true; private boolean mDumpUid = false; private boolean mDumpFiles = false; } else if ("-u".equals(arg) || "--uid".equals(arg)) { dumpUid = true; private boolean mDumpDetails = true; private List<Pattern> mPackagePatterns = new ArrayList<>(); private List<Integer> mUsers = new ArrayList<>(); } else if ("-f".equals(arg) || "--files".equals(arg)) { dumpFiles = true; void addPackageRegex(String regex) { mPackagePatterns.add(Pattern.compile(regex)); } } else if ("-n".equals(arg) || "--no-main".equals(arg)) { dumpMain = false; public void addPackage(String packageName) { addPackageRegex(Pattern.quote(packageName)); } void addUser(int userId) { mUsers.add(userId); } boolean isPackageMatch(String packageName) { if (mPackagePatterns.size() == 0) { return true; } for (int i = 0; i < mPackagePatterns.size(); i++) { if (mPackagePatterns.get(i).matcher(packageName).find()) { return true; } } return false; } if (checkin) { // Other flags are not supported for checkin. dumpCheckin(pw, clear); } else { if (dumpMain) { dumpInner(pw); pw.println(); boolean isUserMatch(int userId) { if (mUsers.size() == 0) { return true; } if (dumpUid) { dumpUid(pw); pw.println(); for (int i = 0; i < mUsers.size(); i++) { if (mUsers.get(i) == userId) { return true; } if (dumpFiles) { dumpDumpFiles(pw); pw.println(); } return false; } public boolean shouldDumpCheckIn() { return mDumpCheckIn; } public void setDumpCheckIn(boolean dumpCheckIn) { mDumpCheckIn = dumpCheckIn; } public boolean shouldCheckInClear() { return mCheckInClear; } public void setCheckInClear(boolean checkInClear) { mCheckInClear = checkInClear; } public boolean shouldDumpMain() { return mDumpMain; } public void setDumpMain(boolean dumpMain) { mDumpMain = dumpMain; } public boolean shouldDumpUid() { return mDumpUid; } public void setDumpUid(boolean dumpUid) { mDumpUid = dumpUid; } public boolean shouldDumpFiles() { return mDumpFiles; } public void setDumpFiles(boolean dumpFiles) { mDumpFiles = dumpFiles; } public boolean shouldDumpDetails() { return mDumpDetails; } public void setDumpDetails(boolean dumpDetails) { mDumpDetails = dumpDetails; } } private void dumpInner(PrintWriter pw) { dumpInner(pw, new DumpFilter()); } private void dumpInner(PrintWriter pw, DumpFilter filter) { synchronized (mLock) { if (filter.shouldDumpDetails()) { final long now = injectCurrentTimeMillis(); pw.print("Now: ["); pw.print(now); Loading Loading @@ -3567,9 +3706,15 @@ public class ShortcutService extends IShortcutService.Stub { pw.println(); mShortcutBitmapSaver.dumpLocked(pw, " "); pw.println(); } for (int i = 0; i < mUsers.size(); i++) { final ShortcutUser user = mUsers.valueAt(i); if (filter.isUserMatch(user.getUserId())) { user.dump(pw, " ", filter); pw.println(); mUsers.valueAt(i).dump(pw, " "); } } } } Loading
services/core/java/com/android/server/pm/ShortcutUser.java +42 −31 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.server.pm.ShortcutService.DumpFilter; import com.android.server.pm.ShortcutService.InvalidFileFormatException; import libcore.util.Objects; Loading Loading @@ -531,7 +532,8 @@ class ShortcutUser { + " S=" + restoredShortcuts[0]); } public void dump(@NonNull PrintWriter pw, @NonNull String prefix) { public void dump(@NonNull PrintWriter pw, @NonNull String prefix, DumpFilter filter) { if (filter.shouldDumpDetails()) { pw.print(prefix); pw.print("User: "); pw.print(mUserId); Loading @@ -556,20 +558,29 @@ class ShortcutUser { pw.print("Last known launcher: "); pw.print(mLastKnownLauncher); pw.println(); } for (int i = 0; i < mLaunchers.size(); i++) { mLaunchers.valueAt(i).dump(pw, prefix); ShortcutLauncher launcher = mLaunchers.valueAt(i); if (filter.isPackageMatch(launcher.getPackageName())) { launcher.dump(pw, prefix, filter); } } for (int i = 0; i < mPackages.size(); i++) { mPackages.valueAt(i).dump(pw, prefix); ShortcutPackage pkg = mPackages.valueAt(i); if (filter.isPackageMatch(pkg.getPackageName())) { pkg.dump(pw, prefix, filter); } } if (filter.shouldDumpDetails()) { pw.println(); pw.print(prefix); pw.println("Bitmap directories: "); dumpDirectorySize(pw, prefix + " ", mService.getUserBitmapFilePath(mUserId)); } } private void dumpDirectorySize(@NonNull PrintWriter pw, @NonNull String prefix, File path) { Loading