diff options
| -rw-r--r-- | api/test-current.txt | 1 | ||||
| -rw-r--r-- | core/java/android/app/ActivityManager.java | 15 | ||||
| -rw-r--r-- | core/java/android/app/IActivityManager.aidl | 7 | ||||
| -rw-r--r-- | core/java/com/android/internal/app/ProcessMap.java | 4 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 13 | ||||
| -rw-r--r-- | services/core/java/com/android/server/am/AppErrors.java | 10 |
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; |