許多開發者都很關心他們編譯後的應用程式大小。 由於 Flutter 應用程式的 APK、app bundle 或 IPA 版本 是自包含的,並且包含執行應用程式所需的所有程式碼與資源(Assets), 因此其大小可能成為一個問題。應用程式越大, 在裝置上所需的空間就越多, 下載所需的時間也會越長, 而且可能會超過某些實用功能的限制, 例如 Android 即時應用程式(instant apps)。

Debug 版本不具代表性

#

預設情況下,使用 flutter run 啟動您的應用程式, 或是在您的 IDE 中點擊 Play 按鈕 (如 撰寫您的第一個 Flutter 應用程式 中所使用), 會產生 Flutter 應用程式的 debug 版本。 Debug 版本的應用程式大小較大,這是因為 其包含了支援 hot reload 及原始碼層級除錯的除錯開銷。 因此,這並不代表最終用戶下載的正式版(production) 應用程式的大小。

檢查總體大小

#

預設的 release 版本,例如使用 flutter build apkflutter build ios 所建立的版本,是為了方便您組裝 上傳至 Play Store 與 App Store 的套件。 因此,這些也不代表 最終用戶實際下載的大小。應用程式商店通常會重新處理並拆分 您上傳的套件,以針對特定的下載者及其硬體做最佳化, 例如根據手機的 DPI 過濾資源(Assets), 根據手機的 CPU 架構過濾原生程式庫。

預估總體大小

#

要獲得各平台上最接近實際的應用程式大小,請依照下列 說明操作。

Android

#

請依照 Google Play Console 的說明 來檢查應用程式的下載與 安裝大小。

為您的應用程式產生一個上傳套件:

flutter build appbundle

登入你的 Google Play Console。將你的應用程式二進位檔(.aab 檔案)拖曳上傳。

Android vitals -> App size 分頁中檢視應用程式的下載與安裝大小。

Google Play Console 中的 App size 分頁

下載大小是根據 XXXHDPI(約 640dpi)裝置及 arm64-v8a 架構計算。實際使用者的下載大小可能會依其硬體而有所不同。

上方分頁有下載大小與安裝大小的切換。此頁面下方也提供了優化建議。

iOS

#

建立 Xcode App Size Report

首先,請依照 iOS 建立 build archive 指南 設定 app 版本與建置。

接著:

  1. 執行 flutter build ipa --export-method development
  2. 執行 open build/ios/archive/*.xcarchive 以在 Xcode 中開啟 archive。
  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 的 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

在這個範例中,該應用程式於 iPhone12,1(Model ID / Hardware number,即 iPhone 11)及 iPhone11,8(iPhone XR)運行 iOS 13.0 時,約略下載大小為 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 進行更細緻的分析,透過樹狀或樹狀圖(treemap)檢視,將應用程式內容細分到單一檔案層級,甚至 Dart AOT 產物的函式層級。

你可以透過 dart devtools,選擇 Open app size tool 並上傳該 JSON 檔案來完成。

Example breakdown of app in DevTools

如需進一步了解如何使用 DevTools 應用程式大小工具,請參閱 DevTools 文件

減少應用程式大小

#

建構應用程式發行版時,建議使用 --split-debug-info 標籤。此標籤可大幅減少程式碼大小。範例請參閱 混淆 Dart 程式碼

你還可以採取以下措施讓應用程式更小:

  • 移除未使用的資源
  • 最小化從函式庫匯入的資源
  • 壓縮 PNG 與 JPEG 檔案