許多開發者都關心其已編譯應用的體積。由於 Flutter 應用的 APK、應用捆綁包或 IPA 版本是自成一體的,幷包含執行應用所需的所有程式碼和資源,因此其大小可能是一個令人擔憂的問題。應用越大,所需的裝置空間就越多,下載時間也越長,並且可能會超出 Android Instant Apps 等有用功能的限制。

除錯構建不具代表性

#

預設情況下,使用 flutter run 啟動您的應用,或透過 IDE 中的播放按鈕(如編寫您的第一個 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

下載大小是根據 XXXHDPI (~640dpi) 裝置和 arm64-v8a 架構計算的。您的終端使用者下載大小可能因其硬體而異。

頂部標籤頁有一個下載大小和安裝大小的切換按鈕。該頁面下方還有最佳化技巧。

iOS

#

建立 Xcode 應用大小報告

首先,按照iOS 建立構建歸檔說明中的描述,配置應用版本和構建。

然後

  1. 執行 flutter build ipa --export-method development
  2. 執行 open build/ios/archive/*.xcarchive 在 Xcode 中開啟歸檔檔案。
  3. 點選分發應用
  4. 選擇一種分發方法。如果您不打算分發該應用程式,開發是最簡單的。
  5. 應用瘦身中,選擇“所有相容裝置變體”。
  6. 選擇剝離 Swift 符號

簽名並匯出 IPA。匯出的目錄包含 App Thinning Size Report.txt,其中包含有關您的應用程式在不同裝置和 iOS 版本上的預期大小的詳細資訊。

Flutter 1.17 中的預設演示應用的“應用大小報告”顯示:

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(說明),並從中獲取大小報告。如Flutter 引擎有多大?(Flutter FAQ 的一部分)中所述,IPA 通常比 APK 大。

分解大小

#

從 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 檔案