103 lines
7.5 KiB
Markdown
103 lines
7.5 KiB
Markdown
# 需求进度
|
||
|
||
## 当前总目标
|
||
- 控制当前 Flutter Android 发包体积,持续定位冗余组件、超大资源和不合理构建配置,并把每一步处理结果落盘记录。
|
||
|
||
## 已完成模块
|
||
- 创建并持续维护进度跟踪文件。
|
||
- 完成仓库结构、依赖引用、资源体积和 APK 组成的第一轮排查。
|
||
- 移除 4 个当前未在业务层直接使用的插件依赖:`loading_indicator_view_plus`、`social_sharing_plus`、`flutter_foreground_task`、`on_audio_query`,并清理相关平台声明。
|
||
- 修补 `image_cropper 5.0.1` Android 兼容问题,切换到本地 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 的能力边界,先记录不阻塞其余压缩。
|
||
|
||
## 已改动文件
|
||
- `需求进度.md`
|
||
- `pubspec.yaml`
|
||
- `pubspec.lock`
|
||
- `lib/ui_kit/components/dialog/dialog.dart`
|
||
- `android/app/src/main/AndroidManifest.xml`
|
||
- `ios/Runner/Info.plist`
|
||
- `scripts/tinypng_batch.rb`
|
||
- `scripts/build_release.py`
|
||
- `tinypng-progress.json`
|
||
- `tinypng-report.json`
|
||
- `local_packages/image_cropper-5.0.1-patched/android/src/main/java/vn/hunghd/flutter/plugins/imagecropper/ImageCropperPlugin.java`
|
||
- `local_packages/image_cropper-5.0.1-patched/`
|
||
- `android/app/build.gradle.kts`
|
||
- `build/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.4MB`
|
||
- `app-armeabi-v7a-release.apk` 约 `138.8MB`
|
||
- `app-x86_64-release.apk` 约 `148.6MB`
|
||
- `loading_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 MB`
|
||
- `sc_images/splash/sc_splash.png`:`2373335 -> 379804`,节省约 `1.90 MB`
|
||
- `sc_images/room/sc_icon_room_defaut_bg.png`:`2243222 -> 704696`,节省约 `1.47 MB`
|
||
- `sc_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.2MB`
|
||
- `app-armeabi-v7a-release.apk` 约 `112.6MB`,比压缩前少 `26.2MB`
|
||
- `app-x86_64-release.apk` 约 `122.4MB`,比压缩前少 `26.2MB`
|
||
- 可以确认:这轮图片压缩带来的资源收益已经真实反映到最终 APK 体积中。
|
||
- 在开启 `minify`、`shrinkResources`、`zipAlign` 并追加 `--split-debug-info=build/symbols/android` 后,Android release 继续下降为:
|
||
- `app-release.aab` 约 `181.8MB`
|
||
- `app-arm64-v8a-release.apk` 约 `128.7MB`,比上一轮 `135.2MB` 再少 `6.5MB`
|
||
- `app-armeabi-v7a-release.apk` 约 `105.8MB`,比上一轮 `112.6MB` 再少 `6.8MB`
|
||
- `app-x86_64-release.apk` 约 `115.8MB`,比上一轮 `122.4MB` 再少 `6.6MB`
|
||
- `build/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`:改格式、换压缩工具,或维持现状。
|