diff options
author | Chavi Weingarten <chaviw@google.com> | 2023-10-19 08:55:45 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-10-20 16:29:58 +0000 |
commit | 803ac6538fd26e39942e51930a0a3c7d8a0e8e06 (patch) | |
tree | eec74eb0f616917eeee22db438c393718b91856e | |
parent | e119ee828dbc371dd40c5acba24e8cd3fe5d12db (diff) | |
download | base-803ac6538fd26e39942e51930a0a3c7d8a0e8e06.tar.gz |
Add logs and traces when draw doesn't run
Add additional traces and logs that will provide more info on when a
draw doesn't proceed due to screen being turned off, content not
visible, or if draw is canceled.
Bug: 284687313
Bug: 305595315
Test: Logcat and perfetto traces
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:85c3259e9308c12fbd727cccad002b12628a9ef0)
Merged-In: Ieacc78332716aa6628d67ca3227b6995ec7bb49e
Change-Id: Ieacc78332716aa6628d67ca3227b6995ec7bb49e
-rw-r--r-- | core/java/android/view/ViewRootImpl.java | 53 |
1 files changed, 45 insertions, 8 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index a5f5818b14d3..cb39a5c3f6ee 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -779,6 +779,10 @@ public final class ViewRootImpl implements ViewParent, */ private boolean mCheckIfCanDraw = false; + private boolean mWasLastDrawCanceled; + private boolean mLastTraversalWasVisible = true; + private boolean mLastDrawScreenOff; + private boolean mDrewOnceForSync = false; int mSyncSeqId = 0; @@ -2007,12 +2011,19 @@ public final class ViewRootImpl implements ViewParent, } void handleAppVisibility(boolean visible) { + if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { + Trace.instant(Trace.TRACE_TAG_VIEW, TextUtils.formatSimple( + "%s visibilityChanged oldVisibility=%b newVisibility=%b", mTag, + mAppVisible, visible)); + } if (mAppVisible != visible) { final boolean previousVisible = getHostVisibility() == View.VISIBLE; mAppVisible = visible; final boolean currentVisible = getHostVisibility() == View.VISIBLE; // Root view only cares about whether it is visible or not. if (previousVisible != currentVisible) { + Log.d(mTag, "visibilityChanged oldVisibility=" + previousVisible + " newVisibility=" + + currentVisible); mAppVisibilityChanged = true; scheduleTraversals(); } @@ -3377,8 +3388,8 @@ public final class ViewRootImpl implements ViewParent, || mForceNextWindowRelayout) { if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { Trace.traceBegin(Trace.TRACE_TAG_VIEW, - TextUtils.formatSimple("relayoutWindow#" - + "first=%b/resize=%b/vis=%b/params=%b/force=%b", + TextUtils.formatSimple("%s-relayoutWindow#" + + "first=%b/resize=%b/vis=%b/params=%b/force=%b", mTag, mFirst, windowShouldResize, viewVisibilityChanged, params != null, mForceNextWindowRelayout)); } @@ -3962,11 +3973,7 @@ public final class ViewRootImpl implements ViewParent, boolean cancelDueToPreDrawListener = mAttachInfo.mTreeObserver.dispatchOnPreDraw(); boolean cancelAndRedraw = cancelDueToPreDrawListener || (cancelDraw && mDrewOnceForSync); - if (cancelAndRedraw) { - Log.d(mTag, "Cancelling draw." - + " cancelDueToPreDrawListener=" + cancelDueToPreDrawListener - + " cancelDueToSync=" + (cancelDraw && mDrewOnceForSync)); - } + if (!cancelAndRedraw) { // A sync was already requested before the WMS requested sync. This means we need to // sync the buffer, regardless if WMS wants to sync the buffer. @@ -3990,6 +3997,9 @@ public final class ViewRootImpl implements ViewParent, } if (!isViewVisible) { + if (mLastTraversalWasVisible) { + logAndTrace("Not drawing due to not visible"); + } mLastPerformTraversalsSkipDrawReason = "view_not_visible"; if (mPendingTransitions != null && mPendingTransitions.size() > 0) { for (int i = 0; i < mPendingTransitions.size(); ++i) { @@ -4002,12 +4012,21 @@ public final class ViewRootImpl implements ViewParent, mActiveSurfaceSyncGroup.markSyncReady(); } } else if (cancelAndRedraw) { + logAndTrace("Canceling draw." + + " cancelDueToPreDrawListener=" + cancelDueToPreDrawListener + + " cancelDueToSync=" + (cancelDraw && mDrewOnceForSync)); mLastPerformTraversalsSkipDrawReason = cancelDueToPreDrawListener ? "predraw_" + mAttachInfo.mTreeObserver.getLastDispatchOnPreDrawCanceledReason() : "cancel_" + cancelReason; // Try again scheduleTraversals(); } else { + if (mWasLastDrawCanceled) { + logAndTrace("Draw frame after cancel"); + } + if (!mLastTraversalWasVisible) { + logAndTrace("Start draw after previous draw not visible"); + } if (mPendingTransitions != null && mPendingTransitions.size() > 0) { for (int i = 0; i < mPendingTransitions.size(); ++i) { mPendingTransitions.get(i).startChangingAnimations(); @@ -4018,6 +4037,8 @@ public final class ViewRootImpl implements ViewParent, mActiveSurfaceSyncGroup.markSyncReady(); } } + mWasLastDrawCanceled = cancelAndRedraw; + mLastTraversalWasVisible = isViewVisible; if (mAttachInfo.mContentCaptureEvents != null) { notifyContentCaptureEvents(); @@ -4821,17 +4842,26 @@ public final class ViewRootImpl implements ViewParent, mLastPerformDrawSkippedReason = null; if (mAttachInfo.mDisplayState == Display.STATE_OFF && !mReportNextDraw) { mLastPerformDrawSkippedReason = "screen_off"; + if (!mLastDrawScreenOff) { + logAndTrace("Not drawing due to screen off"); + } + mLastDrawScreenOff = true; return false; } else if (mView == null) { mLastPerformDrawSkippedReason = "no_root_view"; return false; } + if (mLastDrawScreenOff) { + logAndTrace("Resumed drawing after screen turned on"); + mLastDrawScreenOff = false; + } + final boolean fullRedrawNeeded = mFullRedrawNeeded || surfaceSyncGroup != null; mFullRedrawNeeded = false; mIsDrawing = true; - Trace.traceBegin(Trace.TRACE_TAG_VIEW, "draw"); + Trace.traceBegin(Trace.TRACE_TAG_VIEW, mTag + "-draw"); addFrameCommitCallbackIfNeeded(); @@ -11794,4 +11824,11 @@ public final class ViewRootImpl implements ViewParent, @NonNull Consumer<Boolean> listener) { t.clearTrustedPresentationCallback(getSurfaceControl()); } + + private void logAndTrace(String msg) { + if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { + Trace.instant(Trace.TRACE_TAG_VIEW, mTag + "-" + msg); + } + Log.d(mTag, msg); + } } |