導(dǎo)讀:Flutter從誕生到現(xiàn)在,已經(jīng)成為了跨端開發(fā)的領(lǐng)跑者。閑魚應(yīng)用在flutter能夠以模塊形式存在前,進(jìn)行了很長時間的混合app架構(gòu)的探索,對原生工程進(jìn)行較多改動,在官方推出flutter模塊模式后,我們進(jìn)行了大量調(diào)研,最終推出了一套開箱即用的混合工程腳手架flutter-boot,幫助大家快速搭建混合工程。
在蘄春等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),營銷型網(wǎng)站建設(shè),外貿(mào)營銷網(wǎng)站建設(shè),蘄春網(wǎng)站建設(shè)費用合理。
國內(nèi)外越來越多的公司走上了flutter探索之路。Flutter的主要開發(fā)模式分成兩種,一種是獨立app的模式,以flutter為主,原生工程會被包含在flutter工程下;另一種是讓flutter以模塊(flutter module)的形式存在,分別集成在已有的iOS和android原生應(yīng)用下,此時原生工程可以在任何的目錄結(jié)構(gòu)下,和flutter工程地址不產(chǎn)生關(guān)聯(lián),但需要在原生工程結(jié)構(gòu)中聲明flutter工程的本地地址。
如何下載
鏈接:https://pan.baidu.com/s/16qZ1k_KPrael4RX6Y1NlLA
提取碼:y8uy
flutter-boot核心解決了混合開發(fā)模式下的兩個問題:flutter混合開發(fā)的工程化設(shè)計和混合棧。那flutter-boot是如何解決的呢?
首先在工程化設(shè)計的問題上,flutter-boot建立了一套標(biāo)準(zhǔn)的工程創(chuàng)建流程和友好的交互命令,當(dāng)流程執(zhí)行完成后,即擁有了混合開發(fā)的標(biāo)準(zhǔn)工程結(jié)構(gòu),這一套工程結(jié)構(gòu)能夠幫助我們同時擁有flutter和native(原生)兩種開發(fā)視角,本地flutter開發(fā)和云端flutter構(gòu)建兩種flutter集成模式,其效果如圖:
另外在混合棧的問題上,flutter-boot能自動注入混合棧依賴,同時將核心的混合棧接入代碼封裝后注入到原生工程內(nèi),在用戶按提示插入簡單幾行模版代碼后,即可看到混合棧的效果。 使用flutter-boot搭建的混合工程,開箱即可使用,接下來讓我們了解下flutter-boot解決這些問題的詳細(xì)過程。
開源地址
https://github.com/alibaba-flutter/flutter-boot
了解官方的Add Flutter to existing apps項目
在了解flutter-boot的工程化設(shè)計細(xì)節(jié)前,我們需要對Google官方提供的Add Flutter to existing apps方案有一個初步的了解。Add Flutter to existing apps項目會引導(dǎo)我們以module的形式創(chuàng)建flutter,module形態(tài)的flutter的工程結(jié)構(gòu)如下:
在官方的工程結(jié)構(gòu)下,.ios和.android是運行flutter時的模版工程,在flutter工程目錄下運行時即通過這兩個工程來啟動應(yīng)用。那我們?nèi)绾巫屧こ毯彤a(chǎn)生關(guān)聯(lián)呢?這里的關(guān)聯(lián)會分成三個部分,分別是flutter的framework,flutter的業(yè)務(wù)代碼,和flutter的插件庫。其中flutter插件庫分成 flutter plugin native(即插件原生代碼)和flutter plugin dart(即插件的dart代碼)兩個部分。這四部分的差異在于:
因此flutter framework只需要在依賴管理中聲明即可,flutter plugin native可以直接以源碼的方式集成,flutter plugin dart只有在被業(yè)務(wù)代碼引用時才有效,因此和業(yè)務(wù)代碼一樣,需要支持dart代碼的調(diào)試模式和發(fā)布模式,因此dart代碼的關(guān)聯(lián)會侵入到app的構(gòu)建環(huán)節(jié),根據(jù)app構(gòu)建的模式來決定dart代碼的構(gòu)建模式。
具體的實現(xiàn),拿iOS來舉例,我們會在podfile文件中增加一個自定義的ruby腳本podfilehelper的調(diào)用,podfilehelper會聲明flutter framework的依賴,聲明flutter plugin native的源碼引用,同時聲明業(yè)務(wù)代碼的路徑。接下來會介入構(gòu)建流程,在xcode的build phase內(nèi)加入shell腳本xcode_backend的調(diào)用,xcode_backend會根據(jù)當(dāng)前構(gòu)建模式,來產(chǎn)出dart構(gòu)建產(chǎn)物。
對于官方的混合工程項目,我們在體驗后發(fā)現(xiàn)有如下的問題:
文件或配置的添加為手動添加,流程較長。
不支持在flutter倉庫下運行原生工程。
不支持flutter以獨立代碼倉庫部署時的遠(yuǎn)端機器構(gòu)建。
因此在flutter-boot腳手架中,為了解決這些問題,我們把混合工程的部署分為create,link,remotelink,update四個過程。
★ create
create過程目的在于幫助我們搭建一個flutter module,包括flutter module的創(chuàng)建和git倉庫的部署,flutter module創(chuàng)建命令調(diào)用前,我們會做基礎(chǔ)的檢查來讓工程位置和命名的規(guī)范滿足官方的條件。在git倉庫部署時,我們會在gitignore中忽略部分文件,同時我們會對倉庫的狀態(tài)進(jìn)行檢查,在倉庫為空時,直接添加文件,在倉庫非空時,會優(yōu)先清理倉庫。
★ link
link過程目的在于關(guān)聯(lián)本地的原生工程和flutter工程。關(guān)聯(lián)的過程中,我們會先請求獲取flutter工程的地址和原生工程的地址,然后我們將上面提到的需要手動集成的部分通過腳本的方式自動集成;為了獲得flutter開發(fā)視角(即flutter工程下運行原生工程),我們將原生工程進(jìn)行了軟鏈接,鏈接到flutter工程的ios目錄和android目錄,flutter在運行前會找到工程下的ios或android目錄然后運行,在flutter工程下運行iOS工程會存在一個限制,即iOS工程的target需要指定為runner,為了解決這個問題,我們將原生工程的主target進(jìn)行了復(fù)制,復(fù)制了一份名為runner的target。
同時,為了支持遠(yuǎn)程構(gòu)建的模式,我們flutter倉庫本地路徑的聲明根據(jù)構(gòu)建模式進(jìn)行了區(qū)分,封裝在自定義的依賴腳本中,例如在iOS工程內(nèi),我們會添加fbpodhelper.rb腳本文件。然后將flutter倉庫本地路徑添加到了配置文件fbConfig.local.json中。
★ remotelink
update remotelink過程目的在于遠(yuǎn)端構(gòu)建模式下,能夠獲取flutter倉庫的代碼,并在遠(yuǎn)端機器上進(jìn)行構(gòu)建。在遠(yuǎn)端構(gòu)建模式下,我們會侵入依賴管理的過程,在依賴獲取時,拉取flutter倉庫的代碼,將代碼放置在原生工程的.fbflutter目錄下,并將該目錄聲明為flutter倉庫本地路徑,拉取flutter代碼并進(jìn)行本地部署的過程,我們稱之為update過程。
這樣在遠(yuǎn)端構(gòu)建時就能和本地構(gòu)建如出一轍。 那遠(yuǎn)端模式和本地模式如何區(qū)分呢?為了區(qū)分遠(yuǎn)端模式與本地模式,我們將遠(yuǎn)端的flutter倉庫信息記錄在fbConfig.json,同時在gitignore中忽略fbConfig.local.json文件,這樣只需要初始化混合工程的工程師運行一次remotelink,其他的開發(fā)協(xié)同者將不用關(guān)注遠(yuǎn)端構(gòu)建的配置流程。
★ init
為了方便快速搭建,我們提供了一個命令集合,命名為init,我們將必備的環(huán)節(jié)以命令行交互的模式集成在了init命令中。
混合棧是閑魚開源的一套用于flutter混合工程下協(xié)調(diào)原生頁面與flutter頁面交互的框架,目前是混合開發(fā)模式下的主流框架。在混合棧開源后,我們關(guān)注到大量開發(fā)者在集成混合棧時會產(chǎn)生各種環(huán)境配置或代碼添加導(dǎo)致的集成問題。因此我們決定提供一套快速集成的方案。要做到快速集成我們面臨兩個問題:
flutter和混合棧的版本兼容;
混合棧demo代碼封裝及插入。
版本兼容問題
目前混合棧發(fā)布版本為0.1.52,支持flutter 1.5.4。當(dāng)flutter升級時混合棧勢必要進(jìn)行適配,即我們集成的混合棧版本也需要變更。因此我們將混合棧的版本配置通過文件進(jìn)行維護(hù),記錄當(dāng)前flutter所需要的混合棧版本。在初版的flutter-boot中,我們限定了混合棧的版本號,在新版本混合棧發(fā)布時,我們將開放版本選擇的功能。
代碼封裝及插入問題
在調(diào)研了混合棧的使用過程后,我們將混合棧需要的demo代碼分成了四個部分:
flutter引擎的托管;
頁面路由的配置 ;
demo形式的dart頁面 ;
原生的測試跳轉(zhuǎn)入口。
★ flutter引擎的托管
引擎的托管我們依賴于應(yīng)用的初始化,由于初始化過程隨著應(yīng)用的復(fù)雜程度提升而提升,因此目前我們提供了一行代碼作為接口,使用者在應(yīng)用初始化時加入這一行代碼即可完成托管。
★ 頁面路由的配置
demo形式的dart頁面,路由配置即路由到某個標(biāo)識符時,flutter或原生頁面需要識別并跳轉(zhuǎn)相應(yīng)頁面。路由的配置需要在原生和flutter兩側(cè)進(jìn)行部署。在原生側(cè),我們將混合棧的demo路由代碼進(jìn)行了精簡,然后添加在了原生工程的固定目錄下。由于iOS僅添加代碼文件是不會被納入構(gòu)建范圍的,因此我們封裝了一套iOS側(cè)的代碼添加工具來實現(xiàn)文件的插入。在flutter側(cè)我們對main.dart文件進(jìn)行了覆蓋,將帶有路由邏輯的main.dart集成進(jìn)來,同時提供了demo dart頁面的創(chuàng)建邏輯。
★ 原生的測試跳轉(zhuǎn)入口
為了方便使用者快速看到混合工程的跳轉(zhuǎn)模式,我們在iOS和android雙端封裝了一個入口按鈕和按鈕的添加過程,使用者在測試的頁面手動加入一行代碼,即可看到跳轉(zhuǎn)flutter的入口。
在使用flutter-boot前,開發(fā)者可能要花費數(shù)天來進(jìn)行混合工程搭建,現(xiàn)在,使用者只需要調(diào)用一個命令,加入兩行代碼即可完成混合工程的搭建,大大降低了開發(fā)者的開發(fā)成本。但flutter-boot的使命還未達(dá)成,我們期望使用者能更加流暢的進(jìn)行flutter開發(fā),未來我們會優(yōu)化多人協(xié)同的開發(fā)流程,完善持續(xù)集成環(huán)境的搭建,讓使用者擁有更佳的開發(fā)體驗。
它們包括了如何低成本實現(xiàn)Flutter富文本、設(shè)計一個高準(zhǔn)確率的Flutter埋點框架、Flutter外接紋理、可定制化的Flutter相冊組件等等深入進(jìn)階內(nèi)容。
初始flutter到進(jìn)階實戰(zhàn)源碼請入圈(也面向全體Android開發(fā)人員)
https://jq.qq.com/?_wv=1027&k=5MQDHG8
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。