summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2022-04-22 01:10:45 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-04-22 01:10:45 +0000
commit692d9be97d0c6ea38a3ab8af57515509356249d7 (patch)
tree446755ca8191df912bf7c13438b84331db3e6658
parent1e95f1abadcdce7ec5d5cdff0b823263e48597e5 (diff)
parent675cc35c054f31acc9cd2562a77afea6448b1358 (diff)
Merge "Collect the max number of successive missed frames metric." into tm-dev
-rw-r--r--core/java/com/android/internal/jank/FrameTracker.java22
-rw-r--r--core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java56
2 files changed, 64 insertions, 14 deletions
diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java
index 4f51a5ba1bd1..825b486d0635 100644
--- a/core/java/com/android/internal/jank/FrameTracker.java
+++ b/core/java/com/android/internal/jank/FrameTracker.java
@@ -36,7 +36,6 @@ import android.os.Trace;
import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
-import android.util.StatsLog;
import android.view.Choreographer;
import android.view.FrameMetrics;
import android.view.SurfaceControl;
@@ -481,6 +480,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
int missedFramesCount = 0;
int missedAppFramesCount = 0;
int missedSfFramesCount = 0;
+ int maxSuccessiveMissedFramesCount = 0;
+ int successiveMissedFramesCount = 0;
for (int i = 0; i < mJankInfos.size(); i++) {
JankInfo info = mJankInfos.valueAt(i);
@@ -510,6 +511,11 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
}
if (missedFrame) {
missedFramesCount++;
+ successiveMissedFramesCount++;
+ } else {
+ maxSuccessiveMissedFramesCount = Math.max(
+ maxSuccessiveMissedFramesCount, successiveMissedFramesCount);
+ successiveMissedFramesCount = 0;
}
// TODO (b/174755489): Early latch currently gets fired way too often, so we have
// to ignore it for now.
@@ -524,6 +530,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
}
}
}
+ maxSuccessiveMissedFramesCount = Math.max(
+ maxSuccessiveMissedFramesCount, successiveMissedFramesCount);
// Log the frame stats as counters to make them easily accessible in traces.
Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#missedFrames",
@@ -536,6 +544,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
totalFramesCount);
Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#maxFrameTimeMillis",
(int) (maxFrameTimeNanos / NANOS_IN_MILLISECOND));
+ Trace.traceCounter(Trace.TRACE_TAG_APP, mSession.getName() + "#maxSuccessiveMissedFrames",
+ maxSuccessiveMissedFramesCount);
// Trigger perfetto if necessary.
if (shouldTriggerPerfetto(missedFramesCount, (int) maxFrameTimeNanos)) {
@@ -549,7 +559,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
missedFramesCount,
maxFrameTimeNanos, /* will be 0 if mSurfaceOnly == true */
missedSfFramesCount,
- missedAppFramesCount);
+ missedAppFramesCount,
+ maxSuccessiveMissedFramesCount);
}
if (DEBUG) {
Log.i(TAG, "finish: CUJ=" + mSession.getName()
@@ -558,7 +569,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
+ " missedAppFrames=" + missedAppFramesCount
+ " missedSfFrames=" + missedSfFramesCount
+ " missedFrames=" + missedFramesCount
- + " maxFrameTimeMillis=" + maxFrameTimeNanos / NANOS_IN_MILLISECOND);
+ + " maxFrameTimeMillis=" + maxFrameTimeNanos / NANOS_IN_MILLISECOND
+ + " maxSuccessiveMissedFramesCount=" + maxSuccessiveMissedFramesCount);
}
}
@@ -694,8 +706,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener
public static class StatsLogWrapper {
public void write(int code,
- int arg1, long arg2, long arg3, long arg4, long arg5, long arg6) {
- FrameworkStatsLog.write(code, arg1, arg2, arg3, arg4, arg5, arg6);
+ int arg1, long arg2, long arg3, long arg4, long arg5, long arg6, long arg7) {
+ FrameworkStatsLog.write(code, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
}
}
diff --git a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java
index 0f48465e0bdd..09fc7ea6fffd 100644
--- a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java
+++ b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java
@@ -162,7 +162,8 @@ public class FrameTrackerTest {
eq(0L) /* missedFrames */,
eq(5000000L) /* maxFrameTimeNanos */,
eq(0L) /* missedSfFramesCount */,
- eq(0L) /* missedAppFramesCount */);
+ eq(0L) /* missedAppFramesCount */,
+ eq(0L) /* maxSuccessiveMissedFramesCount */);
}
@Test
@@ -196,7 +197,8 @@ public class FrameTrackerTest {
eq(1L) /* missedFrames */,
eq(40000000L) /* maxFrameTimeNanos */,
eq(1L) /* missedSfFramesCount */,
- eq(0L) /* missedAppFramesCount */);
+ eq(0L) /* missedAppFramesCount */,
+ eq(1L) /* maxSuccessiveMissedFramesCount */);
}
@Test
@@ -230,7 +232,8 @@ public class FrameTrackerTest {
eq(0L) /* missedFrames */,
eq(4000000L) /* maxFrameTimeNanos */,
eq(0L) /* missedSfFramesCount */,
- eq(0L) /* missedAppFramesCount */);
+ eq(0L) /* missedAppFramesCount */,
+ eq(0L) /* maxSuccessiveMissedFramesCount */);
}
@Test
@@ -264,7 +267,8 @@ public class FrameTrackerTest {
eq(1L) /* missedFrames */,
eq(40000000L) /* maxFrameTimeNanos */,
eq(0L) /* missedSfFramesCount */,
- eq(1L) /* missedAppFramesCount */);
+ eq(1L) /* missedAppFramesCount */,
+ eq(1L) /* maxSuccessiveMissedFramesCount */);
}
@Test
@@ -301,7 +305,8 @@ public class FrameTrackerTest {
eq(1L) /* missedFrames */,
eq(50000000L) /* maxFrameTimeNanos */,
eq(0L) /* missedSfFramesCount */,
- eq(1L) /* missedAppFramesCount */);
+ eq(1L) /* missedAppFramesCount */,
+ eq(1L) /* maxSuccessiveMissedFramesCount */);
}
/**
@@ -340,7 +345,8 @@ public class FrameTrackerTest {
eq(0L) /* missedFrames */,
eq(4000000L) /* maxFrameTimeNanos */,
eq(0L) /* missedSfFramesCount */,
- eq(0L) /* missedAppFramesCount */);
+ eq(0L) /* missedAppFramesCount */,
+ eq(0L) /* maxSuccessiveMissedFramesCount */);
}
@Test
@@ -462,7 +468,8 @@ public class FrameTrackerTest {
eq(1L) /* missedFrames */,
eq(0L) /* maxFrameTimeNanos */,
eq(0L) /* missedSfFramesCount */,
- eq(1L) /* missedAppFramesCount */);
+ eq(1L) /* missedAppFramesCount */,
+ eq(1L) /* maxSuccessiveMissedFramesCount */);
}
@Test
@@ -496,7 +503,8 @@ public class FrameTrackerTest {
eq(0L) /* missedFrames */,
eq(0L) /* maxFrameTimeNanos */,
eq(0L) /* missedSfFramesCount */,
- eq(0L) /* missedAppFramesCount */);
+ eq(0L) /* missedAppFramesCount */,
+ eq(0L) /* maxSuccessiveMissedFramesCount */);
}
@Test
@@ -530,7 +538,37 @@ public class FrameTrackerTest {
eq(0L) /* missedFrames */,
eq(0L) /* maxFrameTimeNanos */,
eq(0L) /* missedSfFramesCount */,
- eq(0L) /* missedAppFramesCount */);
+ eq(0L) /* missedAppFramesCount */,
+ eq(0L) /* maxSuccessiveMissedFramesCount */);
+ }
+
+ @Test
+ public void testMaxSuccessiveMissedFramesCount() {
+ FrameTracker tracker = spyFrameTracker(
+ CUJ_WALLPAPER_TRANSITION, CUJ_POSTFIX, /* surfaceOnly= */ true);
+ when(mChoreographer.getVsyncId()).thenReturn(100L);
+ tracker.begin();
+ verify(mSurfaceControlWrapper).addJankStatsListener(any(), any());
+ sendFrame(tracker, JANK_SURFACEFLINGER_DEADLINE_MISSED, 100L);
+ sendFrame(tracker, JANK_SURFACEFLINGER_DEADLINE_MISSED, 101L);
+ sendFrame(tracker, JANK_APP_DEADLINE_MISSED, 102L);
+ sendFrame(tracker, JANK_NONE, 103L);
+ sendFrame(tracker, JANK_APP_DEADLINE_MISSED, 104L);
+ sendFrame(tracker, JANK_APP_DEADLINE_MISSED, 105L);
+ when(mChoreographer.getVsyncId()).thenReturn(106L);
+ tracker.end(FrameTracker.REASON_END_NORMAL);
+ sendFrame(tracker, JANK_SURFACEFLINGER_DEADLINE_MISSED, 106L);
+ sendFrame(tracker, JANK_SURFACEFLINGER_DEADLINE_MISSED, 107L);
+ verify(mSurfaceControlWrapper).removeJankStatsListener(any());
+ verify(tracker).triggerPerfetto();
+ verify(mStatsLog).write(eq(UI_INTERACTION_FRAME_INFO_REPORTED),
+ eq(CUJ_TO_STATSD_INTERACTION_TYPE[CUJ_WALLPAPER_TRANSITION]),
+ eq(6L) /* totalFrames */,
+ eq(5L) /* missedFrames */,
+ eq(0L) /* maxFrameTimeNanos */,
+ eq(2L) /* missedSfFramesCount */,
+ eq(3L) /* missedAppFramesCount */,
+ eq(3L) /* maxSuccessiveMissedFramesCount */);
}
private void sendFirstWindowFrame(FrameTracker tracker, long durationMillis,