diff options
author | 2019-12-20 22:54:56 +0000 | |
---|---|---|
committer | 2019-12-20 22:54:56 +0000 | |
commit | c7fe838a0f7cb437cec0444808ae57c824ec7351 (patch) | |
tree | 18f134a0ce4e238b92a8ec20da6c1592180f3096 | |
parent | f28391eb28220beec732418bb17f2aa0326fa8c0 (diff) | |
parent | 83c6bc5d2776b8c7211cc3c80a6a62a595e3c2a6 (diff) |
Merge "Add API to allow app to report ANR by its own"
-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 86aa80b159bd..94a913d82fe1 100644 --- a/api/current.txt +++ b/api/current.txt @@ -3955,6 +3955,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 6dc49b7ba375..d7a46fec7767 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) { |