diff options
| author | 2023-10-20 08:45:49 +0000 | |
|---|---|---|
| committer | 2023-10-20 08:45:49 +0000 | |
| commit | 69c57d24416bfacc7412268eb49fd563ec210976 (patch) | |
| tree | 14e04c7cf3b8c6b315c1aee1f535e42442e494bd | |
| parent | 327d00716cf8866c2040d94b8c4fd9198f8aea04 (diff) | |
| parent | 69998eb706fab50390f14f6702a47e6da7d3a64a (diff) | |
Merge "Add logs and traces when draw doesn't run" into main
| -rw-r--r-- | core/java/android/view/ViewRootImpl.java | 63 |
1 files changed, 49 insertions, 14 deletions
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 50eeed81e16b..a7b3c10edd44 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -661,6 +661,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; @@ -1926,12 +1930,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(); } @@ -3292,8 +3303,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)); } @@ -3882,11 +3893,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. @@ -3910,6 +3917,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) { @@ -3921,12 +3931,23 @@ public final class ViewRootImpl implements ViewParent, handleSyncRequestWhenNoAsyncDraw(mActiveSurfaceSyncGroup, mHasPendingTransactions, mPendingTransaction, "view not visible"); } else if (cancelAndRedraw) { + if (!mWasLastDrawCanceled) { + 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(); @@ -3938,6 +3959,8 @@ public final class ViewRootImpl implements ViewParent, mPendingTransaction, mLastPerformDrawSkippedReason); } } + mWasLastDrawCanceled = cancelAndRedraw; + mLastTraversalWasVisible = isViewVisible; if (mAttachInfo.mContentCaptureEvents != null) { notifyContentCaptureEvents(); @@ -4733,10 +4756,7 @@ public final class ViewRootImpl implements ViewParent, return didProduceBuffer -> { if (!didProduceBuffer) { - Trace.instant(Trace.TRACE_TAG_VIEW, - "Transaction not synced due to no frame drawn-" + mTag); - Log.d(mTag, "Pending transaction will not be applied in sync with a draw " - + "because there was nothing new to draw"); + logAndTrace("Transaction not synced due to no frame drawn"); mBlastBufferQueue.applyPendingTransactions(frame); } }; @@ -4753,17 +4773,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(); @@ -11517,8 +11546,7 @@ public final class ViewRootImpl implements ViewParent, @Override public boolean applyTransactionOnDraw(@NonNull SurfaceControl.Transaction t) { if (mRemoved || !isHardwareEnabled()) { - Trace.instant(Trace.TRACE_TAG_VIEW, "applyTransactionOnDraw applyImmediately-" + mTag); - Log.d(mTag, "applyTransactionOnDraw: Applying transaction immediately"); + logAndTrace("applyTransactionOnDraw applyImmediately"); t.apply(); } else { Trace.instant(Trace.TRACE_TAG_VIEW, "applyTransactionOnDraw-" + mTag); @@ -11995,4 +12023,11 @@ public final class ViewRootImpl implements ViewParent, public float getPreferredFrameRate() { return mPreferredFrameRate; } + + private void logAndTrace(String msg) { + if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { + Trace.instant(Trace.TRACE_TAG_VIEW, mTag + "-" + msg); + } + Log.d(mTag, msg); + } } |