測量你的應用體積

許多開發者都會關注應用編譯後的大小。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. Run open build/ios/archive/*.xcarchive to open the archive in Xcode. 執行命令 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 檔案