summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/com/android/internal/jank/InteractionJankMonitor.java37
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
*/