diff options
author | 2019-12-19 11:53:31 -0800 | |
---|---|---|
committer | 2019-12-19 14:13:54 -0800 | |
commit | 83c6bc5d2776b8c7211cc3c80a6a62a595e3c2a6 (patch) | |
tree | 86120c63f5b0b2fcbac201920da4d396c409e59d | |
parent | e97bfe485f6ef1208036cb72db0977d018cf29a4 (diff) |
Add API to allow app to report ANR by its own
Bug: 140025078
Test: atest CtsAppTestCases:ActivityManagerTest#testAppNotResponding
Change-Id: Iaa57057b18a41a2f934d709b88790625ffcf5478
-rw-r--r-- | api/current.txt | 1 | ||||
-rw-r--r-- | core/java/android/app/ActivityManager.java | 13 | ||||
-rw-r--r-- | core/java/android/app/IActivityManager.aidl | 5 | ||||
-rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 20 |
4 files changed, 39 insertions, 0 deletions
diff --git a/api/current.txt b/api/current.txt index 39d526344d97..0763c4053b9d 100644 --- a/api/current.txt +++ b/api/current.txt @@ -3954,6 +3954,7 @@ package android.app { public class ActivityManager { method public int addAppTask(@NonNull android.app.Activity, @NonNull android.content.Intent, @Nullable android.app.ActivityManager.TaskDescription, @NonNull android.graphics.Bitmap); + method public void appNotResponding(@NonNull String); method public boolean clearApplicationUserData(); method public void clearWatchHeapLimit(); method @RequiresPermission(android.Manifest.permission.DUMP) public void dumpPackageState(java.io.FileDescriptor, String); diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 68bdfae218ae..3f9f7fbbe477 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -4547,4 +4547,17 @@ public class ActivityManager { throw e.rethrowFromSystemServer(); } } + + /** + * Method for the app to tell system that it's wedged and would like to trigger an ANR. + * + * @param reason The description of that what happened + */ + public void appNotResponding(@NonNull final String reason) { + try { + getService().appNotResponding(reason); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 112bd303a8b3..e8494c4c5893 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -583,4 +583,9 @@ interface IActivityManager { * unlockProgressListener can be null if monitoring progress is not necessary. */ boolean startUserInForegroundWithListener(int userid, IProgressListener unlockProgressListener); + + /** + * Method for the app to tell system that it's wedged and would like to trigger an ANR. + */ + void appNotResponding(String reason); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 1852e01fa9c7..08dd2b0686df 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -7558,6 +7558,26 @@ public class ActivityManagerService extends IActivityManager.Stub }); } + @Override + public void appNotResponding(final String reason) { + final int callingPid = Binder.getCallingPid(); + + synchronized (mPidsSelfLocked) { + final ProcessRecord app = mPidsSelfLocked.get(callingPid); + if (app == null) { + throw new SecurityException("Unknown process: " + callingPid); + } + + mHandler.post(new Runnable() { + @Override + public void run() { + app.appNotResponding( + null, app.info, null, null, false, "App requested: " + reason); + } + }); + } + } + public final void installSystemProviders() { List<ProviderInfo> providers; synchronized (this) { |