diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index b2262c0a06c73..d0ad6db793a68 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -10156,8 +10156,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } - private volatile long mWtfClusterStart; - private volatile int mWtfClusterCount; + private volatile ArrayMap mErrorClusterRecords = new ArrayMap<>(); /** * Write a description of an error (crash, WTF, ANR) to the drop box. @@ -10188,13 +10187,18 @@ public class ActivityManagerService extends IActivityManager.Stub if (dbox == null || !dbox.isTagEnabled(dropboxTag)) return; // Rate-limit how often we're willing to do the heavy lifting below to - // collect and record logs; currently 5 logs per 10 second period. + // collect and record logs; currently 5 logs per 10 second period per eventType. final long now = SystemClock.elapsedRealtime(); - if (now - mWtfClusterStart > 10 * DateUtils.SECOND_IN_MILLIS) { - mWtfClusterStart = now; - mWtfClusterCount = 1; + long[] errRecord = mErrorClusterRecords.get(eventType); + if (errRecord == null) { + errRecord = new long[2]; // [0]: startTime, [1]: count + mErrorClusterRecords.put(eventType, errRecord); + } + if (now - errRecord[0] > 10 * DateUtils.SECOND_IN_MILLIS) { + errRecord[0] = now; + errRecord[1] = 1L; } else { - if (mWtfClusterCount++ >= 5) return; + if (errRecord[1]++ >= 5) return; } final StringBuilder sb = new StringBuilder(1024);