Unity Daydream CalledFromWrongThreadException

时间:2017-05-30 11:25:19

标签: unity3d crash crashlytics daydream

我们收到Crashlytics的错误报告,影响了我们相当大一部分用户(约占其中的10%)。它是CalledFromWrongThreadException。

问题是我不知道是什么导致了这个问题而我自己也没有。这是日志:

Caused by android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
       at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7282)
       at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1197)
       at android.view.ViewGroup.invalidateChild(ViewGroup.java:5748)
       at android.view.View.invalidateInternal(View.java:15082)
       at android.view.View.invalidate(View.java:15046)
       at android.view.View.invalidate(View.java:15029)
       at android.view.SurfaceView$1.handleMessage(SurfaceView.java:142)
       at android.os.Handler.dispatchMessage(Handler.java:105)
       at android.os.Looper.loop(Looper.java:164)
       at com.unity3d.player.UnityPlayer$c.run(Unknown Source:20)

com.unity3d.player.UnityPlayer$c.run(Unknown Source:20)在这里并不是真的有用,因为起源未知,我猜它可能来自第三方库(GVR SDK,Fabric ...)。

有没有人有同样的问题?

作为参考,我们使用Unity版本:5.6.0f3,仅针对Pixel和Pixel XL手机报告错误。

1 个答案:

答案 0 :(得分:0)

我没有关于您项目的所有细节,而且内部无法复制的错误是最糟糕的。不过,我会尝试给出一些关于发生了什么的提示。也许这些提示可以解释一些问题并帮助您找出错误的根本原因:

<强> CalledFromWrongThreadException

在Android上,只能从创建它的线程访问View。对于其他环境(WinFormsWPF等)也是如此。这个异常意味着某些东西试图从错误的线程中访问某些UI元素(SurfaceView)。

<强> com.unity3d.player.UnityPlayer $ c.run

堆栈跟踪源自一些自定义Unity管道代码。虽然这并没有给出这个调用来自哪里(在你的C#代码中)的线索,但它可能意味着代码来自C#(使用AndroidJavaObject或AndroidJavaClass调用)。 Unity的脚本线程与Android的主线程不同,所以这与你得到的异常类型一起有意义。

作为测试,我使用此代码来模拟相同的异常:

using (var actClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) 
{
    var activity = actClass.GetStatic<AndroidJavaObject>("currentActivity");

    // cause an exception to be thrown
    activity.Call("setContentView", 15);
}

这导致了以下异常,这与你得到的异常非常相似(至少在它的根目录下)。

  

E / ViewRootImpl(19244):com.test.crash.GameActivity:只有原版   创建视图层次结构的线程可以触及其视图。   E / ViewRootImpl(19244):java.lang.RuntimeException   E / ViewRootImpl(19244):at   android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7105)   E / ViewRootImpl(19244):at   android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1139)   E / ViewRootImpl(19244):at   android.view.ViewGroup.invalidateChild(ViewGroup.java:5254)   E / ViewRootImpl(19244):at   android.view.View.invalidateInternal(View.java:13669)   E / ViewRootImpl(19244):at   android.view.View.invalidate(View.java:13633)E / ViewRootImpl(19244):     在android.view.View.onFocusChanged(View.java:6204)   E / ViewRootImpl(19244):at   android.view.View.clearFocusInternal(View.java:6089)   E / ViewRootImpl(19244):在android.view.View.unFocus(View.java:6122)   E / ViewRootImpl(19244):at   android.view.ViewGroup.unFocus(ViewGroup.java:997)   E / ViewRootImpl(19244):at   android.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:4946)   E / ViewRootImpl(19244):at   android.view.ViewGroup.removeAllViews(ViewGroup.java:4905)   E / ViewRootImpl(19244):at   com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:410)   E / ViewRootImpl(19244):at   android.app.Activity.setContentView(Activity.java:2423)   E / ViewRootImpl(19244):at   com.unity3d.player.UnityPlayer.nativeRender(原生方法)   E / ViewRootImpl(19244):at com.unity3d.player.UnityPlayer.a(Unknown   来源)E / ViewRootImpl(19244):at   com.unity3d.player.UnityPlayer $ c $ 1.handleMessage(未知来源)   E / ViewRootImpl(19244):at   android.os.Handler.dispatchMessage(Handler.java:98)   E / ViewRootImpl(19244):在android.os.Looper.loop(Looper.java:173)   E / ViewRootImpl(19244):at   com.unity3d.player.UnityPlayer $ c.run(未知来源)

<强>摘要

正如我之前提到的,这只会给你一个指望的方向。希望您能够找到可能导致此问题的潜在位置(可能是插件代码)。我很乐意进一步协助(在评论中,或随意contact me)。