测量你的应用体积

许多开发者都会关注应用编译后的大小。Flutter 应用编译出的 APK、app bundle 和 IPA 均持有应用运行需要的所有代码和资源,是完全独立的。一个应用越大,在设备上占用的空间就越多,下载时间就越长,还可能超出 Android 即时应用等实用功能的限制。

调试版本不具有代表性

默认情况下,使用 flutter run 命令启动应用,或者点击 IDE 的 Play 按钮(如 开发体验初探编写第一个 Flutter 应用 中所使用的),会生成 Flutter 应用的 调试 版本。调试版本体积很大,用于热重载和源码调试。因此,它不能代表用户最终下载的正式版本的应用。

检查总大小

flutter build apkflutter build ios 等生成的默认发行版本,是为了方便在 Play 商店和 App Store 上组装你上传的应用包。因此,它们也无法代表你的用户最终下载的大小。应用商店通常会针对不同的下载程序及其硬件,重新处理和拆分你上传的应用包,例如根据手机的 DPI 过滤资源、根据手机的 CPU 架构过滤原生库。

估算总大小

请使用以下指南,获取各个平台下最接近的估算大小。

Android

根据 Google 的 Play 控制台说明 来查看应用的下载大小。

生成你的应用的上传包:

flutter build appbundle

登录你的 Google Play 控制台。通过拖放 .abb 文件来上传应用的二进制文件。

Android vitals -> App size 选项卡中查看应用的下载和安装大小。

App size tab in Google Play Console

该下载大小是基于 XXXHDPI (~640dpi) 且架构为 arm64-v8a 的设备来计算的。用户最终的下载大小可能因硬件而异。

顶部选项卡有一个切换下载大小和安装大小的开关。该页面还包含了进一步的优化提示。

iOS

创建一份 Xcode 应用大小报告

首先,参照 iOS 创建构建归档指南,配置应用的版本,并开始构建。

然后:

  1. 运行命令 flutter build ipa --export-method development

  2. 运行命令 open build/ios/archive/*.xcarchive 打开 Xcode 生成的归档文件。

  3. 点击 Distribute App

  4. 选择一种发布方式。如果你不打算发布该应用,Development 模式是最简单的。

  5. App Thinning 中,选择「all compatible device variants」。

  6. 选择 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

这种构建模式和标准的发行构建相比,有以下两方面的区别:

  1. 该工具编译 Dart 时,记录了 Dart 包的代码大小使用情况。

  2. 该工具在终端上展示了大小拆分的摘要信息,并在 DevTools 中生成了一个 *-code-size-analysis_*.json 文件,用于进行更详细的分析。

除了分析单个构建,你还可以在 DevTools 中加载两个 *-code-size-analysis_*.json 文件比较差异。详情请阅读 DevTools 文档

Size summary of an Android application in terminal

通过总结,你可以快速了解每种类型(例如资源、原生代码、Flutter 库等)的大小使用情况。编译后的 Dart 原生库会按包进一步拆分,以便快速分析。

在 DevTools 中深入分析

上面生成的 *-code-size-analysis_*.json 文件可以在 DevTools 中进一步深入分析,树和树状图可以将应用内容分割至单文件级别,也可以达到 Dart AOT 产物的函数级别。

可以通过 flutter pub global run devtools 打开 DevTools,选择 Open app size tool,然后上传 JSON 文件。

Example breakdown of app in DevTools

更多关于 DevTools 中应用大小工具的使用,请看 DevTools 文档

减少应用大小

当构建应用的发行版本时,考虑使用 --split-debug-info 标记。该标记会显著减少代码量。关于使用此标记的示例,请查看文档 Obfuscating Dart code

其他减少应用大小的方式:

  • 删除无用的资源

  • 尽量减少从库中引入的资源

  • 压缩 PNG 和 JPEG 文件