Flutter 2.2.X 版本熱修復(fù)實(shí)現(xiàn)思路分享(Android+Flutter混開項(xiàng)目)

已經(jīng)好久沒有寫文章了赡模,最近被業(yè)務(wù)折磨的一塌糊涂田炭,跟個(gè)陀螺似的,被逆時(shí)針漓柑、順時(shí)針來回地抽/(ㄒoㄒ)/教硫。
好久前就想捋一捋 Flutter 混開項(xiàng)目中熱修復(fù)的實(shí)現(xiàn)方式,最近在業(yè)余時(shí)間耗費(fèi)了一些精力終于實(shí)現(xiàn)了該功能辆布,故在此分享下實(shí)現(xiàn)思路瞬矩。

cry.jfif


當(dāng)前文章中的 FlutterSDK 特指 2.2.2 版本,新版本 SDK 中涉及熱修復(fù)窗口的相關(guān)代碼發(fā)現(xiàn)了變化锋玲,1.X 版本的實(shí)現(xiàn)方式已經(jīng)過時(shí)了景用。

實(shí)現(xiàn)原理

我的實(shí)現(xiàn)思路用到 Tinker + ASM + 自定義GradlePlugin ,Tinker 用于打資源差分包惭蹂,ASM 用于編輯關(guān)鍵類的字節(jié)碼伞插,GradlePlugin 中使用 Transform 在 Android 項(xiàng)目編譯期間去使用 ASM 的字節(jié)碼編輯功能。

在 Flutter 的早期版本中盾碗,Google 是有提供官方的熱修復(fù)能力的媚污,但是在后期的迭代版本中又將該能力給屏蔽掉了。但是其仍然留有一個(gè)窗口給到我們?nèi)?duì) Flutter 代碼與資源進(jìn)行熱修復(fù)(特指Android+Flutter混開項(xiàng)目)廷雅,只要了解了該窗口的具體發(fā)生時(shí)機(jī)Flutter Module 構(gòu)建產(chǎn)物 的知識(shí)耗美,我們便可以很直觀地實(shí)現(xiàn) Flutter 的熱修復(fù)功能。

  • Flutter 構(gòu)建產(chǎn)物(release):我們只需要關(guān)注第2與3點(diǎn)

    1. libflutter.so:Flutter 引擎相關(guān)代碼航缀,不需要關(guān)心商架。
    2. libapp.so:Flutter Module 會(huì)編譯成該 動(dòng)態(tài)庫,我們編寫的 dart 代碼都在這里谬盐,熱修復(fù) Flutter 代碼通過替換該動(dòng)態(tài)庫實(shí)現(xiàn)甸私。
    3. assets/flutter/xxx:Flutter Module 的資源位于 apk 包的 assets 下。
  • 熱修復(fù)窗口:貼代碼可能要貼很多代碼飞傀,我這里簡單描述下該該窗口的發(fā)生時(shí)機(jī)

    1. FlutterActivity 中的委托類 FlutterActivityDelegateonCreate 函數(shù)中皇型,會(huì)執(zhí)行 Flutter 引擎的初始化方法。

    2. 初始化方法會(huì)通過下述調(diào)用代碼:

     String[] args = getArgsFromIntent(activity.getIntent());
     FlutterMain.ensureInitializationComplete(activity.getApplicationContext(), args);
    

    我們關(guān)注重點(diǎn)在 FlutterMain.ensureInitializationComplete() 中砸烦。

    1. 具體實(shí)現(xiàn)代碼就不展開弃鸦,FlutterMain.ensureInitializationComplete() 中會(huì)有 libapp.so 動(dòng)態(tài)庫的位置參數(shù)的配置與傳遞,它最終的是通過 FlutterJNI.init(xxx) 函數(shù)進(jìn)行初始化(注意:libapp.so 動(dòng)態(tài)庫的加載與平時(shí)的 loadLibrary(String libname) 機(jī)制不同幢痘,不能簡單的使用 Tinker 進(jìn)行熱修復(fù))唬格。
    2. FlutterJNI.init(xxx) 函數(shù)的入?yún)?String[] args 會(huì)包含2個(gè)帶有 --aot-shared-library-name= 的字符串元素用于指定 libapp.so 動(dòng)態(tài)庫的位置,其中一個(gè)是相對(duì)位置,一個(gè)是絕對(duì)位置购岗。相對(duì)位置尋址失敗便會(huì)使用絕對(duì)位置進(jìn)行尋址汰聋。
    3. 我們只需要使用 ASM + GradlePlugin 編輯FlutterJNI.init(xxx) 函數(shù)的字節(jié)碼,將 --aot-shared-library-name= 字符串元素指定為我們自定義的動(dòng)態(tài)庫絕對(duì)路徑即可實(shí)現(xiàn) Flutter 代碼的熱修復(fù)喊积。

