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