summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jing Ji <jji@google.com> 2019-12-19 11:53:31 -0800
committer Jing Ji <jji@google.com> 2019-12-19 14:13:54 -0800
commit83c6bc5d2776b8c7211cc3c80a6a62a595e3c2a6 (patch)
tree86120c63f5b0b2fcbac201920da4d396c409e59d
parente97bfe485f6ef1208036cb72db0977d018cf29a4 (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.txt1
-rw-r--r--core/java/android/app/ActivityManager.java13
-rw-r--r--core/java/android/app/IActivityManager.aidl5
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java20
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) {