踩坑 · Flutter 构建与打包
分类:踩坑记录 → 构建与打包 覆盖:依赖、代码生成、构建失败、产物体积
记录格式
**症状** → **原因** → **解法** → **预防**build_runner 生成 .g.dart 冲突
症状
[SEVERE] Conflicting outputs were detected...原因 上一次生成的文件与本次冲突(常见于改了注解后重新生成,--delete-conflicting-outputs 未加)。
解法
bash
fvm dart run build_runner build --delete-conflicting-outputs仍不行则清理后重建:
bash
fvm flutter clean
fvm flutter pub get
fvm dart run build_runner build --delete-conflicting-outputs预防 把 --delete-conflicting-outputs 写进项目脚本(见 16 篇),永远别用不带该参数的 build。
构建卡住 / Waiting for another flutter command to release the startup lock
症状 命令长时间无响应,或提示等待锁释放。
原因 上一次 flutter 命令异常退出,锁文件未清理。
解法
bash
# 1. 杀掉残留进程
ps aux | grep flutter # Git Bash
# Windows: taskkill /F /IM dart.exe
# 2. 删除锁文件
rm -f $FLUTTER_ROOT/bin/cache/lockfile
# 或 fvm 管理的版本:
rm -f .fvm/flutter_sdk/bin/cache/lockfile预防 异常中断后先检查残留进程,不要直接重跑命令。
命令未加 fvm 前缀导致版本不一致
症状 本地能编,CI 或同事编不过;或报"SDK version 不满足"。
原因 直接用了全局 flutter,版本与项目 .fvm/fvm_config.json 锁定版本不一致。
解法 所有命令加 fvm 前缀:
bash
fvm flutter pub get
fvm flutter build apk --release预防
- 项目 README 明确写出"所有命令必须加 fvm"
- IDE 的 Flutter SDK 路径指向
.fvm/flutter_sdk - CI 里也用 fvm
依赖版本冲突(version solving failed)
症状
Because xxx depends on yyy >=2.0.0 and zzz depends on yyy <2.0.0, version solving failed.原因 两个包依赖了同一个第三方包的不兼容版本区间。
解法(按序尝试)
bash
# 1. 先看谁在依赖它
fvm flutter pub deps --style=compact | grep <包名>
# 2. 升级相关包到兼容版本
fvm flutter pub upgrade <包名>
# 3. 仍冲突 → 在 pubspec.yaml 强制指定版本(最后手段)
dependency_overrides:
yyy: ^2.1.0预防
dependency_overrides是技术债,加了要记 TODO 并尽快移除- 引入新包前先看它的依赖约束
Release 包行为异常(Debug 正常)
症状 Debug 一切正常,Release 包崩溃/白屏/接口失败。
原因(按概率排序)
- 混淆把反射、JNI、Platform Channel 相关类混淆掉了
- Release 才生效的权限/网络配置(如 Android 网络安全配置、明文流量限制)
- 只在 Release 暴露的时序问题(异步竞态被 Debug 的慢速掩盖)
解法
bash
# 先用 profile 模式复现(保留部分调试能力,性能接近 Release)
fvm flutter run --profile
# 若怀疑混淆,临时关掉验证
fvm flutter build apk --release --no-shrink确认是混淆问题后补保留规则(见 23 篇):
proguard
-keep class io.flutter.plugin.** { *; }
-keep class com.yourpackage.** { *; }预防 发版前必须用 Release 包完整走一遍主流程,不要只测 Debug。
包体过大
症状 APK 远超预期(Flutter 空包基线约 5~8MB)。
原因(按常见度)
- 未做 ABI 分包(默认打全架构)
- 资源未压缩(图片、字体)
- 引入了体积大的依赖
解法
bash
# 1. ABI 分包(立竿见影)
fvm flutter build apk --split-per-abi --release
# 2. 分析体积构成
fvm flutter build apk --analyze-size --target-platform android-arm64
# 3. 上架用 AAB(由商店按需下发)
fvm flutter build appbundle --release
# 4. 开启资源压缩与混淆
minifyEnabled true
shrinkResources true预防
- 图片用 webp、字体子集化
- 引入新依赖前看体积影响(
--analyze-size)
iOS 构建失败:签名 / 描述文件
症状Signing for "Runner" requires a development team 或 No profiles for 'xxx' were found。
原因 签名配置缺失或描述文件与 Bundle ID 不匹配。
解法
- Xcode → Runner target → Signing & Capabilities → 选正确的 Team
- 确认 Bundle ID 与开发者后台的 App ID 一致
flutter build ipa时指定:--export-options-plist=ExportOptions.plist- CI 场景:用
fastlane match或导入证书后security unlock-keychain
预防
- 团队统一签名方式(自动 vs 手动)
- 证书与描述文件的有效期登记,提前续期
待记录
遇到新问题请按格式追加到此文件:
- [ ]
flutter pub get缓存异常导致依赖装不上 - [ ] 多 flavor 构建时的配置错误
- [ ] 国内环境
pub get超时的镜像配置 - [ ] AAR / Framework 产物与原生工程版本不一致