OSDN Git Service

Track Multiple Event Instances in EventReporter
authorNathan Harold <nharold@google.com>
Sat, 2 Feb 2019 01:43:09 +0000 (17:43 -0800)
committerNathan Harold <nharold@google.com>
Mon, 4 Feb 2019 22:54:48 +0000 (14:54 -0800)
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

telephony/java/android/telephony/DebugEventReporter.java

index 586d3c5..14b7dd6 100644 (file)
@@ -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<UUID, Integer> 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();
+    }
 }