做者:騰訊 - 小德(koudleren 任曉帥)android
爲了使用Flutter,剛開始的時候爲了快速上線,採用將Flutter和Native代碼混合開發的模式,具體的工程目錄以下:cdn
能夠明顯的看到工程目錄很亂,android目錄下有多個代碼目錄,lib目錄下是dart代碼,images目錄下是Flutter所用到的圖片等資源,並且居然還包含了iOS的代碼。如此混亂的目錄給咱們帶來了四個問題:blog
爲了將Flutter集成到Native工程裏,對Flutter和Native的目錄和編譯腳本都進行了大量的改造,對原來Native的工程影響比較大。圖片
由於Flutter的開發須要Flutter SDK的環境,可是團隊內並非全部人都作Flutter的開發,若是要求每一個人都安裝Flutter SDK的環境,無疑帶來了額外的開發成本。ci
由於Flutter編譯須要Flutter的編譯環境,可是現有的持續集成的環境沒有Flutter的環境,使得Flutter沒法作到持續集成。資源
由於第三點的緣由,Flutter是本地編譯的,但是每一個人Flutter SDK的環境很不容易統一,例如SDK版本的差別或者系統的差別,會致使Flutter編譯產物不一致,從而影響現網的表現,出現iOS和Android表現不一致的狀況,甚至會由於SDK版本不匹配形成App的crash。開發
針對上面的問題,咱們轉而採用了以下的開發模式:get
將Flutter和Native剝離,Flutter是單獨的工程,Native也是單獨的工程,這樣從工程上面就將Flutter和Native完全分開,二者互不影響,Native工程不在須要改造,單獨打開Native工程也不須要配置Flutter SDK的環境。在Flutter工程裏編譯Flutter的產物,而後集成到Native工程裏。同步
在本地開發Flutter,可是將編譯構建的工做交給服務端來作,由於服務端的Flutter SDK的環境是惟一的並且可控的,這樣無論有幾個開發者,本地環境有多複雜,Flutter的構建都在服務端,保證了Flutter構建產物的一致性。團隊協作
在服務端觸發Flutter的編譯,若是編譯成功,會自動將最新的Flutter產物同步到Native工程裏,保證Native的工程裏的Flutter產物是穩定的並且是最新的,能夠及時看到最新的更改的Flutter頁面。
這裏持續集成服務是用QCI搭建的。
通過以上的改造,工程目錄以下:
能夠明顯看到工程目錄清晰了不少,fluttersdk目錄下是Flutter的構建產物,對於原來的Native工程來講就是一個module,flutternew目錄下是Flutter的業務代碼,flutternew依賴fluttersdk,flutternew也是Native工程的一個module。通過改造,能夠達到以下的效果:
Flutter只是Native工程的一個module,和其餘Native的module是平級的,Naitvie也不須要關心Flutter model的環境,對原來的Native工程沒有影響。
由於Flutter的編譯都是在服務端進行的,這樣就保證了Flutter編譯環境的惟一性,iOS和Android都是在同一份代碼同一個編譯環境下構建的,也就保證了Flutter產物的穩定性。
Flutter的代碼提交以後,會自動觸發Flutter的構建,能夠很容易知道這次的變動是否有問題,最新的Flutter構建產物也會自動同步到Native的工程裏。
通過改進Flutter的開發模式,目前已經實現了對Flutter的敏捷開發和持續集成,實現了多團隊協做遠程構建產出的模式。