7.4 包体积优化

张开发
2026/4/15 6:45:40 15 分钟阅读

分享文章

7.4 包体积优化
App 包体积直接影响下载转化率。Google 研究表明APK 每增大 6MB安装转化率下降约 1%。Flutter 项目需要针对 Dart 代码、原生资源和第三方依赖做系统性的体积优化。一、包体积分析1.1 analyze-size 命令# Androidflutter build apk--release--analyze-size flutter build appbundle--release--analyze-size# iOSflutter build ios--release--analyze-size# 输出指定目录flutter build apk--release\--analyze-size\--code-size-directory./size_analysis分析报告会显示各组成部分的大小占比app-release.apk (total compressed) 18 MB ├── assets/ 3 MB │ ├── flutter_assets/ 2 MB │ └── fonts/ 1 MB ├── lib/ 10 MB │ ├── arm64-v8a/ 5 MB │ │ ├── libflutter.so 3 MB │ │ └── libapp.so 2 MB │ └── armeabi-v7a/ 5 MB ├── res/ 2 MB └── classes.dex 3 MB1.2 DevTools Size 分析# 生成分析文件后在 DevTools 中打开flutter pub global run devtools--appSize./size_analysis二、Dart 代码体积优化2.1 Tree Shaking自动AOT 编译时未被引用的代码会被自动移除但需注意// ❌ 反射/动态调用会阻止 Tree Shakingimportpackage:huge_library/huge_library.dart;// 即使只用了一个函数如果库使用了 dart:mirrors整个库都会被保留// ✅ 只导入需要的部分importpackage:huge_library/src/specific_feature.dart;// ✅ 使用 show 限制导入importpackage:flutter/material.dartshowColors,TextStyle;2.2 Deferred Loading延迟加载将不常用的功能延迟加载减少初始包体积// 延迟导入页面级别importpackage:my_app/features/admin/admin_page.dartdeferredasadmin;Futurevoid_openAdminPage()async{// 首次使用时才加载代码awaitadmin.loadLibrary();Navigator.push(context,MaterialPageRoute(builder:(_)admin.AdminPage()),);}2.3 移除未使用的依赖# 检查未使用的依赖dart pub outdated dart pub deps --no-dev# 查看依赖树flutter pub deps# pubspec.yaml — 定期清理不需要的依赖dependencies:# ❌ 已经不再使用的包及时移除# unused_package: ^1.0.0# ✅ 替换为更轻量的替代品# dio: ^5.4.0 # 700KB → 如果只需简单请求用 http 包170KB三、资源体积优化3.1 图片压缩# 使用 TinyPNG 压缩 PNG/JPEG减少 50-80%# macOS 批量压缩脚本findassets/-name*.png-execpngquant--strip--quality65-85{}--ext.png--force\;# 考虑使用 WebP 格式比 PNG 小 30%cwebp-q80input.png-ooutput.webp// 使用 WebP 图片Image.asset(assets/images/banner.webp)3.2 字体精简# ❌ 导入完整字体族可能 1-5MBflutter:fonts:-family:NotoSansSCfonts:-asset:assets/fonts/NotoSansSC-Regular.ttf# 8MB!# ✅ 使用 Google Fonts按需下载dependencies:google_fonts:^6.1.0// 按需加载字体Text(你好世界,style:GoogleFonts.notoSansSc(fontSize:16),)3.3 移除未使用的 Material Icons// analysis_options.yaml 开启 lint 检查未使用导入linter:rules:-avoid_unnecessary_containers四、原生体积优化4.1 按 ABI 分包Android# 不分包一个 APK 包含所有架构 ≈ 26MBflutter build apk--release# 按 ABI 分包每个包约 13MBflutter build apk--release--split-per-abi# 输出# app-armeabi-v7a-release.apk (32位 ARM兼容老设备)# app-arm64-v8a-release.apk (64位 ARM主流)# app-x86_64-release.apk (模拟器)# 使用 AAB推荐Google Play 自动按设备分发flutter build appbundle--release4.2 ProGuard / R8 压缩Android// android/app/build.gradlebuildTypes{release{minifyEnabledtrue// 开启代码压缩shrinkResourcestrue// 移除未使用资源proguardFilesgetDefaultProguardFile(proguard-android-optimize.txt),proguard-rules.pro}}4.3 Bitcode / StripiOSXcode → Build Settings: Strip Debug Symbols During Copy → Yes Strip Linked Product → Yes Deployment Postprocessing → Yes五、Deferred ComponentsPlay Feature DeliveryAndroid App Bundle 支持按需下载模块# pubspec.yamlflutter:deferred-components:-name:admin_modulelibraries:-package:my_app/features/admin/admin_page.dartassets:-assets/admin/// 按需加载组件importpackage:my_app/features/admin/admin_page.dartdeferredasadmin;Futurevoid_loadAdminModule()async{try{awaitadmin.loadLibrary();// 模块加载成功}catch(e){// 模块加载失败网络问题等}}小结优化方向手段效果Dart 代码Tree Shaking、Deferred Loading减少 20-50%图片资源WebP、TinyPNG 压缩减少 30-80%字体Google Fonts 按需加载减少 1-5MB分架构--split-per-abi/ AAB减少 ~50%原生优化R8 ProGuard Strip Symbols减少 10-20%按需交付Deferred Components减少初始包体积 下一节继续阅读后续章节

更多文章