【问题标题】:Firestore Listener Crashes Unity App On Android, but works fine in the Unity editor. How do I solve this?Firestore 侦听器在 Android 上使 Unity 应用程序崩溃,但在 Unity 编辑器中运行良好。我该如何解决这个问题?
【发布时间】:2021-02-10 17:37:12
【问题描述】:

任何帮助将不胜感激。

崩溃
我的 Unity 应用使用 Firebase Firestore 侦听器来接收数据。在 Unity 编辑器中,一切运行良好,我从未收到错误消息。我在我的 Android 设备 (Pixel 2) 上构建,但它在启动后大约一秒钟就崩溃了。

我查看了 Android Logcat 并注意到它所做的最后一件事是接收来自 Firestore 的回调:

2021/02/10 17:45:17.898 26111 26146 Info Unity Received Public Projects Query Callback. No pending writes, so we can update the Projects. Documents: 2
2021/02/10 17:45:17.898 26111 26146 Info Unity ArchViewer.<>c:<ListenToPublicProjects>b__67_0(QuerySnapshot)
2021/02/10 17:45:17.898 26111 26146 Info Unity System.Action`1:Invoke(T)
2021/02/10 17:45:17.898 26111 26146 Info Unity Firebase.Firestore.<Listen>c__AnonStorey1:<>m__0()
2021/02/10 17:45:17.898 26111 26146 Info Unity System.Func`1:Invoke()
2021/02/10 17:45:17.898 26111 26146 Info Unity System.Action`3:Invoke(T1, T2, T3)
2021/02/10 17:45:17.898 26111 26146 Info Unity Firebase.Firestore.Query:QuerySnapshotsHandler(Int32, IntPtr, FirestoreError, String)
2021/02/10 17:45:17.898 26111 26146 Info Unity Firebase.AppUtilPINVOKE:PollCallbacks()
2021/02/10 17:45:17.898 26111 26146 Info Unity Firebase.AppUtil:PollCallbacks()
2021/02/10 17:45:17.898 26111 26146 Info Unity Firebase.Platform.FirebaseHandler:Update()
2021/02/10 17:45:17.898 26111 26146 Info Unity 

之后发生致命错误:

2021/02/10 17:45:17.908 26111 26146 Fatal igns.ArchViewe java_vm_ext.cc:577] JNI DETECTED ERROR IN APPLICATION: mid == null
2021/02/10 17:45:17.908 26111 26146 Fatal igns.ArchViewe java_vm_ext.cc:577]     in call to CallObjectMethodV
2021/02/10 17:45:17.908 26111 26146 Fatal igns.ArchViewe java_vm_ext.cc:577]     from boolean com.unity3d.player.UnityPlayer.nativeRender()
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655] Runtime aborting...
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655] Dumping all threads without mutator lock held
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655] All threads:
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655] DALVIK THREADS (46):
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655] "Jit thread pool worker thread 0" prio=5 tid=7 Runnable
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   | group="" sCount=0 dsCount=0 flags=0 obj=0x132c0228 self=0x7937c4f010
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   | sysTid=26122 nice=0 cgrp=default sched=0/0 handle=0x77b45eed00
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   | state=R schedstat=( 67570784 10588910 215 ) utm=4 stm=1 core=6 HZ=100
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   | stack=0x77b44f0000-0x77b44f2000 stackSize=1023KB
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   | held mutexes= "mutator lock"(shared held)
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   native: #00 pc 00000000004a53f4  /apex/com.android.art/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+140)
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   native: #01 pc 00000000005b42b4  /apex/com.android.art/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool, BacktraceMap*, bool) const+372)
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   native: #02 pc 00000000005d1854  /apex/com.android.art/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+924)
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   native: #03 pc 00000000005b5220  /apex/com.android.art/lib64/libart.so (art::Thread::RunCheckpointFunction()+176)
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   native: #04 pc 0000000000346168  /apex/com.android.art/lib64/libart.so (art::jit::JitCompileTask::Run(art::Thread*)+1312)
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   native: #05 pc 00000000005d2814  /apex/com.android.art/lib64/libart.so (art::ThreadPoolWorker::Run()+108)
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   native: #06 pc 00000000005d22f8  /apex/com.android.art/lib64/libart.so (art::ThreadPoolWorker::Callback(void*)+192)
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   native: #07 pc 00000000000b0758  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+64)
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   native: #08 pc 0000000000050150  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)
2021/02/10 17:45:18.122 26111 26146 Fatal igns.ArchViewe runtime.cc:655]   (no managed stack frames)

还有 2700 行……甚至不知道要看哪个部分。

设置 Firestore 监听器的代码(但不要认为问题出在代码中,因为它在 Unity 编辑器中运行良好):

public static ListenerRegistration ListenToPublicProjects(Timestamp LastModified)
        {
            Query queryRef = database.Collection(ProjectsCollection).WhereEqualTo(ProjectTypeField, 1)
                .WhereGreaterThan(LastModifiedField, LastModified);

            ListenerRegistration listener = queryRef.Listen(snapshot =>
            {
                if (snapshot.Metadata.HasPendingWrites)
                {   Debug.Log("Received Public Projects Query Callback. Still waiting for pending writes before we can update the Projects..."); return; }
                else
                    Debug.Log("Received Public Projects Query Callback. No pending writes, so we can update the Projects. Documents: " + snapshot.Count);

                if (snapshot.Count == 0)
                {   Debug.Log("Public Projects Query is empty"); return; }


                foreach (DocumentChange change in snapshot.GetChanges())
                {
                    DocumentSnapshot document = change.Document;
                    ArchProjectData projectData = ArchProjectData.FromDictionary(document.ToDictionary());
                    ArchProject project = AssemblyManager.CreateProject(projectData);

                    if (change.ChangeType == DocumentChange.Type.Added)
                    {
                        Debug.Log(String.Format("New public project: {0}", change.Document.Id));
                        ReferenceManager.AddProject(project, ProjectList.PublicProjects);
                    }
                    else if (change.ChangeType == DocumentChange.Type.Modified)
                    {
                        Debug.Log(String.Format("Modified public project: {0}", change.Document.Id));
                        ReferenceManager.UpdateProject(project, ProjectList.PublicProjects);
                    }
                    else if (change.ChangeType == DocumentChange.Type.Removed)
                    {
                        Debug.Log(String.Format("Removed public project: {0}", change.Document.Id));
                        ReferenceManager.RemoveProject(project, ProjectList.PublicProjects);
                    }
                }

                OnPublicProjectsReceived?.Invoke();
            });
            return listener;
        }

背景信息
Unity 版本:2020.2.3
Firebase SDK 版本:7.0.2
安卓版本:11

由于这次崩溃,我决定从头开始完全重建我的项目,以确保没有其他任何干扰,但它仍然发生了。我将如何解决这个问题?

【问题讨论】:

  • 用于游戏的 Firestore 处于测试阶段。尽管 Android 和 iOS 已经“出局”了一段时间,但由于您的调用堆栈中有 JNI,因此很有可能是 beta 游戏层导致了问题。因为他们真的想尽快让 Firestore 成为金牌,所以团队在 GitHub 上非常活跃,你一定要再问一次:github.com/firebase/quickstart-unity/labels/api%3A%20firestore
  • 话虽如此,而且由于它是特定于 Android 的,我想知道 CheckAndFixDependenciesAsync 是否有任何有趣之处。您是 await'ing 还是继续运行它(例如 FirebaseApp.CheckAndFixDependenciesAsync.ContinueWithOnMainThread(task=>{/*cool stuff here*/}); )或确保在运行此代码之前以任何其他方式等待?
  • 您好帕特里克,感谢您的回复!接下来我会在 Github 上发布我的问题。
  • 我是 await 正在检查 CheckAndFixDependenciesAsync。这肯定是通过 CheckAndFixDependencies 完成的,因为在那之后我初始化了我的 FirestoreManager,这是发送 Listener 所需要的。
  • 我已经查明问题发生在哪里,并且在调用 change.ChangeType 时发生

标签: android firebase unity3d google-cloud-firestore crash


【解决方案1】:

调用change.ChangeType时出现问题。我在这里找到了解决方法:https://github.com/firebase/quickstart-unity/issues/889#issuecomment-745695182

这是代码的变通方法:

public DocumentChange.Type GetChangeType(DocumentChange change) {
  if (change.OldIndex < 0) {
    return DocumentChange.Type.Added;
  } else if (change.NewIndex < 0) {
    return DocumentChange.Type.Removed;
  } else {
    return DocumentChange.Type.Modified;
  }
}

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    相关资源
    最近更新 更多