summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Sudheer Shanka <sudheersai@google.com> 2024-12-18 20:40:47 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2024-12-18 20:40:47 -0800
commit98ab6d9dc032ea719ef23337f2f276d04beb32ea (patch)
tree630dd283817f2005d962f408732dd542d05abf09
parent804e0eb49660e20b071bb281cf3899ce26c10544 (diff)
parent3b31dce7b4f524bb624303dbb06e2407b7417ce9 (diff)
Merge "Add shell command to clear bad processes." into main
-rw-r--r--core/java/com/android/internal/app/ProcessMap.java5
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerShellCommand.java25
-rw-r--r--services/core/java/com/android/server/am/AppErrors.java18
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<>();