京東技術中臺Flutter實踐之路(二)
我們的目標:解決實戰開發問題,打造暢快開發體驗,共建Flutter生態。
-
Flutter和原生互動工作量大,需要配置Android,iOS和Flutter三端的開發人員,提高了開發門檻和人力成本。
-
Flutter容器無法共享Flutter引擎,開啟多個Activity時會啟動多個Flutter引擎,記憶體開銷比較大。
-
基礎元件和通用業務元件較少,需要業務自行封裝各種基礎元件,且沒有一個統一的平臺支援元件共享。
-
Flutter不支援反射,在iOS端無法動態更新可執行程式碼,線上出現問題,只能重新發版本,沒有較好的兜底方案,容錯性較差。
-
統一技術棧,簡化工作量:業務開發統一採用Flutter開發,無需額外配備Android和iOS開發工程師,適配的工作全部由容器來做;
-
便於元件複用:比如收貨地址管理的元件,是基於容器API開發的,那麼同樣基於容器API開發的APP都可以複用該元件;
-
底層模組可替換,更方便維護:容器對下層模組也提供了統一的協議層,只要上層API不變,底層模組可以根據協議來重新實現和替換;
-
減少包的體積大小:統一API之後,開發者不用再去自己依賴第三方外掛,大家統一共用容器的基礎元件,提高複用性,JDFlutter容器元件為獨立外掛,透過注入依賴的方式注入到容器之中,耦合性非常低;在混合開發中,一般native工程中都會有相同的功能元件,我們可以將native元件注入的到容器中來代替容器中的元件,這樣可以做到最大化的減少容器的體積;
-
業務程式碼隔離:元件可獨立編譯除錯,容器提供了一套完整的執行環境,每個業務元件可以獨立去開發,編譯,執行,這樣多個業務團隊可以並行去開發各自的業務工程,透過router的方式實現依賴跳轉,避免程式碼交叉呼叫,減少程式碼汙染。
02 動態化
動態化作為順應業務高速發展及低成本試錯,實現靈活高效發版和更新的重要手段,近年來顯得尤為重要,甚至成為了衡量移動端框架優劣的核心指標,RN、小程式等之所以能被大規模使用,也和支援動態更新,無需發版安裝有著一定的關係。
Flutter本身在跨平臺和效能方面都表現卓越,但是由於蘋果對於動態程式碼執行的限制,導致Flutter無法實現iOS端的動態化,這可能是它的不足之處(主要是蘋果的政策原因和技術無關)。經過我們的調研,目前市場上動態化實現的方式有兩種,一種是以Dart作為DSL動態下發的方式來實現佈局的動態化,另外一種是用JS來開發UI生成描述資訊,最終由Flutter進行渲染。 JDFlutter在動態化方面也做了一些探索嘗試,我們的目標是採用Flutter環境進行開發除錯,使用動態化框架開發出來的程式碼既能動態化執行,也能在Flutter原生環境中執行,同時不入侵Flutter的底層框架,對Flutter sdk升級保持很好的相容性。 本文簡單闡述實現思路,後續將單獨介紹具體的實現方法。 使用Flutter開發環境進行開發和除錯程式,釋出時採用dart2js技術將Flutter程式碼轉換成js程式碼,釋出到服務端,然後由Flutter容器從服務端下載程式碼,執行js邏輯,將js渲染的佈局資訊,傳遞到Flutter層,最終由Flutter渲染出來。03 模組注入
我們在JDFlutter封裝了一套應用開發所需的基礎模組:包含網路,圖片,異常,埋點,效能,裝置,掃碼,影片等業務開發所需模組,模組分為兩種型別,一種是基於純dart開發的模組,另外一種是基於native封裝的模組。根據不同的編譯產物我們會注入不同型別的模組來滿足不同執行平臺的需求,如編譯成web產物,會注入純dart的網路模組來代替封裝的native模組。
04 Flutter2Web
體量及規模龐大的線上業務活動,在巨大流量衝擊下,可能會面臨當機的風險,類似情況,服務端普遍會透過如叢集擴容、多機房部署、限流、削峰、降級兜底等預案進行部署。同樣,移動端上線新業務,在未經過大規模驗證的情況下,也可能在個別場景出現異常,需要考慮兜底方案,以減少線上事故的發生。
此時除了動態化修復更新之外,我們使用了Flutter2web工具將Flutter業務轉換成H5,用於降級容災。JDFlutter容器抹平了native和web的API,在程式碼不用做改動的情況下,支援將Flutter應用轉換web應用,執行在JDFlutter的webview中,並提供js channel的支援,web依然可以呼叫原生能力。
05 iOS瘦身
Flutter打出的ipa包一般會比較大,先期京東APP上線的6個Flutter業務整合後,致使iOS客戶端增加了約17M。為了減少包大小,我們借鑑了位元組跳動的做法,對引擎做了改造,將App.framework和Flutter.framwork的部分資料透過動態下發的方式來實現,同時剝離了資原始檔。改造之後,對Flutter業務進行再次打包測試,包體積可減少約28%左右,瘦身效果明顯,且隨著業務數量的增加,瘦身的效果及收益會更為顯著,以下是瘦身方案,後續關於iOS瘦身,也會做詳細的分享。
06 混合開發
Flutter與原生的混合開發有兩種情況,其一,開發 Flutter 業務的同學,需要和原生做互動,因此需要有 Flutter 和原生的混合編譯環境;其二,使用原生 SDK 開發業務的同學,需要和 Flutter 業務一起整合打包,但對 Flutter 透明,無需編譯Flutter的程式碼,以減少對 Flutter 編譯環境的依賴,我們將Flutter 編譯成 aar 或framework,放入原生專案中即可,以下為JDFlutter混合開發的流程介紹。
07 多團隊基於容器的開發方式
容器提供了一套完整的執行環境,實現了業務元件解耦,每個業務都可以獨立編譯,執行,除錯,待到釋出時再整合主客戶端,業務整合時可透過線上自動完成,這樣好處上文已說明,可減少業務元件之間的交叉依賴,同時也可以提升編譯除錯效率。
08 Pub倉庫
前一篇實踐文章中分享了Pub倉庫的搭建過程,2020年初京東pub倉庫做了深度的定製,除了滿足基礎元件上傳和下載功能依賴,還增加了賬戶認證,許可權管理,元件收藏,文件,社群等功能,來完善京東Flutter的內部生態,打造更好的技術氛圍,當前內部共享的元件數量已達上百個,還在不斷增加中,後續我們也會將優質元件開放出來,貢獻給外部社群,幫助外部的小夥伴更好地完成Flutter基礎建設。
09 JDFlutter全流程支援
為了讓業務開發者開發能夠更方便快捷地接入的容器sdk,JDFlutter提供了配套的開發工具讓使用者可以一鍵建立工程,git倉庫,配置依賴的容器sdk和工程的初始化模版程式碼來簡化開發者的工作量,同時支援熱更新與灰度釋出,Flutter外掛釋出,線上打包,異常監控,容災降級等一站式的服務,提供了全流程的支援。
歡迎加入JDFlutter技術專區探討交流。
QQ群:1022619726
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912185/viewspace-2725936/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 京東技術中臺的Flutter實踐之路Flutter
- 乾貨 | 京東技術中臺的Flutter實踐之路Flutter
- 京東短網址高可用提升最佳實踐 | 京東雲技術團隊
- 京東到家的持續整合實踐之路
- 技術沙龍|京東雲DevOps自動化運維技術實踐dev運維
- 京東數科:2020年京東區塊鏈技術實踐白皮書(附下載)區塊鏈
- 京東APP百億級商品與車關係資料檢索實踐 | 京東雲技術團隊APP
- 沙龍報名 | 京東雲DevOps——自動化運維技術實踐dev運維
- 技術沙龍出海日本:分享京東區塊鏈實踐與創新區塊鏈
- AI驅動的京東端到端補貨技術建設實踐AI
- 線上公開課 | 京東雲監控系統設計及落地之路 京東雲技術新知
- 京東重構技術版圖
- Flutter:移動端跨平臺技術演進之路Flutter
- 京東物流實時風控實踐
- 618京東到家APP-門詳頁反爬實戰 | 京東雲技術團隊APP
- 京東掃描平臺EOS—JS掃描落地與實踐JS
- 京東智聯雲亮相KubeCon 2020 探尋雲原生技術發展之路
- 容器技術的未來——京東雲技術專訪
- 阿里一面 京東一面+二面 | 掘金技術徵文阿里
- 京東雲Kubernetes叢集最佳實踐
- 京東零售大資料雲原生平臺化實踐大資料
- 從 0 到 1:我的 Flutter 技術實踐 | 掘金技術徵文Flutter
- PPT講義:京東物流的區塊鏈創新實踐之路(附下載)區塊鏈
- 淺談LocalCache | 京東雲技術團隊
- JOIN US | 京東雲誠聘技術精英
- 劉強東喊出技術轉型第二年,京東AI全景圖首次披露AI
- 京東資料庫智慧運維平臺建設之路資料庫運維
- 微店的Flutter混合棧管理技術實踐Flutter
- 京東加碼技術 築牢“以實助實”生態基座DLU
- 京東加碼技術 築牢“以實助實”生態基座II
- 乾貨 | 京東雲部署Wordpress最佳實踐
- 京東物流常態化壓測實踐
- 京東購物小程式cookie方案實踐Cookie
- 京東LBS推薦演算法實踐演算法
- 京東首次對外展示技術全景圖,扮演產業網際網路中臺的角色產業
- 淺談活動中臺系統技術債管理實踐
- 實錘!購自京東的茅臺確屬假貨 京東:被掉包
- 京東實時資料產品應用實踐