Codemagic构建Flutter应用自动上传dSYM至Firebase Crashlytics问题咨询
关于Codemagic构建Flutter应用并上传Firebase Crashlytics dSYM的问题解答
背景说明
我使用Codemagic构建Flutter应用,同时借助Firebase Crashlytics追踪应用状态。为正常使用Firebase Crashlytics,需将每次构建的dSYM文件上传至Firebase。本地构建时,我可按照Firebase Crashlytics指引使用脚本:
/path/to/pods/directory/FirebaseCrashlytics/upload-symbols -gsp /path/to/GoogleService-Info.plist -p ios /path/to/dSYMs
此前我已在Xcode中添加脚本实现dSYM自动上传,但现在希望通过Codemagic完成构建并自动上传dSYM文件,已参考文档配置codemagic.yaml,目前遇到以下问题及对应解答:
1. Crashlytics中出现多个“Unknown Version”条目,来源是什么?
- 大多是上传的dSYM未关联正确的应用版本信息:比如构建时未正确设置
CFBundleShortVersionString或CFBundleVersion,或是上传dSYM时未传递版本标识参数。 - 测试包(如Ad Hoc、Debug包)未标记版本就被安装运行,Crashlytics无法识别版本,会归类为Unknown Version。
- dSYM上传流程中,版本信息未被正确传递至Firebase服务器也会导致该问题。
2. 版本89出现多个带有不同UUID的条目,原因是什么?
- 每个UUID对应独立的dSYM文件,说明同一个版本89存在多次不同构建:比如在Codemagic或本地进行了多次构建,每次构建的环境、编译选项或代码有细微变化,导致生成的dSYM UUID不同。
- 同一版本包含多架构dSYM(如arm64和x86_64),每个架构对应独立UUID,Crashlytics会分开显示。
- 版本号重复使用(多次构建都标记为版本89,但实际是不同构建包),也会产生多个UUID条目。
3. 通过Codemagic构建应用时,是否仍需保留Xcode中的脚本?
- 不需要保留。同时开启Codemagic和Xcode的dSYM上传脚本会导致重复上传,反而引发版本识别混乱。
- 直接移除Xcode中的上传脚本,仅保留
codemagic.yaml内的配置即可,避免冗余操作与冲突。
4. 如何验证Codemagic已正确上传dSYM文件?当前仅未知版本显示已上传dSYM文件。
- 查看Codemagic构建日志:搜索
upload-symbols相关内容,确认脚本执行成功,无报错(如文件找不到、权限问题)。 - 在Firebase Crashlytics版本列表中找到对应构建版本,查看dSYM状态:若显示“已上传”或UUID匹配,说明上传成功。
- 触发测试崩溃,查看Crashlytics的崩溃报告是否被正确符号化:能看到具体代码行号和函数名,就代表dSYM已生效。
5. 为何部分版本显示dSYM文件为可选状态?
- 若应用用Swift编写且开启了Bitcode,App Store会重新编译应用并生成新的dSYM,此时需从App Store Connect下载官方生成的dSYM上传,本地或Codemagic生成的dSYM就会变为可选(官方生成的才匹配线上版本)。
- 若应用崩溃日志已部分被符号化(如部分符号来自系统库),Crashlytics会标记dSYM为可选,但核心业务代码的dSYM仍为必需。
- 若该版本暂无崩溃报告,Crashlytics会显示dSYM为可选,因为暂时不需要符号化任何日志。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

