Flutter開(kāi)發(fā)(22)- 編譯模式

在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)自行封裝

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容