Unity库导致Android应用调用finish()后崩溃
Unity库导致Android应用调用finish()后崩溃
看起来你遇到的是Unity集成Firebase和多人服务后,从Unity Activity返回原生Android Activity时的进程崩溃问题,我之前帮朋友排查过类似的情况,给你几个实用的排查和解决方向:
先帮你梳理下问题细节:
你开发的Android应用会打开Unity项目,Unity里用到了Firebase和Unity多人服务,关闭Unity回到原生Android Activity后,
onActivityResult能正常执行,但几秒后应用就崩溃了,Logcat里显示:unregisterNetworkCallback; CallingUid : 10176, CallingPid : 9103 Sending signal. PID: 9103 SIG: 9
SIG:9这个信号一般是系统强制杀死进程的标志,结合unregisterNetworkCallback的日志,大概率是Unity侧的后台服务(比如Firebase的网络监听、多人服务的网络回调)没正确释放,导致回到原生后,系统处理网络回调注销时出现异常,最终把整个进程杀了。
给你几个具体的解决步骤:
- 先搞定Unity端的退出前清理:在Unity项目里,一定要在退出前手动终止所有Firebase和多人服务的活跃进程,别等系统被动回收。比如:
- 针对Firebase:调用
FirebaseApp.DefaultInstance.Dispose()释放Firebase实例,同时用RemoveAllListeners()方法注销所有Realtime Database、Auth的状态监听回调。 - 针对Unity多人服务:主动断开所有房间连接,注销网络回调,比如调用
NetworkManager.Shutdown()(如果用的是Unity Netcode for GameObjects),确保所有网络相关资源都被释放。
- 针对Firebase:调用
- 原生和Unity的退出流程要联动:别在原生端直接调用
finish()关闭Unity Activity,先通过UnityPlayer.UnitySendMessage通知Unity做清理,等Unity完成后再通知原生执行退出。举个例子:
原生Android代码片段:
Unity里的QuitHandler脚本(挂载在某个活跃GameObject上):// 触发关闭Unity的逻辑时 UnityPlayer.UnitySendMessage("QuitHandler", "PerformCleanup", "");public void PerformCleanup() { // 执行Firebase和多人服务的清理逻辑 FirebaseApp.DefaultInstance.Dispose(); NetworkManager.Singleton?.Shutdown(); // 清理完成后,通知原生Activity执行finish AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); currentActivity.Call("runOnUiThread", new AndroidJavaRunnable(() => { currentActivity.Call("finish"); })); } - 给Unity Activity分配独立进程:如果上面的方法还不行,可以试试在AndroidManifest里给Unity Activity设置独立进程,让Unity的资源和原生主进程完全隔离,退出时直接杀死Unity进程,不会影响主进程。在Unity Activity的标签里添加:
不过要注意,这种方式下如果需要在原生和Unity之间传数据,得用跨进程通信的方式(比如Messenger或者AIDL),不能直接用内存共享的方式。android:process=":unity_process"
备注:内容来源于stack exchange,提问作者nadav mihov
相关产品推荐
相关产品推荐

