8.8 KiB
8.8 KiB
需求进度
当前总目标
- 分析当前 Flutter 包体过大的主要原因,识别多余组件、冗余依赖、过大资源或不合理构建配置,并给出可执行的优化建议。
已完成模块
- 创建进度跟踪文件。
- 初步确认仓库结构与当前工作区状态。
- 完成第一轮静态体积排查,拿到目录体积与大文件分布。
- 完成第二轮依赖使用情况排查,识别出未直接引用的重型插件与高风险依赖。
- 完成第一轮高置信度瘦身改动,移除 4 个当前未在业务层使用的插件依赖并清理相关平台声明。
- 完成构建阻塞项定位,确认
image_cropper 5.0.1是当前 Android 构建失败的主要兼容性来源,并已切换到本地修补版依赖。 - 完成 Android 签名配置兜底,解决当前仓库缺少
yumi.jks/yumi_debug.jks时无法继续本地构建分析的问题。 - 完成 Android release 包体构建与体积分析,拿到当前 APK 的真实大小和主要组成。
进行中模块
- 汇总最终结论,整理造成包体冗余的主因与后续优化优先级。
关键技术决策
- 先做无侵入体检:优先分析依赖、资源体积和构建配置,暂不直接删除业务代码或资源。
- 避开仓库中已有未提交改动,只在必要文件上新增或追加分析结果。
- 重点关注发布包相关项,而不是被
build/、iOS 中间产物这类本地构建缓存误导。 - 发布包体分析优先使用单 ABI 做
--analyze-size,因为当前工程配置了多 ABI,Flutter 不允许直接对多 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 配置本身处理。
已改动文件
需求进度.mdpubspec.yamllib/ui_kit/components/dialog/dialog.dartandroid/app/src/main/AndroidManifest.xmlios/Runner/Info.plistlocal_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.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.3MBlib/x86_64约64.4MBlib/armeabi-v7a约58.2MBassets/flutter_assets约49.9MBclasses.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.4MBlibagora-ffmpeg.so合计约17.8MBlibagora_lip_sync_extension.so合计约13.7MBlibagora_spatial_audio_extension.so合计约13.4MBlibImSDK.so合计约10.2MBlibflutter.so约11.3MB- release APK 中最大的资源目录主要是:
sc_images/index约18.9MBsc_images/room约16.9MBsc_images/person约5.1MBsc_images/level约2.9MBsc_images/splash约2.6MB- 单文件大图中比较明显的包括:
sc_images/person/sc_icon_edit_userinfo_bg.png约2.64MBsc_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做第二轮正式瘦身。