Unity Daydream CalledFromWrongThreadException

Que*_*tin 5 crash unity-game-engine 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)
Run Code Online (Sandbox Code Playgroud)

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

有没有人有同样的问题?

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

lys*_*cid 0

我没有关于你的项目的所有细节,并且无法在内部重现的错误是最糟糕的。尽管如此,我还是会尝试给出一些关于正在发生的事情的提示。也许这些提示可以提供一些线索并帮助您找出错误的根本原因:

调用来自错误线程异常

在 Android 上,视图只能从创建它的线程中访问。对于其他环境( 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);
}
Run Code Online (Sandbox Code Playgroud)

这导致了以下异常,该异常与您遇到的异常非常相似(至少在其根源上)。

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

概括

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