如何進(jìn)行Flutter混合開發(fā)

Why Flutter ?

older_crossed_platform.png

Flutter框架與應(yīng)用

框架與Source Code

整體框架
flutter_struct_base.jpg
Source Code
flutter_struct_function.png

所以從上面的分析可以看出,為了實(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)的作用是什么。

flutter._apk_change_graffle.png

從上圖的標(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ā)步驟

    1. 在Flutter模式下進(jìn)行flutter相關(guān)功能的開發(fā)绳姨。
    2. 將代碼打包成一個(gè)aar庫(kù)上傳到repository中去進(jìn)行版本控制。
    3. 切換分支到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ā)模式下的打包操作。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末凌盯,一起剝皮案震驚了整個(gè)濱河市付枫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驰怎,老刑警劉巖阐滩,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異县忌,居然都是意外死亡掂榔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門症杏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)装获,“玉大人,你說我怎么就攤上這事鸳慈”ヒ纾” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵走芋,是天一觀的道長(zhǎng)绩郎。 經(jīng)常有香客問我,道長(zhǎng)翁逞,這世上最難降的妖魔是什么肋杖? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮挖函,結(jié)果婚禮上状植,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好津畸,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布振定。 她就那樣靜靜地躺著,像睡著了一般肉拓。 火紅的嫁衣襯著肌膚如雪后频。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天暖途,我揣著相機(jī)與錄音卑惜,去河邊找鬼。 笑死驻售,一個(gè)胖子當(dāng)著我的面吹牛露久,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播欺栗,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼毫痕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了纸巷?” 一聲冷哼從身側(cè)響起镇草,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤眶痰,失蹤者是張志新(化名)和其女友劉穎瘤旨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竖伯,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡存哲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了七婴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祟偷。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖打厘,靈堂內(nèi)的尸體忽然破棺而出修肠,到底是詐尸還是另有隱情,我是刑警寧澤户盯,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布嵌施,位于F島的核電站,受9級(jí)特大地震影響莽鸭,放射性物質(zhì)發(fā)生泄漏吗伤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一硫眨、第九天 我趴在偏房一處隱蔽的房頂上張望足淆。 院中可真熱鬧,春花似錦、人聲如沸巧号。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丹鸿。三九已至歹鱼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卜高,已是汗流浹背弥姻。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掺涛,地道東北人庭敦。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像薪缆,于是被迫代替她去往敵國(guó)和親秧廉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容