From e941d4e58b5fffaf2267721a4b50e460fe28a5ee Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Fri, 23 Apr 2021 14:58:06 +0200 Subject: [PATCH] Only start tracing in the next frame In order to match tracing markers with the metrics, we should start the tracing marker at the beginning of the next frame, as this is also the point in time where we start counting janky frames. Test: Take trace, inspect Bug: 185902609 Change-Id: I2ec70b3fc2d3236bc24891ef698fdd7ac2917b01 --- .../com/android/internal/jank/FrameTracker.java | 13 +++++++++++-- .../internal/jank/InteractionJankMonitor.java | 6 ++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java index 135c076275ba3..4d3f7745decff 100644 --- a/core/java/com/android/internal/jank/FrameTracker.java +++ b/core/java/com/android/internal/jank/FrameTracker.java @@ -102,6 +102,7 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener private boolean mMetricsFinalized; private boolean mCancelled = false; private FrameTrackerListener mListener; + private boolean mTracingStarted = false; private static class JankInfo { long frameVsyncId; @@ -207,7 +208,15 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener public synchronized void begin() { mBeginVsyncId = mChoreographer.getVsyncId() + 1; mSession.setTimeStamp(System.nanoTime()); - Trace.beginAsyncSection(mSession.getName(), (int) mBeginVsyncId); + mChoreographer.mChoreographer.postCallback(Choreographer.CALLBACK_INPUT, () -> { + synchronized (FrameTracker.this) { + if (mCancelled || mEndVsyncId != INVALID_ID) { + return; + } + mTracingStarted = true; + Trace.beginAsyncSection(mSession.getName(), (int) mBeginVsyncId); + } + }, null); mRendererWrapper.addObserver(mObserver); if (DEBUG) { Log.d(TAG, "begin: " + mSession.getName() + ", begin=" + mBeginVsyncId); @@ -255,7 +264,7 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener */ public synchronized void cancel(@Reasons int reason) { // We don't need to end the trace section if it never begun. - if (mBeginVsyncId != INVALID_ID) { + if (mTracingStarted) { Trace.endAsyncSection(mSession.getName(), (int) mBeginVsyncId); } mCancelled = true; diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java index 5ab2a82ffa3cc..04415941c5ceb 100644 --- a/core/java/com/android/internal/jank/InteractionJankMonitor.java +++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java @@ -79,6 +79,12 @@ import java.util.concurrent.TimeUnit; /** * This class let users to begin and end the always on tracing mechanism. + * + * Enabling for local development: + * + * adb shell device_config put interaction_jank_monitor enabled true + * adb shell device_config put interaction_jank_monitor sampling_interval 1 + * * @hide */ public class InteractionJankMonitor {