測量您的應用程式大小
許多開發者都很關心他們編譯後的應用程式大小。 由於 Flutter 應用程式的 APK、app bundle 或 IPA 版本 是自包含的,並且包含執行應用程式所需的所有程式碼與資源(Assets), 因此其大小可能成為一個問題。應用程式越大, 在裝置上所需的空間就越多, 下載所需的時間也會越長, 而且可能會超過某些實用功能的限制, 例如 Android 即時應用程式(instant apps)。
Debug 版本不具代表性
#預設情況下,使用 flutter run 啟動您的應用程式, 或是在您的 IDE 中點擊 Play 按鈕 (如 撰寫您的第一個 Flutter 應用程式 中所使用), 會產生 Flutter 應用程式的 debug 版本。 Debug 版本的應用程式大小較大,這是因為 其包含了支援 hot reload 及原始碼層級除錯的除錯開銷。 因此,這並不代表最終用戶下載的正式版(production) 應用程式的大小。
檢查總體大小
#預設的 release 版本,例如使用 flutter build apk 或 flutter build ios 所建立的版本,是為了方便您組裝 上傳至 Play Store 與 App Store 的套件。 因此,這些也不代表 最終用戶實際下載的大小。應用程式商店通常會重新處理並拆分 您上傳的套件,以針對特定的下載者及其硬體做最佳化, 例如根據手機的 DPI 過濾資源(Assets), 根據手機的 CPU 架構過濾原生程式庫。
預估總體大小
#要獲得各平台上最接近實際的應用程式大小,請依照下列 說明操作。
Android
#請依照 Google Play Console 的說明 來檢查應用程式的下載與 安裝大小。
為您的應用程式產生一個上傳套件:
flutter build appbundle登入你的 Google Play Console。將你的應用程式二進位檔(.aab 檔案)拖曳上傳。
在 Android vitals -> App size 分頁中檢視應用程式的下載與安裝大小。
下載大小是根據 XXXHDPI(約 640dpi)裝置及 arm64-v8a 架構計算。實際使用者的下載大小可能會依其硬體而有所不同。
上方分頁有下載大小與安裝大小的切換。此頁面下方也提供了優化建議。
iOS
#首先,請依照 iOS 建立 build archive 指南 設定 app 版本與建置。
接著:
- 執行
flutter build ipa --export-method development。 - 執行
open build/ios/archive/*.xcarchive以在 Xcode 中開啟 archive。 - 點選 Distribute App。
- 選擇發佈方式。如果你不打算發佈應用程式,選擇 Development 最為簡單。
- 在 App Thinning 中,選擇「all compatible device variants」。
- 勾選 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-sizeflutter build appbundle --analyze-sizeflutter build ios --analyze-sizeflutter build linux --analyze-sizeflutter build macos --analyze-sizeflutter build windows --analyze-size
這種建構方式與標準發行版建構有兩點不同:
- 工具會以記錄 Dart 套件程式碼大小用量的方式編譯 Dart。
- 工具會在終端機顯示高層級的大小拆解摘要,並留下
*-code-size-analysis_*.json檔案,供 DevTools 進一步詳細分析。
除了分析單一建構結果外,也可以將兩個 *-code-size-analysis_*.json 檔案載入 DevTools 進行差異比較。詳情請參閱 DevTools 文件。
透過這份摘要,你可以快速掌握各類別(如資源、原生程式碼、Flutter 函式庫等)的大小用量。編譯後的 Dart 原生函式庫也會依套件進一步拆解,方便快速分析。
在 DevTools 進行更深入分析
#上述產生的 *-code-size-analysis_*.json 檔案可於 DevTools 進行更細緻的分析,透過樹狀或樹狀圖(treemap)檢視,將應用程式內容細分到單一檔案層級,甚至 Dart AOT 產物的函式層級。
你可以透過 dart devtools,選擇 Open app size tool 並上傳該 JSON 檔案來完成。
如需進一步了解如何使用 DevTools 應用程式大小工具,請參閱 DevTools 文件。
減少應用程式大小
#建構應用程式發行版時,建議使用 --split-debug-info 標籤。此標籤可大幅減少程式碼大小。範例請參閱 混淆 Dart 程式碼。
你還可以採取以下措施讓應用程式更小:
- 移除未使用的資源
- 最小化從函式庫匯入的資源
- 壓縮 PNG 與 JPEG 檔案