summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Olivier Gaillard <gaillard@google.com> 2024-02-22 12:56:00 +0000
committer Olivier Gaillard <gaillard@google.com> 2024-02-23 13:32:15 +0000
commit82865bfc48c55df9aa9f80bc6ae64ae0043f6fc2 (patch)
tree5bc669243ae727dffa274caed5f3669c269cdb29
parent7b5f3f42fc682ead3aac9a314c7029e613ade135 (diff)
Track excessive binder calls in the critical event logs.
It will help to understand if any ANRs are due to high binder calls. Change-Id: I3aad499f73ff00c52689c69e85ac87ca8b91e5ac
-rw-r--r--proto/src/criticalevents/critical_event_log.proto6
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java1
-rw-r--r--services/core/java/com/android/server/criticalevents/CriticalEventLog.java10
3 files changed, 17 insertions, 0 deletions
diff --git a/proto/src/criticalevents/critical_event_log.proto b/proto/src/criticalevents/critical_event_log.proto
index cffcd0941df8..71d291a6f877 100644
--- a/proto/src/criticalevents/critical_event_log.proto
+++ b/proto/src/criticalevents/critical_event_log.proto
@@ -61,6 +61,12 @@ message CriticalEventProto {
NativeCrash native_crash = 6;
SystemServerStarted system_server_started = 7;
InstallPackages install_packages = 8;
+ ExcessiveBinderCalls excessive_binder_calls = 9;
+ }
+
+ message ExcessiveBinderCalls {
+ // The uid sending many calls.
+ optional int32 uid = 1;
}
message InstallPackages {}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 2dd2f8fde797..d87846183f3e 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -9028,6 +9028,7 @@ public class ActivityManagerService extends IActivityManager.Stub
Slog.wtf(TAG, "Uid " + uid + " sent too many Binders to uid "
+ Process.myUid());
BinderProxy.dumpProxyDebugInfo();
+ CriticalEventLog.getInstance().logExcessiveBinderCalls(uid);
if (uid == Process.SYSTEM_UID) {
Slog.i(TAG, "Skipping kill (uid is SYSTEM)");
} else {
diff --git a/services/core/java/com/android/server/criticalevents/CriticalEventLog.java b/services/core/java/com/android/server/criticalevents/CriticalEventLog.java
index 816c3490d0a0..036284f53749 100644
--- a/services/core/java/com/android/server/criticalevents/CriticalEventLog.java
+++ b/services/core/java/com/android/server/criticalevents/CriticalEventLog.java
@@ -30,6 +30,7 @@ import com.android.server.criticalevents.nano.CriticalEventProto;
import com.android.server.criticalevents.nano.CriticalEventProto.AppNotResponding;
import com.android.server.criticalevents.nano.CriticalEventProto.HalfWatchdog;
import com.android.server.criticalevents.nano.CriticalEventProto.InstallPackages;
+import com.android.server.criticalevents.nano.CriticalEventProto.ExcessiveBinderCalls;
import com.android.server.criticalevents.nano.CriticalEventProto.JavaCrash;
import com.android.server.criticalevents.nano.CriticalEventProto.NativeCrash;
import com.android.server.criticalevents.nano.CriticalEventProto.SystemServerStarted;
@@ -143,6 +144,15 @@ public class CriticalEventLog {
return System.currentTimeMillis();
}
+ /** Logs when a uid sends an excessive number of binder calls. */
+ public void logExcessiveBinderCalls(int uid) {
+ CriticalEventProto event = new CriticalEventProto();
+ ExcessiveBinderCalls calls = new ExcessiveBinderCalls();
+ calls.uid = uid;
+ event.setExcessiveBinderCalls(calls);
+ log(event);
+ }
+
/** Logs when one or more packages are installed. */
public void logInstallPackagesStarted() {
CriticalEventProto event = new CriticalEventProto();