Loading core/java/com/android/internal/jank/FrameTracker.java +54 −45 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import com.android.internal.util.FrameworkStatsLog; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.concurrent.TimeUnit; /** * A class that allows the app to get the frame metrics from HardwareRendererObserver. Loading Loading @@ -108,6 +109,7 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener private boolean mCancelled = false; private FrameTrackerListener mListener; private boolean mTracingStarted = false; private Runnable mWaitForFinishTimedOut; private static class JankInfo { long frameVsyncId; Loading Loading @@ -174,8 +176,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener // If the surface isn't valid yet, wait until it's created. if (mViewRoot.getSurfaceControl().isValid()) { mSurfaceControl = mViewRoot.getSurfaceControl(); mSurfaceChangedCallback = null; } else { } mSurfaceChangedCallback = new ViewRootImpl.SurfaceChangedCallback() { @Override public void surfaceCreated(SurfaceControl.Transaction t) { Loading Loading @@ -221,7 +223,6 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener mViewRoot.addSurfaceChangedCallback(mSurfaceChangedCallback); } } } /** * Begin a trace session of the CUJ. Loading Loading @@ -283,10 +284,17 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener if (mListener != null) { mListener.onCujEvents(mSession, ACTION_SESSION_END); } } // We don't remove observer here, // will remove it when all the frame metrics in this duration are called back. // See onFrameMetricsAvailable for the logic of removing the observer. // Let's wait for all callbacks to finish for at most a minute. mWaitForFinishTimedOut = () -> { Log.e(TAG, "force finish cuj because of time out:" + mSession.getName()); finish(mJankInfos.size() - 1); }; mHandler.postDelayed(mWaitForFinishTimedOut, TimeUnit.MINUTES.toMillis(1)); } } /** Loading Loading @@ -423,7 +431,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener } private void finish(int indexOnOrAfterEnd) { mHandler.removeCallbacks(mWaitForFinishTimedOut); mWaitForFinishTimedOut = null; mMetricsFinalized = true; // The tracing has been ended, remove the observer, see if need to trigger perfetto. Loading Loading @@ -509,7 +518,7 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener } } if (DEBUG) { Log.i(TAG, "FrameTracker: CUJ=" + mSession.getName() Log.i(TAG, "finish: CUJ=" + mSession.getName() + " (" + mBeginVsyncId + "," + mEndVsyncId + ")" + " totalFrames=" + totalFramesCount + " missedAppFrames=" + missedAppFramesCount Loading Loading
core/java/com/android/internal/jank/FrameTracker.java +54 −45 Original line number Diff line number Diff line Loading @@ -51,6 +51,7 @@ import com.android.internal.util.FrameworkStatsLog; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.concurrent.TimeUnit; /** * A class that allows the app to get the frame metrics from HardwareRendererObserver. Loading Loading @@ -108,6 +109,7 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener private boolean mCancelled = false; private FrameTrackerListener mListener; private boolean mTracingStarted = false; private Runnable mWaitForFinishTimedOut; private static class JankInfo { long frameVsyncId; Loading Loading @@ -174,8 +176,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener // If the surface isn't valid yet, wait until it's created. if (mViewRoot.getSurfaceControl().isValid()) { mSurfaceControl = mViewRoot.getSurfaceControl(); mSurfaceChangedCallback = null; } else { } mSurfaceChangedCallback = new ViewRootImpl.SurfaceChangedCallback() { @Override public void surfaceCreated(SurfaceControl.Transaction t) { Loading Loading @@ -221,7 +223,6 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener mViewRoot.addSurfaceChangedCallback(mSurfaceChangedCallback); } } } /** * Begin a trace session of the CUJ. Loading Loading @@ -283,10 +284,17 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener if (mListener != null) { mListener.onCujEvents(mSession, ACTION_SESSION_END); } } // We don't remove observer here, // will remove it when all the frame metrics in this duration are called back. // See onFrameMetricsAvailable for the logic of removing the observer. // Let's wait for all callbacks to finish for at most a minute. mWaitForFinishTimedOut = () -> { Log.e(TAG, "force finish cuj because of time out:" + mSession.getName()); finish(mJankInfos.size() - 1); }; mHandler.postDelayed(mWaitForFinishTimedOut, TimeUnit.MINUTES.toMillis(1)); } } /** Loading Loading @@ -423,7 +431,8 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener } private void finish(int indexOnOrAfterEnd) { mHandler.removeCallbacks(mWaitForFinishTimedOut); mWaitForFinishTimedOut = null; mMetricsFinalized = true; // The tracing has been ended, remove the observer, see if need to trigger perfetto. Loading Loading @@ -509,7 +518,7 @@ public class FrameTracker extends SurfaceControl.OnJankDataListener } } if (DEBUG) { Log.i(TAG, "FrameTracker: CUJ=" + mSession.getName() Log.i(TAG, "finish: CUJ=" + mSession.getName() + " (" + mBeginVsyncId + "," + mEndVsyncId + ")" + " totalFrames=" + totalFramesCount + " missedAppFrames=" + missedAppFramesCount Loading