在Android和iOS中,應用程序運行分爲debug和release模式,分別對應調試階段和發佈階段;
在Flutter中,應用程序分爲debug、profile、release三種模式,下面我們就聊一下三種模式的區別和應用;
一. Flutter編譯模式
1.1. debug模式
在 Debug 模式下,app 可以被安裝在真機、模擬器、仿真器上進行調試。
Debug 模式有如下特點:
- 斷言是開啓的(Assertions)
- 服務擴展是開啓的(Service extension)
- 這個可以從runApp的源碼查看
- runApp -> WidgetsFlutterBinding -> initServiceExtensions
- 開啓調試,類似於DevTools的工具可以連接到應用程序的進程中
- 針對快速開發和運行週期進行了編譯優化(但不是針對執行速度、二進制文件大小或者部署)
比如Dart是JIT模式(Just In Time,即時編譯,也可以理解成 邊運行邊編譯
)
默認情況下,運行 flutter run
會使用 Debug 模式,點擊Android Studio run按鈕,也是debug模式
下面的情況會出現在Debug 模式下:
- 熱重載(Hot Reload)功能僅能在調試模式下運行;
- 仿真器和模擬器僅能在調試模式下運行;
- 在debug模式下,應用可能會出現掉幀或者卡頓現象;
1.2. release模式
當我們要發佈應用程序時,總是希望最大化的優化性能和應用程序所佔據的空間。
在 Release 模式下是不支持模擬器和仿真器的,只能在真機上運行。
Release 模式有如下特點:
- 斷言是無效的
- 服務擴展是無效的
- debugging是無效的
- 編譯針對快速啓動、快速執行和小的 package 的大小進行了優化
- 比如Dart是AOT模式(Ahead Of Time,預先編譯)
flutter run --release 命令會使用 Release 模式來進行編譯,也可以給Android Studio進行配置:
如果繼續運行在模擬器上:
1.3. profile模式
profile模式和release模式類似,但是會保留一些信息方便我們對性能進行檢測。
profile模式有如下特點:
- 保留了一些擴展是開啓的;
- DevTools的工具可以連接到應用程序的進程中;
Profile模式最重要的作用就是可以利用DevTools來測試應用的性能;
二. 開發中模式區分
在開發中,我們可能想要對debug和release模式進行區分,根據不同的模式進行不同的相關設置:
- 比如網絡請求的baseURL
如何進行區分呢?常見的有兩種方式:
- 通過assert斷言,因爲在release模式下斷言是無效的
- 通過kReleaseMode常量來區分
通過斷言assert來區分:
- 因爲assert要求我們必須傳入一個bool值,所以我們使用了一個立即執行函數
String baseURL = "production baseURL";
assert(() {
baseURL = "development baseURL";
return true;
}());
通過kReleaseMode常量來區分
String baseURL = kReleaseMode ? "production baseURL": "development baseURL";
當然,上面只是針對baseURL來進行了區分,開發中如果有多個屬性需要區分呢?
- 可以封裝一個Config的類,通過InheritedWidget來進行共享即可
- 大家可以利用之前學習過的InheritedWidget來自行封裝