【发布时间】: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