测量你的应用体积
许多开发者都会关注应用编译后的大小。Flutter 应用编译出的 APK、app bundle 和 IPA 均持有应用运行需要的所有代码和资源,是完全独立的。一个应用越大,在设备上占用的空间就越多,下载时间就越长,还可能超出 Android 即时应用等实用功能的限制。
调试版本不具有代表性
#默认情况下,使用 flutter run
命令启动应用,或者点击 IDE 的 Play 按钮(如 开发体验初探 和 编写第一个 Flutter 应用 中所使用的),会生成 Flutter 应用的 调试 版本。调试版本体积很大,用于热重载和源码调试。因此,它不能代表用户最终下载的正式版本的应用。
检查总大小
#由 flutter build apk
或 flutter build ios
等生成的默认发行版本,是为了方便在 Play 商店和 App Store 上组装你上传的应用包。因此,它们也无法代表你的用户最终下载的大小。应用商店通常会针对不同的下载程序及其硬件,重新处理和拆分你上传的应用包,例如根据手机的 DPI 过滤资源、根据手机的 CPU 架构过滤原生库。
估算总大小
#请使用以下指南,获取各个平台下最接近的估算大小。
Android
#根据 Google 的 Play 控制台说明 来查看应用的下载大小。
生成你的应用的上传包:
flutter build appbundle
登录你的 Google Play 控制台。通过拖放 .abb 文件来上传应用的二进制文件。
在 Android vitals -> App size 选项卡中查看应用的下载和安装大小。
该下载大小是基于 XXXHDPI (~640dpi) 且架构为 arm64-v8a 的设备来计算的。用户最终的下载大小可能因硬件而异。
顶部选项卡有一个切换下载大小和安装大小的开关。该页面还包含了进一步的优化提示。
iOS
#创建一份 Xcode 应用大小报告。
首先,参照 iOS 创建构建归档指南,配置应用的版本,并开始构建。
然后:
-
运行命令
flutter build ipa --export-method development
。 -
运行命令
open build/ios/archive/*.xcarchive
打开 Xcode 生成的归档文件。 -
点击 Distribute App。
-
选择一种发布方式。如果你不打算发布该应用,Development 模式是最简单的。
-
在 App Thinning 中,选择「all compatible device variants」。
-
选择 Strip Swift symbols。
签名并导出 IPA 包,导出目录中有一个 App Thinning Size Report.txt
文件,其中记录了在不同设备和 iOS 版本上预估的应用程序大小的详细信息。
Flutter 1.17 上的默认 demo app 的应用大小报告显示如下:
Variant: Runner-7433FC8E-1DF4-4299-A7E8-E00768671BEB.ipa
Supported variant descriptors: [device: iPhone12,1, os-version: 13.0] and [device: iPhone11,8, os-version: 13.0]
App + On Demand Resources size: 5.4 MB compressed, 13.7 MB uncompressed
App size: 5.4 MB compressed, 13.7 MB uncompressed
On Demand Resources size: Zero KB compressed, Zero KB uncompressed
在这个例子中,设备 iPhone12,1(iPhone 11 的 Model ID / Hardware number)和 iPhone11,8 (iPhone XR) 运行在 iOS 13.0 版本下时,下载大小约为 5.4 MB,安装大小约为 13.7 MB。
想要精确测量一个 iOS 应用的体积,你需要先将一个发行版本的 IPA 包上传至 App Store Connect(简介),再获取它的大小报告。 IPA 包一般都比 APK 包要大,这在 Flutter FAQ 中的 Flutter 引擎有多大? 一节中已经阐述过了。
大小拆分
#从 Flutter 1.22 和 DevTools 0.9.1 版本开始,包含了一个大小分析工具,帮助开发者了解和拆分应用的发行版本。
该大小分析工具通过在构建时添加 --analyze-size
标记来调用:
flutter build apk --analyze-size
flutter build appbundle --analyze-size
flutter build ios --analyze-size
flutter build linux --analyze-size
flutter build macos --analyze-size
flutter build windows --analyze-size
这种构建模式和标准的发行构建相比,有以下两方面的区别:
-
该工具编译 Dart 时,记录了 Dart 包的代码大小使用情况。
-
该工具在终端上展示了大小拆分的摘要信息,并在 DevTools 中生成了一个
*-code-size-analysis_*.json
文件,用于进行更详细的分析。
除了分析单个构建,你还可以在 DevTools 中加载两个 *-code-size-analysis_*.json
文件比较差异。详情请阅读 DevTools 文档。
通过总结,你可以快速了解每种类型(例如资源、原生代码、Flutter 库等)的大小使用情况。编译后的 Dart 原生库会按包进一步拆分,以便快速分析。
在 DevTools 中深入分析
#上面生成的 *-code-size-analysis_*.json
文件可以在 DevTools 中进一步深入分析,树和树状图可以将应用内容分割至单文件级别,也可以达到 Dart AOT 产物的函数级别。
可以通过 dart devtools
打开 DevTools,选择 Open app size tool
,然后上传 JSON 文件。
更多关于 DevTools 中应用大小工具的使用,请看 DevTools 文档。
减少应用大小
#当构建应用的发行版本时,考虑使用 --split-debug-info
标记。该标记会显著减少代码量。关于使用此标记的示例,请查看文档 Obfuscating Dart code。
其他减少应用大小的方式:
-
删除无用的资源
-
尽量减少从库中引入的资源
-
压缩 PNG 和 JPEG 文件
除非另有说明,本文档之所提及适用于 Flutter 的最新稳定版本,本页面最后更新时间: 2024-05-20。 查看文档源码 或者 为本页面内容提出建议。