京東技術中臺Flutter實踐之路(二)

京東科技開發者發表於2020-10-10
京東技術中臺Flutter實踐之路(二)
移動網際網路歷經高速發展的黃金10年,多樣的市場需求催化了前端技術不斷升級改造,真正的前端大統一時代正在來臨,不管你願不願意相信,大前端技術的發展趨勢已是定勢,前進的腳步無可改變。 眾所周知,iOS、Android、Web分別代表著前端技術需要考慮的必要方向,傳統的移動網際網路開發需要同時考慮多個平臺對應的技術研發資源儲備,公司開發同一個業務,需要至少三個獨立團隊參與評審及開發,測試也需要至少三倍工作量以完成對應平臺的程式碼測試,這樣的生產效率已無法滿足業務快速迭代的需要,生產成本之高也嚴重考驗著企業的承受能力,且多個平臺的一致性體驗並不盡如人意,因此,僅使用一套程式碼,同時適配多個平臺的能力就顯得極為重要。 目前,Hybrid、RN、weex、小程式等框架陸續推出,各網際網路大廠也在積極嘗試跨端開發技術的實踐應用,已有很多業務使用到跨端技術,但各個框架各有優劣,且仍然離不開原生開發;而Flutter框架推出後,以其效能高,多端平臺的UI一致性高,及開發除錯效率高等強優勢,越來越吸引著原生開發者的注意,併成為其首選的跨平臺技術框架。
京東技術中臺Flutter實踐之路(二)
近年,京東技術中臺也在移動應用跨端開發領域進行了深度探索與實踐,JDReact已廣泛應用於京東係數十APP的幾百個業務內,京東小程式開放平臺也於2020年4月正式釋出推廣, 而備受矚目的Flutter,我們早在2017年的官方非正式版推出後,即投入調研開發,並在物流APP內實現驗證上線,其高效的除錯效率,極低的UI試錯成本,以及接近原生的流暢性體驗,都給了我們很大的吸引力。2018年初,我們將現有的混合APP進行了一次重構,歷時兩個月,實現了第一個純Flutter APP正式上線,研發人力縮減25%,開發效率得到了明顯的提升。 在這次重構中,我們也意識到,雖然Flutter具有很令人興奮的優勢,但也存在明顯的缺點,例如,Flutter技術生態尚不成熟,開發者初期投入,一般都會面臨大量時間投入在框架的基礎建設中,人力消耗反而很高。為了避免京東內部團隊重複建設,構建高可複用的Flutter基礎設施,從根本上實現真正的降本提效,京東技術中臺成立了專項團隊進行JDFlutter的研發與建設,專注於Flutter基礎生態建設,為內部Flutter開發者提供包含專業開發工具鏈、SDK、元件的一站式開發解決方案。

我們的目標:解決實戰開發問題,打造暢快開發體驗,共建Flutter生態。


內容回顧:乾貨 | 京東技術中臺的Flutter實踐之路 (一)

京東技術中臺Flutter實踐之路(二)
JDFlutter歷經2019年的發展與積累,以提供混合路由+Flutter元件+技術支援的方式,已經與京東App,影片App,物流App,到家App,一號店APP,7Fresh,掌櫃寶,極速版APP等數十個開發團隊進行交流,並建立了合作關係。期間我們發現,App開發團隊在使用Flutter改造業務時,普遍會碰到如下問題,導致開發效率非但沒有得到提升,App容錯能力等反而會降低:
  • Flutter和原生互動工作量大,需要配置Android,iOS和Flutter三端的開發人員,提高了開發門檻和人力成本。
  • Flutter容器無法共享Flutter引擎,開啟多個Activity時會啟動多個Flutter引擎,記憶體開銷比較大。
  • 基礎元件和通用業務元件較少,需要業務自行封裝各種基礎元件,且沒有一個統一的平臺支援元件共享。
  • Flutter不支援反射,在iOS端無法動態更新可執行程式碼,線上出現問題,只能重新發版本,沒有較好的兜底方案,容錯性較差。
