溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

淺談跨平臺(tái)框架 Flutter 的優(yōu)勢(shì)與結(jié)構(gòu)

發(fā)布時(shí)間:2020-08-02 15:17:46 來源:網(wǎng)絡(luò) 閱讀:574 作者:個(gè)推 欄目:移動(dòng)開發(fā)

作者:個(gè)推iOS工程師 伊澤瑞爾

一、背景

目前,移動(dòng)開發(fā)技術(shù)主要分為原生開發(fā)和跨平臺(tái)開發(fā)兩種。其中,原生應(yīng)用是指在某個(gè)特定的移動(dòng)平臺(tái)上,使用平臺(tái)所支持的開發(fā)工具和語(yǔ)言,直接調(diào)用系統(tǒng)提供的API所開發(fā)的應(yīng)用。
原生開發(fā)的主要優(yōu)勢(shì)體現(xiàn)在:
1.可以快速訪問本平臺(tái)的全部功能,比如攝像頭、GPS等;
2.原生應(yīng)用的速度快、性能高,而且可以實(shí)現(xiàn)比較復(fù)雜的動(dòng)畫和繪制效果,用戶體驗(yàn)較好。
原生開發(fā)的缺點(diǎn)也很明顯,主要體現(xiàn)在:
1.開發(fā)成本較高,不同的平臺(tái)必須維護(hù)不同的代碼,人力成本也會(huì)隨之增加;
2.有新的功能需要更新時(shí),只能進(jìn)行版本升級(jí)。
隨著移動(dòng)互聯(lián)網(wǎng)的高速發(fā)展,在很多的業(yè)務(wù)場(chǎng)景下,傳統(tǒng)的純?cè)_發(fā)已經(jīng)不能滿足日益增長(zhǎng)的業(yè)務(wù)需求,主要表現(xiàn)在以下兩個(gè)方面:
1.應(yīng)用動(dòng)態(tài)化的需求增大。當(dāng)需求發(fā)生變化,或者是需要增加新的功能時(shí),傳統(tǒng)的純?cè)鷳?yīng)用開發(fā)只能通過版本的升級(jí)來更新內(nèi)容,然而應(yīng)用的上架和審核都需要一定的時(shí)間。因此,開發(fā)人員迫切地希望進(jìn)行應(yīng)用內(nèi)容的更新時(shí),可以不更新版本,提升工作效率。
2.業(yè)務(wù)需求變化快,開發(fā)成本變高。原生開發(fā)一般需要技術(shù)團(tuán)隊(duì)對(duì)iOS、Android兩個(gè)開發(fā)平臺(tái)進(jìn)行維護(hù)。當(dāng)版本更新迭代時(shí),開發(fā)和測(cè)試的成本都會(huì)增加。
針對(duì)上述兩個(gè)問題,跨平臺(tái)框架應(yīng)運(yùn)而生。

二、跨平臺(tái)技術(shù)簡(jiǎn)介

