diff options
| author | 2024-12-18 20:40:47 -0800 | |
|---|---|---|
| committer | 2024-12-18 20:40:47 -0800 | |
| commit | 98ab6d9dc032ea719ef23337f2f276d04beb32ea (patch) | |
| tree | 630dd283817f2005d962f408732dd542d05abf09 | |
| parent | 804e0eb49660e20b071bb281cf3899ce26c10544 (diff) | |
| parent | 3b31dce7b4f524bb624303dbb06e2407b7417ce9 (diff) | |
Merge "Add shell command to clear bad processes." into main
3 files changed, 48 insertions, 0 deletions
diff --git a/core/java/com/android/internal/app/ProcessMap.java b/core/java/com/android/internal/app/ProcessMap.java index 542b6d00ca37..b4945e7fd2ec 100644 --- a/core/java/com/android/internal/app/ProcessMap.java +++ b/core/java/com/android/internal/app/ProcessMap.java @@ -28,6 +28,11 @@ public class ProcessMap<E> { if (uids == null) return null; return uids.get(uid); } + + public SparseArray<E> get(String name) { + SparseArray<E> uids = mMap.get(name); + return uids; + } public E put(String name, int uid, E value) { SparseArray<E> uids = mMap.get(name); diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 9a63546bf5a7..cbebc905796c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -449,6 +449,8 @@ final class ActivityManagerShellCommand extends ShellCommand { return runSetAppZygotePreloadTimeout(pw); case "set-media-foreground-service": return runSetMediaForegroundService(pw); + case "clear-bad-process": + return runClearBadProcess(pw); default: return handleDefaultCommands(cmd); } @@ -4276,6 +4278,27 @@ final class ActivityManagerShellCommand extends ShellCommand { return 0; } + int runClearBadProcess(PrintWriter pw) throws RemoteException { + final String processName = getNextArgRequired(); + int userId = UserHandle.USER_CURRENT; + String opt; + while ((opt = getNextOption()) != null) { + if ("--user".equals(opt)) { + userId = UserHandle.parseUserArg(getNextArgRequired()); + } else { + getErrPrintWriter().println("Error: unknown option " + opt); + return -1; + } + } + if (userId == UserHandle.USER_CURRENT) { + userId = mInternal.getCurrentUserId(); + } + + pw.println("Clearing '" + processName + "' in u" + userId + " from bad processes list"); + mInternal.mAppErrors.clearBadProcessForUser(processName, userId); + return 0; + } + private Resources getResources(PrintWriter pw) throws RemoteException { // system resources does not contain all the device configuration, construct it manually. Configuration config = mInterface.getConfiguration(); @@ -4717,6 +4740,8 @@ final class ActivityManagerShellCommand extends ShellCommand { pw.println(" set-media-foreground-service inactive|active [--user USER_ID] <PACKAGE>" + " <NOTIFICATION_ID>"); pw.println(" Set an app's media service inactive or active."); + pw.println(" clear-bad-process [--user USER_ID] <PROCESS_NAME>"); + pw.println(" Clears a process from the bad processes list."); Intent.printIntentArgsHelp(pw, ""); } } diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index b7a5f3e4099a..2fbf05eb0061 100644 --- a/services/core/java/com/android/server/am/AppErrors.java +++ b/services/core/java/com/android/server/am/AppErrors.java @@ -373,6 +373,24 @@ class AppErrors { } } + void clearBadProcessForUser(final String processName, final int userId) { + synchronized (mBadProcessLock) { + final ProcessMap<BadProcessInfo> badProcesses = new ProcessMap<>(); + badProcesses.putAll(mBadProcesses); + final SparseArray<BadProcessInfo> uids = badProcesses.get(processName); + if (uids == null) { + return; + } + for (int i = uids.size() - 1; i >= 0; --i) { + final int uid = uids.keyAt(i); + if (userId == UserHandle.USER_ALL || userId == UserHandle.getUserId(uid)) { + badProcesses.remove(processName, uid); + } + } + mBadProcesses = badProcesses; + } + } + void markBadProcess(final String processName, final int uid, BadProcessInfo info) { synchronized (mBadProcessLock) { final ProcessMap<BadProcessInfo> badProcesses = new ProcessMap<>(); |