7.5 KiB
7.5 KiB
需求进度
当前总目标
- 控制当前 Flutter Android 发包体积,持续定位冗余组件、超大资源和不合理构建配置,并把每一步处理结果落盘记录。
已完成模块
- 创建并持续维护进度跟踪文件。
- 完成仓库结构、依赖引用、资源体积和 APK 组成的第一轮排查。
- 移除 4 个当前未在业务层直接使用的插件依赖:
loading_indicator_view_plus、social_sharing_plus、flutter_foreground_task、on_audio_query,并清理相关平台声明。 - 修补
image_cropper 5.0.1Android 兼容问题,切换到本地 path 依赖以恢复构建。 - 完成 Android release 签名回退配置,解决仓库缺少
yumi.jks/yumi_debug.jks时无法继续本地构建分析的问题。 - 完成 release 包体分析,确认 universal APK 过大主要由多 ABI 与 Agora/Tencent 原生 so 导致。
- 去除 Gradle 中与 Flutter 冲突的硬编码
abiFilters,确认--split-per-abi可以正常产出分架构 APK。 - 完成 TinyPNG 环境核查,并接入可执行的 Ruby 批量压缩脚本。
- 已完成 TinyPNG 第一轮批量压缩,
sc_images + assets总量已从47.25 MB降到22.54 MB。 - 已增强 TinyPNG 脚本,支持断点续跑、单文件目标和失败项重试。
- 已完成 TinyPNG 网络失败项补跑,6 张
SSL_connect异常图片已全部压缩成功。 - 已完成图片压缩后的 release 复测,确认分 ABI APK 体积继续显著下降。
- 已切换 Android
release为真正的瘦身模式:开启minify、shrinkResources、zipAlign。 - 已完成开启瘦身配置后的 Android release 复测,并接入
split-debug-info保存 Dart symbols。 - 已生成统一的 Python 打包脚本
scripts/build_release.py,开始接管AAB、分 ABI APK 与 iOS 包流程。
进行中模块
- 开启并验证 Android release 的
minify、shrinkResources、zipAlign瘦身配置。 - 生成统一的 Python 打包脚本,流程化产出
AAB、分 ABI APK 与 iOS 包。 - 继续评估 Agora 扩展 so 与 release shrink 策略是否还能进一步裁剪。
- 评估 12 张 TinyPNG 不支持解码的特殊
webp是否需要改格式或换工具处理。
关键技术决策
- 先做高置信度瘦身:优先清理未使用插件、ABI 配置和超大图片,暂不贸然删除核心业务能力。
- 避开仓库中用户已有未提交改动,只改必要文件并持续把结果写入本文件。
- 包体分析聚焦 release 产物,不被
build/、iOS 中间产物等本地缓存误导。 - Android 架构裁剪交给 Flutter 构建命令驱动,不再在 Gradle 中硬编码
abiFilters。 - 对
image_cropper采用本地 path 依赖加最小补丁策略,避免升级带来的业务回归面。 - Android 签名配置采用条件回退:正式 keystore 不存在时自动回退到 debug 签名,仅用于本地分析验证。
- 图片压缩优先走 TinyPNG,以尽量保持画质稳定;失败项按原因分流处理。
- TinyPNG 的
SSL_connect视为可重试网络抖动;Image could not be decoded视为 TinyPNG 对特殊/动图 WebP 的能力边界,先记录不阻塞其余压缩。
已改动文件
需求进度.mdpubspec.yamlpubspec.locklib/ui_kit/components/dialog/dialog.dartandroid/app/src/main/AndroidManifest.xmlios/Runner/Info.plistscripts/tinypng_batch.rbscripts/build_release.pytinypng-progress.jsontinypng-report.jsonlocal_packages/image_cropper-5.0.1-patched/android/src/main/java/vn/hunghd/flutter/plugins/imagecropper/ImageCropperPlugin.javalocal_packages/image_cropper-5.0.1-patched/android/app/build.gradle.ktsbuild/symbols/android/sc_images/assets/
已验证结果
- 当前工作区存在用户已有未提交改动,后续处理均避开覆盖。
- 目录体积排查显示:
build/约4.7G、.dart_tool/约347M、ios/约250M、sc_images/约48M、local_packages/约6.1M。 - 当前包体过大的主要原因已经确认:
- universal APK 带入了
arm64-v8a、armeabi-v7a、x86_64三套 ABI。 - Agora 与腾讯 IM 原生 so 很大,其中
libagora-rtc-sdk.so合计约79.4MB,libImSDK.so合计约10.2MB。 - 资源目录中
sc_images/index、sc_images/room、sc_images/person、sc_images/splash是最主要的大图来源。 flutter build apk --release --target-platform android-arm64 --analyze-size已成功执行,当前 universal release APK 约271MB。flutter build apk --release --split-per-abi已成功执行,压缩前分架构 APK 约为:app-arm64-v8a-release.apk约161.4MBapp-armeabi-v7a-release.apk约138.8MBapp-x86_64-release.apk约148.6MBloading_indicator_view_plus、social_sharing_plus、flutter_foreground_task、on_audio_query已从当前依赖链路中移除。- 当前图片资源统计为
412张,TinyPNG 两轮处理后总量已从47.25 MB降到22.27 MB,累计节省约24.99 MB。 - 当前 TinyPNG 已成功压缩
400张图片,剩余失败12张。 - 当前压缩收益最大的图片包括:
sc_images/person/sc_icon_edit_userinfo_bg.png:2640776 -> 436823,节省约2.10 MBsc_images/splash/sc_splash.png:2373335 -> 379804,节省约1.90 MBsc_images/room/sc_icon_room_defaut_bg.png:2243222 -> 704696,节省约1.47 MBsc_images/index/sc_icon_index_bg.png:1422169 -> 420635,节省约0.96 MB- 失败项已分型:
12张为 TinyPNG 无法解码的特殊/动图webp- 当前 TinyPNG 进度与统计文件已落盘:
tinypng-progress.json、tinypng-report.json - 图片压缩后再次执行
flutter build apk --release --split-per-abi,当前分架构 APK 已下降到: app-arm64-v8a-release.apk约135.2MB,比压缩前少26.2MBapp-armeabi-v7a-release.apk约112.6MB,比压缩前少26.2MBapp-x86_64-release.apk约122.4MB,比压缩前少26.2MB- 可以确认:这轮图片压缩带来的资源收益已经真实反映到最终 APK 体积中。
- 在开启
minify、shrinkResources、zipAlign并追加--split-debug-info=build/symbols/android后,Android release 继续下降为: app-release.aab约181.8MBapp-arm64-v8a-release.apk约128.7MB,比上一轮135.2MB再少6.5MBapp-armeabi-v7a-release.apk约105.8MB,比上一轮112.6MB再少6.8MBapp-x86_64-release.apk约115.8MB,比上一轮122.4MB再少6.6MBbuild/symbols/android已生成 3 份符号文件,总计约14MB,后续可用于 Dart 堆栈还原。
已知问题
ios/Podfile.lock还保留旧插件记录,因为本轮未执行pod install;但 Flutter 当前依赖链路已经不再包含已移除插件。- universal APK 仍然会非常大;当前正确发包方式应优先使用
--split-per-abi或直接产出aab。 - 仍有
12张webp被 TinyPNG 拒绝解码,推测是动画或特殊编码格式,不能继续直接走 TinyPNG 常规压缩。 split-debug-info会把 Dart symbols 额外落到构建目录,发包时需要和正式包一起留档,不能丢。
下一步要做什么
- 将新的 Android release 瘦身参数固化进统一打包脚本,并整理产物目录。
- 验证 Python 打包脚本的 Android 产物归档结果,再补 iOS 流程验证。
- 继续评估 Agora 扩展库是否都需要,优先核查
lip sync、spatial audio、clear vision、segmentation、face capture等扩展 so 能否裁剪。 - 决定是否处理剩余 12 张特殊
webp:改格式、换压缩工具,或维持现状。