針對(duì)上文提到的原生開發(fā)所面臨的問題,目前在IT界已經(jīng)誕生了很多跨平臺(tái)框架,主要分為三類:
1.H5+原生(Cordova、Ionic、微信小程序);
2.JavaScript開發(fā)+原生渲染(React Native、Weex、快應(yīng)用);
3.自繪UI+原生(Flutter)。
在本文中,我們將對(duì)React Native、Weex和Flutter進(jìn)行對(duì)比。
1.React Native
React Native是Facebook于2015年4月開源的跨平臺(tái)移動(dòng)應(yīng)用開發(fā)框架,是Facebook開源的JS框架React在原生移動(dòng)應(yīng)用平臺(tái)的衍生物。React Native使用了react的設(shè)計(jì)模式,但是其UI渲染、動(dòng)畫效果、網(wǎng)絡(luò)請(qǐng)求等均是由原生來實(shí)現(xiàn)的。開發(fā)者編寫JS代碼,通過React Native的中間層轉(zhuǎn)化為原生控件,并進(jìn)行操作。也就是說通過JS代碼來調(diào)用原生的組件,從而實(shí)現(xiàn)相應(yīng)的功能。
React Native實(shí)現(xiàn)跨平臺(tái)的功能,主要由Java、C++和Javascript三層所構(gòu)成的。其中,C++實(shí)現(xiàn)的動(dòng)態(tài)鏈接庫(kù)(.so),作為中間適配層橋接,實(shí)現(xiàn)了JS端與原生端的雙向通信交互。React Native會(huì)把應(yīng)用的JS代碼編譯成一個(gè)JS文件,React Native整體框架目標(biāo)就是為了解釋并運(yùn)行這個(gè)JS腳本文件,如果是JS擴(kuò)展的API,則直接通過bridge調(diào)用native;如果是UI界面,則映射到virtual DOM這個(gè)虛擬的JS數(shù)據(jù)結(jié)構(gòu)中,通過bridge傳遞到native,然后根據(jù)數(shù)據(jù)設(shè)置各個(gè)對(duì)應(yīng)的真實(shí)native的View。
淺談跨平臺(tái)框架 Flutter 的優(yōu)勢(shì)與結(jié)構(gòu)
2.Weex
在Weex設(shè)計(jì)之初,開發(fā)者就考慮到,使其能夠在三端(iOS、安卓和H5)上均能得到展現(xiàn)。在最上面的DSL,阿里一般稱之為Weex文件(.we),通過Transform轉(zhuǎn)換為js-bundle,再部署到服務(wù)器,這樣服務(wù)端就完成了。在客戶端,第一層是JS-Framework,最后是RenderRengine。
淺談跨平臺(tái)框架 Flutter 的優(yōu)勢(shì)與結(jié)構(gòu)
如上圖所示,Weex的輸入是Virtual DOM,輸出是native或H5 view,還原為內(nèi)存中的樹型數(shù)據(jù)結(jié)構(gòu),再創(chuàng)建view,把事件綁定在view上,設(shè)置view的基本屬性。Weex Render會(huì)分三個(gè)線程,不同的線程負(fù)責(zé)不同的事情,讓JS線程優(yōu)先保障流暢性。

表面上,Weex是一種客戶端技術(shù),但實(shí)際上,它串聯(lián)起了從本地開發(fā)、云端部署到分發(fā)的整個(gè)鏈路。開發(fā)者可以在本地像編寫Web頁(yè)面一樣先編寫一個(gè)APP界面,然后通過命令行工具將之編譯為一段JavaScript代碼,生成一個(gè)Weex的JS bundle。與此同時(shí),開發(fā)者可以將生成的JS bundle部署至云端,之后通過網(wǎng)絡(luò)請(qǐng)求或者預(yù)下發(fā)的方式加載至用戶的移動(dòng)應(yīng)用客戶端。
在移動(dòng)應(yīng)用客戶端,Weex SDK會(huì)準(zhǔn)備一個(gè)JavaScript執(zhí)行環(huán)境,在用戶打開一個(gè)Weex頁(yè)面時(shí),在該環(huán)境中執(zhí)行相應(yīng)的JS bundle,并將執(zhí)行過程中產(chǎn)生的各種命令發(fā)送到native端,進(jìn)行界面渲染、數(shù)據(jù)存儲(chǔ)、網(wǎng)絡(luò)通信、調(diào)用設(shè)備及用戶交互響應(yīng)等。如果用戶希望使用瀏覽器訪問這個(gè)界面,那么他可以在瀏覽器中打開一個(gè)相同的Web頁(yè)面,這個(gè)頁(yè)面和移動(dòng)應(yīng)用使用相同的頁(yè)面源代碼,但被編譯成適合Web展示的JS Bundle,通過瀏覽器里的javaScript引擎及Weex SDK運(yùn)行起來的。
3.Flutter
Flutter 是Google推出并開源的移動(dòng)應(yīng)用開發(fā)框架,主打跨平臺(tái)、高保真、高性能。開發(fā)者可以通過Dart語(yǔ)言進(jìn)行APP開發(fā),只需要一套代碼就可以同時(shí)構(gòu)建Android和iOS應(yīng)用,并且可以達(dá)到與原生應(yīng)用一樣的性能。Flutter還提供了豐富的組件、接口,開發(fā)者可以高效地為 Flutter添加native擴(kuò)展。此外,F(xiàn)lutter還使用了Native引擎渲染視圖,為用戶提供了良好的體驗(yàn)。
Flutter與用于構(gòu)建移動(dòng)應(yīng)用程序的其它多數(shù)框架不同,因?yàn)镕lutter既不使用WebView,也不使用操作系統(tǒng)的原生控件。相反,F(xiàn)lutter使用自己的高性能渲染引擎來繪制widget。這樣不僅可以保證在Android和iOS的UI一致性,而且也可以避免對(duì)原生控件依賴而帶來的限制和高昂的維護(hù)成本。
同時(shí),F(xiàn)lutter使用Skia作為2D引擎渲染,Skia是Google的一個(gè)2D圖形處理函數(shù)庫(kù),在字型、坐標(biāo)轉(zhuǎn)換以及點(diǎn)陣圖等方面都有高效而且簡(jiǎn)潔的表現(xiàn)。Skia是跨平臺(tái)的,并提供了非常友好的API。由于Android系統(tǒng)已經(jīng)內(nèi)置了Skia,所以Flutter在打包APK時(shí),不需要再將Skia打包到APK中,但是iOS系統(tǒng)并未內(nèi)置Skia,所以在構(gòu)建API時(shí),必須將Skia一起打包。