2020年初,技術與資料中臺-共享技術部重點投入資源,全面升級JDFlutter,以JDFlutter容器+開發工具+全新元件平臺+Demo App+技術社群等矩陣型產品,為開發者提供了一站式移動應用跨端開發解決方案,幫助Flutter開發者降低接入及開發成本,助力提升業務效率。
京東技術中臺Flutter實踐之路(二)
△ JDFlutter 完整架構 △
01 容器
容器是我們在作業系統和業務執行邏輯之間的中間層,它隔離了作業系統和應用邏輯的直接聯絡,也隔離業務和基礎元件之間的依賴,讓開發者無需關心各個作業系統的差異,只需面向容器API程式設計即可,這樣做的好處有以下幾點:
  1. 統一技術棧,簡化工作量:業務開發統一採用Flutter開發,無需額外配備Android和iOS開發工程師,適配的工作全部由容器來做;
  2. 便於元件複用:比如收貨地址管理的元件,是基於容器API開發的,那麼同樣基於容器API開發的APP都可以複用該元件;
  3. 底層模組可替換,更方便維護:容器對下層模組也提供了統一的協議層,只要上層API不變,底層模組可以根據協議來重新實現和替換;
  4. 減少包的體積大小:統一API之後,開發者不用再去自己依賴第三方外掛,大家統一共用容器的基礎元件,提高複用性,JDFlutter容器元件為獨立外掛,透過注入依賴的方式注入到容器之中,耦合性非常低;在混合開發中,一般native工程中都會有相同的功能元件,我們可以將native元件注入的到容器中來代替容器中的元件,這樣可以做到最大化的減少容器的體積;
  5. 業務程式碼隔離:元件可獨立編譯除錯,容器提供了一套完整的執行環境,每個業務元件可以獨立去開發,編譯,執行,這樣多個業務團隊可以並行去開發各自的業務工程,透過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渲染出來。
京東技術中臺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瘦身,也會做詳細的分享。

京東技術中臺Flutter實踐之路(二)


06 混合開發


Flutter與原生的混合開發有兩種情況,其一,開發 Flutter 業務的同學,需要和原生做互動,因此需要有 Flutter 和原生的混合編譯環境;其二,使用原生 SDK 開發業務的同學,需要和 Flutter 業務一起整合打包,但對 Flutter 透明,無需編譯Flutter的程式碼,以減少對 Flutter 編譯環境的依賴,我們將Flutter 編譯成 aar 或framework,放入原生專案中即可,以下為JDFlutter混合開發的流程介紹。

京東技術中臺Flutter實踐之路(二)


07 多團隊基於容器的開發方式


容器提供了一套完整的執行環境,實現了業務元件解耦,每個業務都可以獨立編譯,執行,除錯,待到釋出時再整合主客戶端,業務整合時可透過線上自動完成,這樣好處上文已說明,可減少業務元件之間的交叉依賴,同時也可以提升編譯除錯效率。

京東技術中臺Flutter實踐之路(二)


08 Pub倉庫


前一篇實踐文章中分享了Pub倉庫的搭建過程,2020年初京東pub倉庫做了深度的定製,除了滿足基礎元件上傳和下載功能依賴,還增加了賬戶認證,許可權管理,元件收藏,文件,社群等功能,來完善京東Flutter的內部生態,打造更好的技術氛圍,當前內部共享的元件數量已達上百個,還在不斷增加中,後續我們也會將優質元件開放出來,貢獻給外部社群,幫助外部的小夥伴更好地完成Flutter基礎建設。

京東技術中臺Flutter實踐之路(二)


09 JDFlutter全流程支援


為了讓業務開發者開發能夠更方便快捷地接入的容器sdk,JDFlutter提供了配套的開發工具讓使用者可以一鍵建立工程,git倉庫,配置依賴的容器sdk和工程的初始化模版程式碼來簡化開發者的工作量,同時支援熱更新與灰度釋出,Flutter外掛釋出,線上打包,異常監控,容災降級等一站式的服務,提供了全流程的支援。

京東技術中臺Flutter實踐之路(二)
京東技術中臺Flutter實踐之路(二)
2020年,正是JDFlutter產品化及規模化發展的元年,京東技術與資料中臺-共享技術部已經投入大量的核心研發人力,對專案進行重點建設;當前JDFlutter的每一項開發任務,都是為了幫助京東的業務研發團隊更快速更順利的實現業務發展目標,不止於此,JDFlutter未來也會更加開放,以專業的商業化解決方案來幫助更多外部開發者。 我們也和Google的Flutter的研發團隊保持著密切的聯絡,對技術問題進行探討和分享,後續對於容器,動態化,Flutter2web,Flutter瘦身,持續整合,Pub倉庫等方面的最新進展及成果,我們會持續為大家帶來專題分享,期待大家的關注與支援。

歡迎加入JDFlutter技術專區探討交流。

QQ群:1022619726

京東技術中臺Flutter實踐之路(二)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912185/viewspace-2725936/,如需轉載,請註明出處,否則將追究法律責任。

相關文章