chatapp3-flutter/需求进度.md
NIGGER SLAYER 36780a0789 h5测试
2026-04-13 12:05:59 +08:00

100 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 需求进度
## 当前总目标
- 分析当前 Flutter 包体过大的主要原因,识别多余组件、冗余依赖、过大资源或不合理构建配置,并给出可执行的优化建议。
## 已完成模块
- 创建进度跟踪文件。
- 初步确认仓库结构与当前工作区状态。
- 完成第一轮静态体积排查,拿到目录体积与大文件分布。
- 完成第二轮依赖使用情况排查,识别出未直接引用的重型插件与高风险依赖。
- 完成第一轮高置信度瘦身改动,移除 4 个当前未在业务层使用的插件依赖并清理相关平台声明。
- 完成构建阻塞项定位,确认 `image_cropper 5.0.1` 是当前 Android 构建失败的主要兼容性来源,并已切换到本地修补版依赖。
- 完成 Android 签名配置兜底,解决当前仓库缺少 `yumi.jks` / `yumi_debug.jks` 时无法继续本地构建分析的问题。
- 完成 Android release 包体构建与体积分析,拿到当前 APK 的真实大小和主要组成。
## 进行中模块
- 汇总最终结论,整理造成包体冗余的主因与后续优化优先级。
## 关键技术决策
- 先做无侵入体检:优先分析依赖、资源体积和构建配置,暂不直接删除业务代码或资源。
- 避开仓库中已有未提交改动,只在必要文件上新增或追加分析结果。
- 重点关注发布包相关项,而不是被 `build/`、iOS 中间产物这类本地构建缓存误导。
- 发布包体分析优先使用单 ABI 做 `--analyze-size`,因为当前工程配置了多 ABIFlutter 不允许直接对多 ABI 产物做代码体积分析。
- 实际清理仅选择高置信度冗余项:`loading_indicator_view_plus``social_sharing_plus``flutter_foreground_task``on_audio_query`,暂不动 Agora、腾讯 IM、支付、WebView 等核心能力依赖。
-`image_cropper` 不做升级式重构,先采用本地 path 依赖加最小兼容补丁的方式恢复构建,避免改动业务裁剪调用代码。
- 对 Android 签名配置采用条件回退策略:存在正式 keystore 时走正式签名,不存在时回退到 debug 签名,仅用于本地分析和构建验证。
- 即便传入 `--target-platform android-arm64`,当前 Gradle 的 `abiFilters` 仍会把 `arm64-v8a``armeabi-v7a``x86_64` 三套 so 一起打进 APK因此后续瘦身必须回到 Gradle ABI 配置本身处理。
## 已改动文件
- `需求进度.md`
- `pubspec.yaml`
- `lib/ui_kit/components/dialog/dialog.dart`
- `android/app/src/main/AndroidManifest.xml`
- `ios/Runner/Info.plist`
- `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`
## 已验证结果
- 仓库存在 `pubspec.yaml`、Android/iOS 构建配置以及大量图片资源和多个 `local_packages` 本地包。
- 当前工作区存在用户已有未提交改动,后续分析将避免覆盖。
- 目录体积显示:`build/` 约 4.7G、`.dart_tool/` 约 347M、`ios/` 约 250M、`sc_images/` 约 48M、`local_packages/` 约 6.1M。
- `android/app/build.gradle.kts` 中 release 构建关闭了 `minify``shrinkResources``zipAlign`,会直接放大发布包体。
- Android ABI 当前包含 `arm64-v8a``armeabi-v7a``x86_64`,如果打通用包会把不必要架构一起带进去。
- 当前资源中存在多张 2MB 以上的大图,例如 `sc_images/person/sc_icon_edit_userinfo_bg.png``sc_images/splash/sc_splash.png` 和多张 2.2MB 左右的 `webp` 背景图。
- 资源子目录中较大的部分主要是:`sc_images/index/` 约 18M、`sc_images/room/` 约 17M、`sc_images/person/` 约 5M、`sc_images/splash/` 约 2.5M。
- 本地包体积中较大的部分主要是:`local_packages/tancent_vap-1.0.0+1` 约 4.2M、`local_packages/flutter_foreground_task-9.1.0` 约 1.1M。
- 依赖引用扫描结果显示:`social_sharing_plus``flutter_foreground_task``on_audio_query` 当前在 `lib/``test/` 中没有直接 import属于优先核查是否可移除的候选项。
- 明确在业务中使用的重型能力包括:`agora_rtc_engine``tencent_cloud_chat_sdk``tancent_vap``flutter_svga``firebase_auth/core/crashlytics``in_app_purchase``webview_flutter`
- 执行 `flutter build apk --release --analyze-size` 时失败Flutter 明确提示当前多 ABI 配置下必须指定单一 `--target-platform` 才能输出体积分析。
- `app-debug.apk` 当前约 405MB拆包后可见最大组成是三套 ABI 的 `libflutter.so`、Agora 系列 so、腾讯 IM so以及 `sc_images/index``sc_images/room` 等大资源目录。
- `.flutter-plugins-dependencies` 已证明 Android 端存在大量 `native_build` 插件注册;即使 Dart 代码没有 import插件仍会进入原生构建链路。
- 已将 `loading_indicator_view_plus` 的使用替换为 Flutter 自带 `CircularProgressIndicator`,为后续移除该插件铺平路径。
- 已从工程依赖中删除 `loading_indicator_view_plus``social_sharing_plus``flutter_foreground_task``on_audio_query`,并同步清理 Android 前台服务与媒体音频权限、iOS 前台任务标识与媒体库用途说明。
- `flutter pub get` 后,上述 4 个冗余插件已不再出现在 Flutter 当前插件注册链路中;搜索结果仅残留在未重新执行 `pod install``ios/Podfile.lock` 旧记录里。
- 继续构建时又发现 `image_cropper 5.0.1` 的 Android 插件源码仍引用已移除的 `PluginRegistry.Registrar`,这会同时阻塞 debug/release。
- 已复制 `image_cropper 5.0.1` 到工作区本地包,并删除其过时的 `registerWith` 兼容入口,准备再次验证构建。
- 当前仓库下 `android/app/yumi.jks``android/app/yumi_debug.jks` 都不存在,原始 Gradle 配置会在签名校验阶段阻塞 release 构建。
- 已将 Gradle 配置调整为:正式 keystore 缺失时自动回退到 debug 签名,从而继续完成本地分析构建。
- `flutter build apk --release --target-platform android-arm64 --analyze-size` 已成功执行,生成 `build/app/outputs/flutter-apk/app-release.apk`
- 当前 release APK 文件大小约 `271MB`,构建输出显示约 `284.6MB`,分析总压缩体积约 `271MB`
- 当前 release APK 的压缩后主要组成是:
- `lib/arm64-v8a``101.3MB`
- `lib/x86_64``64.4MB`
- `lib/armeabi-v7a``58.2MB`
- `assets/flutter_assets``49.9MB`
- `classes.dex + classes2.dex + classes3.dex` 合计约 `8.8MB`
- 三套 ABI 合计约 `223.8MB`,其中 `x86_64 + armeabi-v7a` 两套额外架构合计约 `122.5MB`,是当前包体过大的头号原因。
- release APK 中最大的 native so 主要来自 Agora 与腾讯 IM
- `libagora-rtc-sdk.so` 合计约 `79.4MB`
- `libagora-ffmpeg.so` 合计约 `17.8MB`
- `libagora_lip_sync_extension.so` 合计约 `13.7MB`
- `libagora_spatial_audio_extension.so` 合计约 `13.4MB`
- `libImSDK.so` 合计约 `10.2MB`
- `libflutter.so``11.3MB`
- release APK 中最大的资源目录主要是:
- `sc_images/index``18.9MB`
- `sc_images/room``16.9MB`
- `sc_images/person``5.1MB`
- `sc_images/level``2.9MB`
- `sc_images/splash``2.6MB`
- 单文件大图中比较明显的包括:
- `sc_images/person/sc_icon_edit_userinfo_bg.png``2.64MB`
- `sc_images/splash/sc_splash.png``2.37MB`
- 多张 `sc_icon_gamebroad_lv*.webp` 单张约 `2.0MB - 2.35MB`
- Flutter 的 Dart AOT 符号在分析里约 `11MB`,其中 `package:yumi` 自身约 `2MB`,说明业务 Dart 代码不是主要膨胀来源。
- `MaterialIcons-Regular.otf` 在 release 中已自动 tree-shake 到约 `3.7KB`,图标字体不是问题。
- 本轮为恢复构建额外处理了两个工程兼容问题:`loading_indicator_view_plus` 缺少 Android namespace、`image_cropper 5.0.1` 旧注册接口不兼容当前 Flutter/AGP。
## 已知问题
- `ios/Podfile.lock` 还保留旧插件记录,因为本轮未执行 `pod install`;但 Flutter 当前依赖与插件注册链路已经不再包含已移除插件。
- 目前 release 仍关闭了 `minify` / `shrinkResources` / `zipAlign`,这部分尚未动手优化,因为可能影响 Agora、腾讯 IM、Firebase 等反射或资源引用行为。
- Android 构建配置中的 `abiFilters` 仍然固定包含三套架构,导致单 ABI 分析构建时 APK 里依旧带入 `x86_64``armeabi-v7a`
## 下一步要做什么
- 调整 Android ABI 策略,至少移除 `x86_64`,并根据发包方式决定是否保留 `armeabi-v7a`
- 压缩或替换 `sc_images/index``sc_images/room``sc_images/person` 中的超大图片资源。
- 评估 Agora 扩展能力是否都需要,优先核查 lip sync、spatial audio、clear vision、segmentation、face capture 等扩展库能否裁剪。
- 在补齐必要 keep rules 后,再尝试开启 `minify``shrinkResources``zipAlign` 做第二轮正式瘦身。