diff options
| -rw-r--r-- | core/java/com/android/internal/jank/InteractionJankMonitor.java | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/core/java/com/android/internal/jank/InteractionJankMonitor.java b/core/java/com/android/internal/jank/InteractionJankMonitor.java index 72de78c148f8..9357def20a65 100644 --- a/core/java/com/android/internal/jank/InteractionJankMonitor.java +++ b/core/java/com/android/internal/jank/InteractionJankMonitor.java @@ -431,6 +431,22 @@ public class InteractionJankMonitor { @VisibleForTesting public FrameTracker createFrameTracker(Configuration config, Session session) { final View view = config.mView; + + if (!config.hasValidView()) { + boolean attached = false; + boolean hasViewRoot = false; + boolean hasRenderer = false; + if (view != null) { + attached = view.isAttachedToWindow(); + hasViewRoot = view.getViewRootImpl() != null; + hasRenderer = view.getThreadedRenderer() != null; + } + Log.d(TAG, "create FrameTracker fails: view=" + view + + ", attached=" + attached + ", hasViewRoot=" + hasViewRoot + + ", hasRenderer=" + hasRenderer, new Throwable()); + return null; + } + final ThreadedRendererWrapper threadedRenderer = view == null ? null : new ThreadedRendererWrapper(view.getThreadedRenderer()); final ViewRootWrapper viewRoot = @@ -537,6 +553,7 @@ public class InteractionJankMonitor { // begin a new trace session. tracker = createFrameTracker(conf, new Session(cujType, conf.mTag)); + if (tracker == null) return false; putTracker(cujType, tracker); tracker.begin(); @@ -1054,9 +1071,19 @@ public class InteractionJankMonitor { msg.append("Must pass in a valid surface control if only instrument surface; "); } } else { - if (mView == null || !mView.isAttachedToWindow()) { + if (!hasValidView()) { shouldThrow = true; - msg.append("Null view or unattached view while instrumenting view; "); + boolean attached = false; + boolean hasViewRoot = false; + boolean hasRenderer = false; + if (mView != null) { + attached = mView.isAttachedToWindow(); + hasViewRoot = mView.getViewRootImpl() != null; + hasRenderer = mView.getThreadedRenderer() != null; + } + String err = "invalid view: view=" + mView + ", attached=" + attached + + ", hasViewRoot=" + hasViewRoot + ", hasRenderer=" + hasRenderer; + msg.append(err); } } if (shouldThrow) { @@ -1064,6 +1091,12 @@ public class InteractionJankMonitor { } } + boolean hasValidView() { + return mSurfaceOnly + || (mView != null && mView.isAttachedToWindow() + && mView.getViewRootImpl() != null && mView.getThreadedRenderer() != null); + } + /** * @return true if only instrumenting surface, false otherwise */ |