Unity-Firebase Crashlytics安卓上传符号表

最近项目线上突然多了不少崩溃记录,但是看不到崩溃的具体方法。
简单写下过程,很多都是文档有的,就不抄一遍了。毕竟这都是接好就忘的东西。
ios 没啥问题,就不记录了。

什么是符号表

符号表是内存地址与函数名、文件名、行号的映射表。有了符号表,才能根据程序堆栈看出方法调用过程。
格式:<起始地址> <结束地址> <函数> [<文件名:行号>]

Unity 安卓工程的符号表在哪里

有三种符号文件:libmain,libunity,libil2cpp

不同的打包方式和代码裁剪设置,获取符号文件的方式不一样。
我们打包是导出安卓工程,不裁剪代码。所以从编辑器安装目录 /PlaybackEngines/AndroidPlayer/Variations///Symbols 拿到 libmain 和 libunity,从导出工程的 unityLibrary/symbols 拿到 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

为非 Gradle 构建或不可访问的未剥离本机库上传符号

如何触发 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
posted @ 2022-10-30 12:11  尼克多摩雄  阅读(1870)  评论(0编辑  收藏  举报