summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/test-current.txt1
-rw-r--r--core/java/android/app/ActivityManager.java15
-rw-r--r--core/java/android/app/IActivityManager.aidl7
-rw-r--r--core/java/com/android/internal/app/ProcessMap.java4
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java13
-rw-r--r--services/core/java/com/android/server/am/AppErrors.java10
6 files changed, 50 insertions, 0 deletions
diff --git a/api/test-current.txt b/api/test-current.txt
index 113d585164f6..850c9d3134e1 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -82,6 +82,7 @@ package android.app {
method public static boolean isHighEndGfx();
method @RequiresPermission(android.Manifest.permission.FORCE_STOP_PACKAGES) public void killProcessesWhenImperceptible(@NonNull int[], @NonNull String);
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public void removeOnUidImportanceListener(android.app.ActivityManager.OnUidImportanceListener);
+ method @RequiresPermission(android.Manifest.permission.RESET_APP_ERRORS) public void resetAppErrors();
method public static void resumeAppSwitches() throws android.os.RemoteException;
method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public void scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int);
method @RequiresPermission("android.permission.MANAGE_USERS") public boolean switchUser(@NonNull android.os.UserHandle);
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 7c4c19dde4d0..7a6f5584401d 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -4941,4 +4941,19 @@ public class ActivityManager {
throw e.rethrowFromSystemServer();
}
}
+
+ /**
+ * Resets the state of the {@link com.android.server.am.AppErrors} instance.
+ * This is intended for use with CTS only.
+ * @hide
+ */
+ @TestApi
+ @RequiresPermission(Manifest.permission.RESET_APP_ERRORS)
+ public void resetAppErrors() {
+ try {
+ getService().resetAppErrors();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index befd58824e63..3b6a7b8f7592 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -686,4 +686,11 @@ interface IActivityManager {
* Kills uid with the reason of permission change.
*/
void killUidForPermissionChange(int appId, int userId, String reason);
+
+ /**
+ * Resets the state of the {@link com.android.server.am.AppErrors} instance.
+ * This is intended for testing within the CTS only and is protected by
+ * android.permission.RESET_APP_ERRORS.
+ */
+ void resetAppErrors();
}
diff --git a/core/java/com/android/internal/app/ProcessMap.java b/core/java/com/android/internal/app/ProcessMap.java
index 81036f7ecba8..719c79b2540f 100644
--- a/core/java/com/android/internal/app/ProcessMap.java
+++ b/core/java/com/android/internal/app/ProcessMap.java
@@ -58,4 +58,8 @@ public class ProcessMap<E> {
public int size() {
return mMap.size();
}
+
+ public void clear() {
+ mMap.clear();
+ }
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index ce66b2cbf114..bf6825f8ecbc 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -20517,4 +20517,17 @@ public class ActivityManagerService extends IActivityManager.Stub
Binder.restoreCallingIdentity(token);
}
}
+
+ /**
+ * Resets the state of the {@link com.android.server.am.AppErrors} instance.
+ * This is intended for testing within the CTS only and is protected by
+ * android.permission.RESET_APP_ERRORS.
+ */
+ @Override
+ public void resetAppErrors() {
+ enforceCallingPermission(Manifest.permission.RESET_APP_ERRORS, "resetAppErrors");
+ synchronized (this) {
+ mAppErrors.resetStateLocked();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 50d2cab0af81..676f4837f004 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -108,6 +108,16 @@ class AppErrors {
mPackageWatchdog = watchdog;
}
+ /** Resets the current state but leaves the constructor-provided fields unchanged. */
+ public void resetStateLocked() {
+ Slog.i(TAG, "Resetting AppErrors");
+ mAppsNotReportingCrashes.clear();
+ mProcessCrashTimes.clear();
+ mProcessCrashTimesPersistent.clear();
+ mProcessCrashShowDialogTimes.clear();
+ mBadProcesses.clear();
+ }
+
void dumpDebug(ProtoOutputStream proto, long fieldId, String dumpPackage) {
if (mProcessCrashTimes.getMap().isEmpty() && mBadProcesses.getMap().isEmpty()) {
return;