summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yandry Perez Clemente <yandry@google.com> 2021-11-26 11:14:28 +0000
committer Yandry Perez Clemente <yandry@google.com> 2021-12-02 08:14:19 +0000
commit9b47623790d9ee71973a4c502d4851a36efcd04f (patch)
tree7cd65032b21a2f0141159d5837158418f796ac06
parent7644c9c20cd6349946d944c0cda3aa20956e1b36 (diff)
Adds trace messages when goAsync and finish are called.
These will be used to troubleshoot ANRs. In this case calling goAsync and forgetting to call finish on the PendingResult could be the cause. We have existing instrumentation to include these in Perfetto traces and have used the "am" tag to avoid having to allowlist every single app of interest in the Perfetto tracing configuration (the "am" tag is allowlisted). Test: Manual: captured a Perfetto trace and verified the counters are present. Bug: b/207823767 Change-Id: I96aadf4d6d891f3c7d140b9792e7f893243d9943
-rw-r--r--core/java/android/content/BroadcastReceiver.java16
1 files changed, 16 insertions, 0 deletions
diff --git a/core/java/android/content/BroadcastReceiver.java b/core/java/android/content/BroadcastReceiver.java
index 1d4d30d87560..f335ae483bf7 100644
--- a/core/java/android/content/BroadcastReceiver.java
+++ b/core/java/android/content/BroadcastReceiver.java
@@ -27,6 +27,7 @@ import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
+import android.os.Trace;
import android.os.UserHandle;
import android.util.Log;
import android.util.Slog;
@@ -98,6 +99,7 @@ public abstract class BroadcastReceiver {
boolean mAbortBroadcast;
@UnsupportedAppUsage
boolean mFinished;
+ String mReceiverClassName;
/** @hide */
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
@@ -219,6 +221,12 @@ public abstract class BroadcastReceiver {
* next broadcast will proceed.
*/
public final void finish() {
+ if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
+ Trace.traceCounter(Trace.TRACE_TAG_ACTIVITY_MANAGER,
+ "PendingResult#finish#ClassName:" + mReceiverClassName,
+ 1);
+ }
+
if (mType == TYPE_COMPONENT) {
final IActivityManager mgr = ActivityManager.getService();
if (QueuedWork.hasPendingWork()) {
@@ -383,6 +391,14 @@ public abstract class BroadcastReceiver {
public final PendingResult goAsync() {
PendingResult res = mPendingResult;
mPendingResult = null;
+
+ if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) {
+ res.mReceiverClassName = getClass().getName();
+ Trace.traceCounter(Trace.TRACE_TAG_ACTIVITY_MANAGER,
+ "BroadcastReceiver#goAsync#ClassName:" + res.mReceiverClassName,
+ 1);
+ }
+
return res;
}