Flutter(十八) 編譯模式

在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模式

Android Studio的提示

下面的情況會出現在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來自行封裝
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章