三、高性能的Flutter

目前,F(xiàn)lutter程序主要有兩種運(yùn)行方式:靜態(tài)編譯與動(dòng)態(tài)解釋。靜態(tài)編譯的程序在執(zhí)行前,會(huì)被全部翻譯為機(jī)器碼,通常將這種類型稱為AOT,即 “提前編譯”。解釋執(zhí)行則是一句句地邊翻譯邊運(yùn)行,通常將這種類型稱為JIT,即“即時(shí)編譯”。
AOT程序的典型代表是用C/C++開發(fā)的應(yīng)用,它們必須在執(zhí)行前編譯成機(jī)器碼。而JIT的代表則非常多,如JavaScript、python等。事實(shí)上,所有腳本語(yǔ)言都支持JIT模式。但需要注意的是,JIT和AOT指的是程序運(yùn)行方式,和編程語(yǔ)言并非是強(qiáng)關(guān)聯(lián)的,有些語(yǔ)言既可以以JIT方式運(yùn)行,也可以以AOT方式運(yùn)行,如Java、Python,它們可以在第一次執(zhí)行時(shí)編譯成中間字節(jié)碼,然后在之后的執(zhí)行中,直接執(zhí)行字節(jié)碼。
Flutter的高性能主要靠?jī)牲c(diǎn)來保證,首先,F(xiàn)lutter APP采用Dart語(yǔ)言進(jìn)行開發(fā)。當(dāng)Dart在 JIT模式下時(shí),其運(yùn)行速度與 JavaScript基本持平。此外Dart支持 還AOT,當(dāng)Dart在 AOT模式下事,其運(yùn)行速度遠(yuǎn)超JavaScript。速度的提升對(duì)高幀率下的視圖數(shù)據(jù)計(jì)算很有幫助。
其次,F(xiàn)lutter使用自己的渲染引擎來繪制UI,布局?jǐn)?shù)據(jù)等由Dart語(yǔ)言直接控制,所以在布局過程中不需要像RN那樣要在JavaScript和Native之間通信,在一些滑動(dòng)和拖動(dòng)的場(chǎng)景下具有明顯優(yōu)勢(shì)。由于滑動(dòng)和拖動(dòng)往往會(huì)引起布局的變化,所以JavaScript需要不停地與Native之間同步布局信息,這和在瀏覽器中要JavaScript頻繁操作DOM所帶來的問題是相同的,都會(huì)帶來比較可觀的性能開銷。

四、為什么Flutter會(huì)選擇Dart語(yǔ)言?

