Why Flutter ?
Flutter框架與應(yīng)用
框架與Source Code
整體框架
Source Code
所以從上面的分析可以看出,為了實(shí)現(xiàn)Flutter的平臺(tái)無(wú)差異性耸采,Google主要在 PlatForm Integration和Dart:UI部分做了適配工作澜驮。
APK(Android應(yīng)用)結(jié)構(gòu)
我們通過解壓一個(gè)release的混合開發(fā)APK包瓤的,來(lái)探索一下加入了Flutter之后的包到底發(fā)生了哪些變化以及這些變化對(duì)應(yīng)的作用是什么。
從上圖的標(biāo)記中可以清楚的看出變化點(diǎn)
-
變化1
未在圖中標(biāo)出建椰,但是我相信大部分的開發(fā)者應(yīng)該可以猜的到,就是在dex中打入了 PlatForm Integration的代碼(FutterActivity,F(xiàn)lutterApplication姻几,F(xiàn)lutterView etc.)
-
變化2
assets下面的4個(gè)文件,內(nèi)容均為arm指令
-
isolate_snapshot_data/isolate_snapshot_instr
對(duì)應(yīng)了我們的Flutter代碼進(jìn)行AOT編譯,用于創(chuàng)建一個(gè)新isolate
-
vm_snapshot_data/vm_snapshot_instr
用于初始化Dart VM,提供 runTime,gc等服務(wù)
由于該部分內(nèi)容通過gen_snapshot編譯生成势告,且存放在App的data目錄下面蛇捌,所以
為以后的動(dòng)態(tài)更新提供了可能。
-
-
變化3
ICU Dart Language包咱台,提供語(yǔ)言相關(guān)的數(shù)據(jù)信息络拌。
變化4
? Flutter Engine層的代碼
Flutter混合模式
相信對(duì)于絕大多數(shù)應(yīng)用來(lái)說,從零開始重新做一個(gè)App的成本是相當(dāng)高的回溺,所以混合開發(fā)成了它們嘗試Flutter的首選春贸。
閑魚模式
雙Branch共存(Flutter模式 && Standalone模式)
Standalone模式:純Native開發(fā)或者是平臺(tái)打包下的模式
Flutter模式:進(jìn)行flutter相關(guān)功能的開發(fā),庫(kù)生成遗遵,編譯和調(diào)試走的都是Flutter定義的流程萍恕。
- 優(yōu)點(diǎn)
在Standalone模式下,純Native開發(fā)者和打包平臺(tái)车要,對(duì)Flutter是無(wú)感知的雄坪。在這種情況下,F(xiàn)lutter相關(guān)的代碼可以認(rèn)為是一個(gè)常規(guī)的第三方庫(kù)文件。
-
前期準(zhǔn)備
理清Standalone模式下對(duì)Flutter的依賴并將它們提取成一個(gè)aar庫(kù)维哈。
-
開發(fā)步驟
- 在Flutter模式下進(jìn)行flutter相關(guān)功能的開發(fā)绳姨。
- 將代碼打包成一個(gè)aar庫(kù)上傳到repository中去進(jìn)行版本控制。
- 切換分支到Standalone模式阔挠,修改相關(guān)依賴包的版本號(hào)飘庄。
當(dāng)然這種方法在實(shí)際的開發(fā)過程中還會(huì)遇到很多其他問題,比如復(fù)雜流程下生成aar庫(kù)腳本的編寫购撼,比如兩個(gè)模式下的代碼同步等跪削。
Google模式
對(duì)與方便的進(jìn)行Flutter的混合模式開發(fā)呼聲有多高,Google專門為了這個(gè)問題建立了Wiki并且進(jìn)行了持續(xù)4個(gè)月42個(gè)版本的更新迂求。
創(chuàng)建Flutter Module模式
1.1.1 切換flutter分支
假如直接使用
$ cd some/path/
$ flutter create -t module my_flutter
會(huì)出現(xiàn)無(wú)法識(shí)別 command module的錯(cuò)誤,查找其原因發(fā)現(xiàn)我們默認(rèn)clone的分支是flutter的beta版本并不支持module命令所以首先需要
flutter channel
flutter channel master
flutter upgrade
將分支切換到master并且進(jìn)行upgrade操作碾盐。
1.1.2 創(chuàng)建Flutter module模版
flutter create -t module flutter_module
這個(gè)時(shí)候會(huì)看到project中新增加了一個(gè)flutter_module,其中包含了.android,.ios和關(guān)鍵的include_flutter.groovy文件
1.1.3 將Flutter添加到現(xiàn)有工程中
-
在android工程的根目錄的settings.gradle中添加
include ':app' // assumed existing content setBinding(new Binding([gradle: this])) // new evaluate(new File( // new settingsDir.parentFile, // new 'flutter_module/.android/include_flutter.groovy' // new ))
-
在app的build.gradle中添加依賴
dependencies { implementation project(':flutter')
1.1.4 總而言之
簡(jiǎn)單的說揩局,Google在兼顧維護(hù)成本和開發(fā)成本的前提下毫玖,為了Insert flutter module ,建立了一個(gè)邏輯依賴鏈
flutter_module/.android/include_flutter.groovy ->
flutter_module/.android/Flutter/build.gradle ->
$flutterRoot/packages/flutter_tools/gradle/flutter.gradle
利用 $flutterRoot/packages/flutter_tools/lib/中的flutter command &&
$AndroidRoot/build-tools/buildToolsVersion/中的android command
完成混合開發(fā)模式下的打包操作。