跳到主内容

测量您的应用大小

如何测量 iOS 和 Android 应用的大小。

许多开发者都关心已编译应用的大小。由于 Flutter 应用的 APK、App Bundle 或 IPA 版本是自包含的,并且包含了运行应用所需的所有代码和资源,因此其大小可能会成为一个问题。应用越大,它在设备上占用的空间就越多,下载时间也就越长,甚至可能会超出 Android 即时应用(Instant Apps)等功能的使用限制。

Debug 构建并不具有代表性

#

默认情况下,使用 flutter run 启动应用或点击 IDE 中的运行(Play)按钮,会生成 Flutter 应用的 Debug 构建版本。由于包含用于热重载(Hot Reload)和源代码级调试的调试开销,Debug 构建的应用体积较大。因此,它无法代表最终用户下载的生产环境应用。

检查总大小

#

默认的 Release 构建版本(例如通过 flutter build apkflutter build ios 创建的版本)旨在方便您生成用于上传到 Play Store 和 App Store 的程序包。因此,它们也无法代表最终用户的下载大小。应用商店通常会对您上传的程序包进行重处理和拆分,以针对特定的下载者及其硬件进行优化,例如过滤掉针对手机 DPI 的资源,或过滤掉针对手机 CPU 架构的本地库。

估算总大小

#

若要获取每个平台上最接近的近似大小,请按照以下说明操作。

Android

#

请遵循 Google Play Console 指南 来检查应用的下载和安装大小。

为您应用生成上传程序包

flutter build appbundle

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

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

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 应用,您必须将 Release 版 IPA 上传到 Apple 的 App Store Connect(说明)并从那里获取大小报告。正如 Flutter 常见问题解答Flutter 引擎有多大? 一节所解释的那样,IPA 通常比 APK 大。

分解大小

#

从 Flutter 1.22 和 DevTools 0.9.1 版本开始,包含了一个大小分析工具,旨在帮助开发者了解其应用 Release 构建版本的构成。

通过在构建时添加 --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

此构建与标准 Release 构建在两个方面有所不同:

  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 中进行更深入的分析,通过树状视图或矩形树图(Treemap)将应用内容细分到单个文件级别,对于 Dart AOT 工件,甚至可以细分到函数级别。

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

Example breakdown of app in DevTools

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

减小应用大小

#

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

减小应用大小的其他方法包括:

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

减小应用大小的另一种方法是使用特定于平台的代码。Dart 编译器会移除目标平台上无法访问的代码。例如,如果您有特定于 Windows 的代码,可以使用 dart:io 中的 Platform 类将其包装在检查中,例如 if (Platform.isWindows)。当您为 Android 构建应用时,编译器会发现此检查始终为 false,并从 Release 构建中移除 Windows 特定的代码。