1.開發(fā)效率高。Dart運(yùn)行時(shí)和編譯器支持Flutter的兩個(gè)關(guān)鍵特性的組合,分別是基于JIT的快速開發(fā)周期和基于AOT的發(fā)布包。基于JIT的快速開發(fā)周期:Flutter在開發(fā)階段,采用JIT模式,這樣就避免了每次改動(dòng)都需要進(jìn)行編譯,極大地節(jié)省了開發(fā)時(shí)間?;贏OT的發(fā)布包,F(xiàn)lutter在發(fā)布時(shí)可以通過AOT生成高效的ARM代碼,以保證應(yīng)用性能。而JavaScript則不具備這個(gè)能力。
2.高性能。為了實(shí)現(xiàn)流暢、高保真的的UI體驗(yàn),F(xiàn)lutter必須在每個(gè)動(dòng)畫幀中都運(yùn)行大量的代碼。這意味著需要一種既能支持高性能,又能保證不丟幀的周期性暫停的語(yǔ)言,而Dart支持AOT,在這一點(diǎn)上比JavaScript更有優(yōu)勢(shì)。
3.快速分配內(nèi)存。Flutter框架使用函數(shù)式流,這使得它在很大程度上依賴于底層的內(nèi)存分配器。
4.類型安全。由于Dart是類型安全的語(yǔ)言,支持靜態(tài)類型檢測(cè),所以可以在編譯前就發(fā)現(xiàn)一些類型的錯(cuò)誤,并排除潛在問題。這對(duì)于前端開發(fā)者來說更具有吸引力。而JavaScript是一個(gè)弱類型語(yǔ)言,這也是為什么在諸多前端社區(qū)中,會(huì)有眾多為JavaScript代碼添加靜態(tài)類型檢測(cè)的擴(kuò)展語(yǔ)言和工具。

五、Flutter框架結(jié)構(gòu)

淺談跨平臺(tái)框架 Flutter 的優(yōu)勢(shì)與結(jié)構(gòu)
Flutter Framework是一個(gè)完全由Dart語(yǔ)言構(gòu)建的SDK,它實(shí)現(xiàn)了一整套自底而上的基礎(chǔ)庫(kù)。
1.底部?jī)蓪?Foundation和Animation、Painting、Gestures)是Flutter引擎暴露的底層UI庫(kù),提供動(dòng)畫、手勢(shì)及繪制能力。
2.Rendering層是一個(gè)抽象的布局層,它依賴于dart UI層。Rendering層會(huì)構(gòu)建一個(gè)UI樹,當(dāng)UI樹有變化時(shí),它會(huì)隨即計(jì)算出有變化的部分,然后更新UI樹,最終將UI樹繪制到屏幕上。這個(gè)過程類似于React中的虛擬DOM。Rendering層可以說是Flutter UI框架最核心的部分,它除了確定每個(gè)UI元素的位置、大小之外,還要進(jìn)行坐標(biāo)變換和繪制(調(diào)用底層dart:ui)。
3.Widgets層是Flutter提供的一套基礎(chǔ)組件庫(kù),在基礎(chǔ)組件庫(kù)之上,F(xiàn)lutter還提供了 Material 和Cupertino兩種視覺風(fēng)格的組件庫(kù)。
Flutter Engine:這是一個(gè)完全由 C++實(shí)現(xiàn)的 SDK,其中包括了 Skia引擎、Dart運(yùn)行時(shí)和文字排版引擎等。在代碼調(diào)用 dart:ui庫(kù)時(shí),調(diào)用最終會(huì)走到Engine層,然后實(shí)現(xiàn)真正的繪制邏輯。
React Native、Weex和Flutter進(jìn)行對(duì)比結(jié)果如下所示:
淺談跨平臺(tái)框架 Flutter 的優(yōu)勢(shì)與結(jié)構(gòu)

六、總結(jié)

從Flutter的設(shè)計(jì)理念來看,其整體架構(gòu)都是具有革命性的,相比于其他架構(gòu),它實(shí)現(xiàn)了真正意義上的跨平臺(tái)。它能夠讓各平臺(tái)的體驗(yàn)一致,并且讓用戶體驗(yàn)達(dá)到更優(yōu)?,F(xiàn)如今,F(xiàn)lutter的各種UI庫(kù)和組件都在不斷增加,與之相關(guān)的各種生態(tài)系統(tǒng)和社區(qū)也在不斷完善,它對(duì)新的操作系統(tǒng)的適配性將會(huì)越來越強(qiáng)。相信在不久的將來,F(xiàn)lutter會(huì)慢慢成熟起來,成為主流的開發(fā)語(yǔ)言之一。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI