diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java index 4d3f7745decff..c1f0c35bedc90 100644 --- a/core/java/com/android/internal/jank/FrameTracker.java +++ b/core/java/com/android/internal/jank/FrameTracker.java @@ -394,8 +394,9 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener int totalFramesCount = 0; long maxFrameTimeNanos = 0; + int missedFramesCount = 0; int missedAppFramesCount = 0; - int missedSfFramesCounts = 0; + int missedSfFramesCount = 0; for (int i = 0; i <= indexOnOrAfterEnd; i++) { JankInfo info = mJankInfos.valueAt(i); @@ -404,17 +405,23 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener } if (info.surfaceControlCallbackFired) { totalFramesCount++; + boolean missedFrame = false; if ((info.jankType & PREDICTION_ERROR) != 0 || ((info.jankType & JANK_APP_DEADLINE_MISSED) != 0)) { Log.w(TAG, "Missed App frame:" + info.jankType); missedAppFramesCount++; + missedFrame = true; } if ((info.jankType & DISPLAY_HAL) != 0 || (info.jankType & JANK_SURFACEFLINGER_DEADLINE_MISSED) != 0 || (info.jankType & JANK_SURFACEFLINGER_GPU_DEADLINE_MISSED) != 0 || (info.jankType & SURFACE_FLINGER_SCHEDULING) != 0) { Log.w(TAG, "Missed SF frame:" + info.jankType); - missedSfFramesCounts++; + missedSfFramesCount++; + missedFrame = true; + } + if (missedFrame) { + missedFramesCount++; } // TODO (b/174755489): Early latch currently gets fired way too often, so we have // to ignore it for now. @@ -431,10 +438,12 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener } // Log the frame stats as counters to make them easily accessible in traces. + Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#missedFrames", + missedFramesCount); Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#missedAppFrames", missedAppFramesCount); Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#missedSfFrames", - missedSfFramesCounts); + missedSfFramesCount); Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#totalFrames", totalFramesCount); Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#maxFrameTimeMillis", @@ -442,7 +451,7 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener // Trigger perfetto if necessary. boolean overMissedFramesThreshold = mTraceThresholdMissedFrames != -1 - && missedAppFramesCount + missedSfFramesCounts >= mTraceThresholdMissedFrames; + && missedFramesCount >= mTraceThresholdMissedFrames; boolean overFrameTimeThreshold = mTraceThresholdFrameTimeMillis != -1 && maxFrameTimeNanos >= mTraceThresholdFrameTimeMillis * NANOS_IN_MILLISECOND; if (overMissedFramesThreshold || overFrameTimeThreshold) { @@ -453,9 +462,10 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener FrameworkStatsLog.UI_INTERACTION_FRAME_INFO_REPORTED, mSession.getStatsdInteractionType(), totalFramesCount, - missedAppFramesCount + missedSfFramesCounts, + missedFramesCount, maxFrameTimeNanos, - missedSfFramesCounts); + missedSfFramesCount, + missedAppFramesCount); if (mListener != null) { mListener.onCujEvents(mSession, ACTION_METRICS_LOGGED); } @@ -465,7 +475,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener + " (" + mBeginVsyncId + "," + mEndVsyncId + ")" + " totalFrames=" + totalFramesCount + " missedAppFrames=" + missedAppFramesCount - + " missedSfFrames=" + missedSfFramesCounts + + " missedSfFrames=" + missedSfFramesCount + + " missedFrames=" + missedFramesCount + " maxFrameTimeMillis=" + maxFrameTimeNanos / NANOS_IN_MILLISECOND); } }