diff options
author | Ahan Wu <ahanwu@google.com> | 2021-09-02 19:34:22 -0800 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-09-20 22:30:47 +0000 |
commit | f7a13b00e3ab25a17f4252953a6bbcd9b305d0ca (patch) | |
tree | 5b9e734adcbad18174920a80dc420e08b80c9ede | |
parent | 8e34617207a608f8657522f5c3b3529c2b60ec9e (diff) | |
download | base-f7a13b00e3ab25a17f4252953a6bbcd9b305d0ca.tar.gz |
Make sure the removeObservers be called correctly
Handle the surface destroyed case and add a timeout for finish call.
Bug: 196171638
Bug: 197555842
Test: adb shell dumpsys SurfaceFlinger
Test: check the offscreen layers
Test: see 198714745#comment6
Change-Id: Ic6d2521d788c50e10b81b556849194a97f240376
Merged-In: Iec1eb82d1a4756a7b85c8fbdd05f4132a74c613c
(cherry picked from commit 59e29276f9a7c1f79fda46c60a49589fc0af7ee3)
-rw-r--r-- | core/java/com/android/internal/jank/FrameTracker.java | 19 | ||||
-rw-r--r-- | core/java/com/android/internal/jank/InteractionJankMonitor.java | 2 |
2 files changed, 15 insertions, 6 deletions
diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java index 8e7fae7aa061..d12c870d2591 100644 --- a/core/java/com/android/internal/jank/FrameTracker.java +++ b/core/java/com/android/internal/jank/FrameTracker.java @@ -50,6 +50,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. @@ -103,6 +104,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; @@ -263,10 +265,16 @@ 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. + // Waiting at most 10 seconds for all callbacks to finish. + mWaitForFinishTimedOut = () -> { + Log.e(TAG, "force finish cuj because of time out:" + mSession.getName()); + finish(mJankInfos.size() - 1); + }; + mHandler.postDelayed(mWaitForFinishTimedOut, TimeUnit.SECONDS.toMillis(10)); } - // 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. } /** @@ -396,7 +404,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. @@ -481,7 +490,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 diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java index aabcd7f82ac7..610cd7339001 100644 --- a/core/java/com/android/internal/jank/InteractionJankMonitor.java +++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java @@ -103,7 +103,7 @@ public class InteractionJankMonitor { private static final String ACTION_PREFIX = InteractionJankMonitor.class.getCanonicalName(); private static final String DEFAULT_WORKER_NAME = TAG + "-Worker"; - private static final long DEFAULT_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(5L); + private static final long DEFAULT_TIMEOUT_MS = TimeUnit.SECONDS.toMillis(2L); private static final String SETTINGS_ENABLED_KEY = "enabled"; private static final String SETTINGS_SAMPLING_INTERVAL_KEY = "sampling_interval"; private static final String SETTINGS_THRESHOLD_MISSED_FRAMES_KEY = |