许多开发者都关心其编译后应用的大小。由于 Flutter 应用的 APK、应用包或 IPA 版本是自包含的,并包含运行应用所需的所有代码和资源,因此其大小可能是一个问题。应用越大,在设备上所需的空间越多,下载时间越长,并且可能会突破像 Android 即时应用这样有用功能的限制。

调试版本不具有代表性

#

默认情况下,使用 flutter run 启动应用,或点击 IDE 中的 Play 按钮(如编写您的第一个 Flutter 应用中所述),会生成 Flutter 应用的调试版本。调试版本的应用大小较大,这是由于调试开销允许热重载和源级别调试。因此,它不代表最终用户下载的生产应用大小。

检查总大小

#

默认的发布版本(例如由 flutter build apkflutter build ios 创建的版本)旨在方便地组装您的上传包到 Play 商店和 App Store。因此,它们也不代表您最终用户的下载大小。商店通常会重新处理和拆分您的上传包,以针对特定的下载者和下载者的硬件,例如过滤针对手机 DPI 的资源,过滤针对手机 CPU 架构的原生库。

估算总大小

#

要在每个平台上获得最接近的近似大小,请使用以下说明。

Android

#

按照 Google Play Console 的说明检查应用下载和安装大小。

为您的应用生成上传包

flutter build appbundle

登录您的 Google Play Console。通过拖放 .aab 文件上传您的应用二进制文件。

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

App size tab in Google Play Console

下载大小是根据 arm64-v8a 架构上的 XXXHDPI (~640dpi) 设备计算的。您的最终用户的下载大小可能因其硬件而异。

顶部选项卡有下载大小和安装大小的切换。该页面下方还包含优化技巧。

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(剥离 Swift 符号)。

签名并导出 IPA。导出的目录包含 App Thinning Size Report.txt,其中包含您的应用在不同设备和 iOS 版本上的预计大小详情。

Flutter 1.17 中默认演示应用的 App Size Report 显示

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

在此示例中,该应用在运行 iOS 13.0 的 iPhone12,1 (iPhone 11 的型号 ID / 硬件编号) 和 iPhone11,8 (iPhone XR) 上的近似下载大小为 5.4 MB,近似安装大小为 13.7 MB。

要精确测量 iOS 应用的大小,您必须将发布 IPA 上传到 Apple 的 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. 该工具在终端中显示大小分解的高级摘要,并生成一个 *-code-size-analysis_*.json 文件,以便在 DevTools 中进行更详细的分析。

除了分析单个构建外,还可以通过将两个 *-code-size-analysis_*.json 文件加载到 DevTools 中来比较两个构建。有关详细信息,请查看 DevTools 文档

Size summary of an Android application in terminal

通过摘要,您可以快速了解每个类别(如资源、原生代码、Flutter 库等)的大小使用情况。编译后的 Dart 原生库会按包进一步分解,以便快速分析。

在 DevTools 中进行更深入的分析

#

上面生成的 *-code-size-analysis_*.json 文件可以在 DevTools 中进行更深入的详细分析,其中树视图或树状图视图可以将应用内容分解到单个文件级别,对于 Dart AOT 工件,甚至可以分解到函数级别。

这可以通过运行 dart devtools,选择 Open app size tool 并上传 JSON 文件来完成。

Example breakdown of app in DevTools

有关使用 DevTools 应用大小工具的更多信息,请查看 DevTools 文档

减小应用大小

#

在构建应用的发布版本时,请考虑使用 --split-debug-info 标志。此标志可以显著减小代码大小。有关使用此标志的示例,请参阅混淆 Dart 代码

您可以采取的其他一些减小应用大小的方法是

  • 移除未使用的资源
  • 最小化从库导入的资源
  • 压缩 PNG 和 JPEG 文件