Loading core/java/android/os/Binder.java +2 −1 Original line number Diff line number Diff line Loading @@ -730,6 +730,7 @@ public class Binder implements IBinder { } res = onTransact(code, data, reply, flags); } catch (RemoteException|RuntimeException e) { binderCallsStats.callThrewException(callSession); if (LOG_RUNTIME_EXCEPTION) { Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e); } Loading core/java/com/android/internal/os/BinderCallsStats.java +20 −2 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ public class BinderCallsStats { s.mCpuTimeStarted = getThreadTimeMicro(); s.mTimeStarted = getElapsedRealtimeNanos() / 1_000; s.exceptionThrown = false; return s; } Loading Loading @@ -98,6 +99,7 @@ public class BinderCallsStats { callStat.callCount++; callStat.latencyMicros += latencyDuration; callStat.cpuTimeMicros += duration; callStat.exceptionCount += s.exceptionThrown ? 1 : 0; } uidEntry.cpuTimeMicros += duration; Loading @@ -108,6 +110,18 @@ public class BinderCallsStats { } } /** * Called if an exception is thrown while executing the binder transaction. * * <li>BinderCallsStats#callEnded will be called afterwards. * <li>Do not throw an exception in this method, it will swallow the original exception thrown * by the binder transaction. */ public void callThrewException(CallSession s) { Preconditions.checkNotNull(s); s.exceptionThrown = true; } public void dump(PrintWriter pw) { Map<Integer, Long> uidTimeMap = new HashMap<>(); Map<Integer, Long> uidCallCountMap = new HashMap<>(); Loading @@ -134,7 +148,7 @@ public class BinderCallsStats { } } if (mDetailedTracking) { pw.println("Raw data (uid,call_desc,cpu_time_micros,latency_time_micros,call_count):"); pw.println("Raw data (uid,call_desc,cpu_time_micros,latency_time_micros,exception_count,call_count):"); entries.sort((o1, o2) -> { if (o1.cpuTimeMicros < o2.cpuTimeMicros) { return 1; Loading @@ -157,8 +171,10 @@ public class BinderCallsStats { for (CallStat e : callStats) { sb.setLength(0); sb.append(" ") .append(uidEntry.uid).append(",").append(e).append(',').append(e.cpuTimeMicros) .append(uidEntry.uid).append(",").append(e) .append(',').append(e.cpuTimeMicros) .append(',').append(e.latencyMicros) .append(',').append(e.exceptionCount) .append(',').append(e.callCount); pw.println(sb); } Loading Loading @@ -225,6 +241,7 @@ public class BinderCallsStats { long cpuTimeMicros; long latencyMicros; long callCount; long exceptionCount; CallStat() { } Loading Loading @@ -262,6 +279,7 @@ public class BinderCallsStats { int mCallingUId; long mCpuTimeStarted; long mTimeStarted; boolean exceptionThrown; CallStat mCallStat = new CallStat(); } Loading Loading
core/java/android/os/Binder.java +2 −1 Original line number Diff line number Diff line Loading @@ -730,6 +730,7 @@ public class Binder implements IBinder { } res = onTransact(code, data, reply, flags); } catch (RemoteException|RuntimeException e) { binderCallsStats.callThrewException(callSession); if (LOG_RUNTIME_EXCEPTION) { Log.w(TAG, "Caught a RuntimeException from the binder stub implementation.", e); } Loading
core/java/com/android/internal/os/BinderCallsStats.java +20 −2 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ public class BinderCallsStats { s.mCpuTimeStarted = getThreadTimeMicro(); s.mTimeStarted = getElapsedRealtimeNanos() / 1_000; s.exceptionThrown = false; return s; } Loading Loading @@ -98,6 +99,7 @@ public class BinderCallsStats { callStat.callCount++; callStat.latencyMicros += latencyDuration; callStat.cpuTimeMicros += duration; callStat.exceptionCount += s.exceptionThrown ? 1 : 0; } uidEntry.cpuTimeMicros += duration; Loading @@ -108,6 +110,18 @@ public class BinderCallsStats { } } /** * Called if an exception is thrown while executing the binder transaction. * * <li>BinderCallsStats#callEnded will be called afterwards. * <li>Do not throw an exception in this method, it will swallow the original exception thrown * by the binder transaction. */ public void callThrewException(CallSession s) { Preconditions.checkNotNull(s); s.exceptionThrown = true; } public void dump(PrintWriter pw) { Map<Integer, Long> uidTimeMap = new HashMap<>(); Map<Integer, Long> uidCallCountMap = new HashMap<>(); Loading @@ -134,7 +148,7 @@ public class BinderCallsStats { } } if (mDetailedTracking) { pw.println("Raw data (uid,call_desc,cpu_time_micros,latency_time_micros,call_count):"); pw.println("Raw data (uid,call_desc,cpu_time_micros,latency_time_micros,exception_count,call_count):"); entries.sort((o1, o2) -> { if (o1.cpuTimeMicros < o2.cpuTimeMicros) { return 1; Loading @@ -157,8 +171,10 @@ public class BinderCallsStats { for (CallStat e : callStats) { sb.setLength(0); sb.append(" ") .append(uidEntry.uid).append(",").append(e).append(',').append(e.cpuTimeMicros) .append(uidEntry.uid).append(",").append(e) .append(',').append(e.cpuTimeMicros) .append(',').append(e.latencyMicros) .append(',').append(e.exceptionCount) .append(',').append(e.callCount); pw.println(sb); } Loading Loading @@ -225,6 +241,7 @@ public class BinderCallsStats { long cpuTimeMicros; long latencyMicros; long callCount; long exceptionCount; CallStat() { } Loading Loading @@ -262,6 +279,7 @@ public class BinderCallsStats { int mCallingUId; long mCpuTimeStarted; long mTimeStarted; boolean exceptionThrown; CallStat mCallStat = new CallStat(); } Loading