Unity-Firebase Crashlytics安卓上传符号表
最近项目线上突然多了不少崩溃记录,但是看不到崩溃的具体方法。
简单写下过程,很多都是文档有的,就不抄一遍了。毕竟这都是接好就忘的东西。
ios 没啥问题,就不记录了。
什么是符号表
符号表是内存地址与函数名、文件名、行号的映射表。有了符号表,才能根据程序堆栈看出方法调用过程。
格式:<起始地址> <结束地址> <函数> [<文件名:行号>]
Unity 安卓工程的符号表在哪里
有三种符号文件:libmain,libunity,libil2cpp
不同的打包方式和代码裁剪设置,获取符号文件的方式不一样。
我们打包是导出安卓工程,不裁剪代码。所以从编辑器安装目录
Unity Manual : Android symbols
Firebase 上无 NDK 符号表的解决
上传符号表到 Firebase
两种方法。
-
通过 gradle 上传
但是不知为何,libil2cpp 始终无法解析成功,符号文件的 uuid 应该是正确的,因为用第二种方法上传后,就可以解析。
Firebase 文档:获取 Android NDK 崩溃报告 -
通过 firebase cli 命令上传,最后用这个方法才能解析 il2cpp.so。FIREBASE_APP_ID 在 Firebase Crashlytics 控制台拿,符号文件需要自己符号表收集一个文件夹中,然后指定上传这个文件夹。
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
如何触发 Unity Crash
Unity 提供了方法,有好几种类型,但这种是我验证过可以触发后台记录的。
UnityEngine.Diagnostics.Utils.ForceCrash(UnityEngine.Diagnostics.ForcedCrashCategory.AccessViolation);
Unity异常处理与分析
用addr2line手动解析函数地址 Symbolicate Android crash
部分参考代码
apkProjectPath = '安卓导出工程路径'
editorPath = 'Unity 编辑器路径'
editorSymbolsPath = editorPath + "/../../../PlaybackEngines/AndroidPlayer/Variations/il2cpp/Release/Symbols"
if 测试包:
editorSymbolsPath = editorSymbolsPath.replace("/Release/Symbols", "/Development/Symbols")
apkProjSymbolsPath = apkProjectPath + "/unityLibrary/symbols"
FileUtil.copyfile(
editorSymbolsPath + "/arm64-v8a/libmain.sym.so",
apkProjSymbolsPath + "/arm64-v8a/libmain.so")
FileUtil.copyfile(
editorSymbolsPath + "/arm64-v8a/libunity.sym.so",
apkProjSymbolsPath + "/arm64-v8a/libunity.so")
FileUtil.copyfile(
editorSymbolsPath + "/armeabi-v7a/libmain.sym.so",
apkProjSymbolsPath + "/armeabi-v7a/libmain.so")
FileUtil.copyfile(
editorSymbolsPath + "/armeabi-v7a/libunity.sym.so",
apkProjSymbolsPath + "/armeabi-v7a/libunity.so")
# 用这个方法,il2cpp 解析不了,不知为何
# cmddSYM = "./gradlew app:uploadCrashlyticsSymbolFileGoogleRelease"
firebaseAppId = "firebase 应用 id"
cmddSYM = "firebase crashlytics:symbols:upload --app=%s %s"% (firebaseAppId, apkProjSymbolsPath)
执行命令 cmddSym