做者:閒魚技術-凱航android
Flutter是一個使用Dart語言開發的跨平臺移動UI框架,經過自建繪製引擎,能高性能、高保真地進行Android和IOS開發。在業界還未出現過Base Flutter的大型商業應用實戰驗證的狀況下,閒魚技術團隊在最複雜且重要的商品詳情頁做了相關的技術實踐並取得良好的結果。現嘗試經過本文向有興趣進行相似實踐的開發者或團隊分享過程當中的思考/實踐過程。ios
面對一系列移動開發技術:IOS、Android、Weex,RN, Kotlin,H5... Flutter究竟特點何在? git
瞭解過Flutter的都知道,它採用Dart語言進行開發,而並不是Java,Javascript這類熱門語言,這是Flutter團隊對當前熱門的10多種語言慎重評估後的選擇。由於Dart囊括了多數編程語言的優勢,它更符合Flutter構建界面的方式。 github
ReactNative | Flutter |
---|---|
![]() |
![]() |
ReactNative算法
Fluttershell
Flutter更多特點能夠連接爲何說Flutter是革命性的?編程
每一個框架都是爲解決特定問題而產生的,不存在最好的框架,只有最適合你團隊的框架。閒魚是個業務快速發展的App,爲更多業務嘗試和探索,它採用現有流行的框架,能支持線上動態化需求。但出於個性化交互以及流暢性體驗(首頁、商品詳情、發佈閒置等),主鏈路依舊只採用原生開發。爲兼顧跨端開發及高性能需求,閒魚通過充分調用,最終選擇了Flutter。爲驗證Flutter的性能,閒魚挑選重要且複雜的主鏈路業務(商品詳情)做爲首個Flutter頁面實踐點,以這種方式來快速暴露並解決Flutter相關問題。緩存
隨着Flutter版本的不斷迭代,穩定性和質量逐漸完善,市場上純Flutter開發的App也不斷涌現。閒魚對Flutter採起「由點到面,逐一替換」 的策略,先將商品詳情遷移到Flutter頁面,後續逐步擴展到其餘功能模塊,但這樣就不可避免涉及到Flutter與Native頁面混合調用的場景(以下圖): 性能優化
Flutter | Native(Android) |
---|---|
![]() |
![]() |
所以要混合調用就會涉及兩個問題:併發
Flutter出現的目的旨在統一Android/IOS兩端編程,所以徹底基於Flutter開發的App,只需提供一個包含FlutterView的頁面,後續頁面增長/刪除/跳轉均在FlutterView的Navigator中進行管理。但如今閒魚只是將部分模塊修改爲Flutter開發,咱們不可能爲統一頁面棧管理而將其餘全部頁面用Flutter重作一次,權衡成本與風險,亟需統一管理Native頁面和Flutter頁面跳轉交互的混合棧。爲此,閒魚提出了4種解決方案(以下圖):
考慮到每啓動一個頁面都新建立一套新的Flutter渲染機制,開銷太重,目前閒魚Flutter實踐採用方案2,相比而言,該方案性能相對穩定且易操做,下面就是否複用FlutterView進行對比,主要觀測Java內存和Native內存增長狀況:
解決了Flutter與Native混合編程所面臨的問題後,接下來要處理的就是混編工程問題,出現該問題的緣由仍是咱們的項目不是徹底的Flutter工程(即:android /ios + Flutter)所致。混合工程項目結構以及Flutter產物以下圖:
項目結構
Flutter產物
其實對通常Flutter工程而言,採用AndroidStudio編譯Flutter與編譯Native工程方式同樣,當將其部署到server端採用mtl編譯時,server缺乏Flutter編譯環境,於是致使Flutter工程沒法編譯。解決此問題能夠採起兩種方式:
對1,對各server端都去部署Flutter環境有點不切實際(若server就那麼幾臺也能夠);對2,閒魚的作法是將Flutter工程編譯出的中間產物以AAR形式導出並上傳至maven庫,最後Native工程以依賴包形式將AAR打入最終apk中,這樣處理後解耦了Native團隊對Flutter團隊的依賴。固然,具體實踐過程當中確定沒有這麼簡單,咱們在編譯過程當中對Pod/Gradle編譯腳本、engine以及flutter_tools等均有所優化,對後續集團推廣Flutter奠基了基礎。
將Flutter應用於閒魚,不可避免須要使用集團提供的基礎組件庫,但這些組件庫都是Native,考慮到爲後續Flutter在集團推廣,打造阿里Flutter生態圈,閒魚團隊對集團內部基礎組件庫作了適配支撐,後續可創建私有倉庫,直接Git引用。
在之內容爲王的時代,多媒體技術備受關注,性能的好壞直接影響用戶體驗,但Flutter多媒體默認功能存在如下缺陷:
爲改善體驗,優化性能,閒魚對Flutter播放器以及圖片性能做出以下改進:
具體方案:
有過移動開發經驗的都知道,圖片展現是OOM出現的高頻場景,而Flutter默認採用基於LRU算法的圖片緩存策略,且圖片緩存MaxSize=1000,佔用內存較高,爲此閒魚採用如下兩種策略對圖片性能進行優化
解決了Flutter存在的問題,要的就是產品可以以一種性能穩定、交互流暢、界面美觀的姿態呈如今用戶面前,下面就以閒魚寶貝詳情線上Flutter版本爲引,對Flutter應用頁面展現、性能以及成熟度進行闡述。
測試環境
注: 下圖僅對Flutter和Native性能進行了粗略對比
目前Flutter尚處於Preview階段,沒有通過大規模實踐驗證,框架成熟度及穩定性仍有待完善。上文僅僅是將閒魚團隊在實踐Flutter開發時碰到部分問題及解決方案進行了簡略闡述,一個產品從開發到上線所面臨的問題,確定遠不及這些。隨着Flutter覆蓋場景的增長,難題也會不斷涌現,健全有效的性能及穩定性監控體系不可或缺。爲建設基於Flutter全新的一體化研發體系,提升開發效率,對動態化需求、規範Dart編碼、統一中間件橋接機制、快速發版能力及完備的自動化測試建設等一系列問題亟需解決,假若您對此感興趣,歡迎一塊兒交流學習~
簡歷投遞:guicai.gyx@alibaba-inc.com