Merge "Make sure the removeObservers be called correctly" into sc-v2-dev

This commit is contained in:
Wu Ahan
2021-09-06 03:18:43 +00:00
committed by Android (Google) Code Review

View File

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