From 821857f776da92438df05ae7794db264b580b30d Mon Sep 17 00:00:00 2001 From: Nathan Harold Date: Fri, 1 Feb 2019 17:43:09 -0800 Subject: [PATCH] Track Multiple Event Instances in EventReporter To avoid spamming users or the debug app with debug events, the DebugEventReporter will now track each event it receives and only send a single intent for each event signature per boot. In the future, some other method of persistence (such as per-build) might be preferable, but this should mitigate any looping events. In addition, add dump() to the event reporter so that even if there is no debug app installed, or in case an event happens multiple times, it can be observed through a bugreport. Bug: 120941729 Test: dump and observe that the events are printed. Change-Id: Iaf04a308a29bc074acfaa16b9e70947761759181 --- .../android/telephony/DebugEventReporter.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/telephony/java/android/telephony/DebugEventReporter.java b/telephony/java/android/telephony/DebugEventReporter.java index 586d3c57f38d7..14b7dd6d1b729 100644 --- a/telephony/java/android/telephony/DebugEventReporter.java +++ b/telephony/java/android/telephony/DebugEventReporter.java @@ -24,8 +24,15 @@ import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.ParcelUuid; +import com.android.internal.util.IndentingPrintWriter; + +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.List; +import java.util.List; +import java.util.Map; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; /** * A Simple Surface for Telephony to notify a loosely-coupled debugger of particular issues. @@ -47,6 +54,8 @@ public final class DebugEventReporter { private static Context sContext = null; + private static Map sEvents = new ConcurrentHashMap<>(); + /* * Because this is only supporting system packages, once we find a package, it will be the * same package until the next system upgrade. Thus, to save time in processing debug events @@ -74,6 +83,12 @@ public final class DebugEventReporter { return; } + // If this event has already occurred, skip sending intents for it; regardless log its + // invocation here. + Integer count = sEvents.containsKey(eventId) ? sEvents.get(eventId) + 1 : 1; + sEvents.put(eventId, count); + if (count > 1) return; + // Even if we are initialized, that doesn't mean that a package name has been found. // This is normal in many cases, such as when no debug package is installed on the system, // so drop these events silently. @@ -140,4 +155,20 @@ public final class DebugEventReporter { } // Initialization may only be performed once. } + + /** Dump the contents of the DebugEventReporter */ + public static void dump(FileDescriptor fd, PrintWriter printWriter, String[] args) { + if (sContext == null) return; + IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, " "); + sContext.enforceCallingOrSelfPermission(android.Manifest.permission.DUMP, "Requires DUMP"); + pw.println("Initialized=" + (sContext != null ? "Yes" : "No")); + pw.println("Debug Package=" + sDebugPackageName); + pw.println("Event Counts:"); + pw.increaseIndent(); + for (UUID event : sEvents.keySet()) { + pw.println(event + ": " + sEvents.get(event)); + } + pw.decreaseIndent(); + pw.flush(); + } }