實(shí)現(xiàn)步驟

如下

  1. 引入 Tinker 熱修復(fù)能力烹困,這個(gè)沒啥好說的吧

  2. 對(duì) Flutter 資源和代碼進(jìn)行修改,方便驗(yàn)證乾吻。

  3. 開發(fā) Gradle 插件髓梅,使用 Transform api + ASM ,對(duì) FlutterJNI.init(xxx) 的函數(shù)字節(jié)碼進(jìn)行編輯绎签。

  4. FlutterJNI.init(xxx) 的函數(shù)字節(jié)碼編輯的主要做以下操作

    1. 判斷當(dāng)前應(yīng)用是否有做 Tinker 熱修復(fù)枯饿,該次熱修復(fù)操作是否有下發(fā) libapp.so 動(dòng)態(tài)庫。

    2. 獲取 libapp.so 動(dòng)態(tài)庫的絕對(duì)地址诡必,修改字符串?dāng)?shù)組中 --aot-shared-library-name= 的字符串元素的值指向該絕對(duì)地址奢方。

    3. 實(shí)現(xiàn) Flutter 代碼熱修復(fù),而 Flutter 資源熱修復(fù)不需關(guān)心擒权,Tinker 本身支持 assets 的熱修復(fù)袱巨,不需要額外處理。

    4. 該步驟還可以優(yōu)化碳抄,插件的開啟時(shí)機(jī)建議在只做 Flutter 熱修復(fù)的時(shí)候才開啟愉老。

    5. 使用 Gradle 插件,執(zhí)行 Tinker patch 生成的 Task剖效,安裝補(bǔ)丁重啟驗(yàn)證嫉入。

按照以上步驟,本人親測可實(shí)現(xiàn) Flutter 的熱修復(fù)功能(Android+Flutter混開項(xiàng)目)璧尸。

小結(jié)

因精力有限咒林,文章中很多內(nèi)容沒有展開描述,如有錯(cuò)誤還望指出爷光,共同進(jìn)步哈垫竞。

如果你覺得本篇文章有用的話還請(qǐng)點(diǎn)贊支持下,謝謝蛀序!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末欢瞪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子徐裸,更是在濱河造成了極大的恐慌遣鼓,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件重贺,死亡現(xiàn)場離奇詭異骑祟,居然都是意外死亡回懦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門次企,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怯晕,“玉大人,你說我怎么就攤上這事抒巢∑侗矗” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蛉谜,是天一觀的道長。 經(jīng)常有香客問我崇堵,道長型诚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任鸳劳,我火速辦了婚禮狰贯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赏廓。我一直安慰自己涵紊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布幔摸。 她就那樣靜靜地躺著摸柄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪既忆。 梳的紋絲不亂的頭發(fā)上驱负,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音患雇,去河邊找鬼跃脊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛苛吱,可吹牛的內(nèi)容都是我干的酪术。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼翠储,長吁一口氣:“原來是場噩夢啊……” “哼绘雁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起彰亥,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤咧七,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后任斋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體继阻,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耻涛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘟檩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抹缕。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖墨辛,靈堂內(nèi)的尸體忽然破棺而出卓研,到底是詐尸還是另有隱情,我是刑警寧澤睹簇,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布奏赘,位于F島的核電站,受9級(jí)特大地震影響太惠,放射性物質(zhì)發(fā)生泄漏磨淌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一凿渊、第九天 我趴在偏房一處隱蔽的房頂上張望梁只。 院中可真熱鬧,春花似錦埃脏、人聲如沸搪锣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽构舟。三九已至,卻和暖如春佩谷,著一層夾襖步出監(jiān)牢的瞬間旁壮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工谐檀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抡谐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓桐猬,卻偏偏與公主長得像麦撵,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子溃肪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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