作者:騰訊NOW直播 - mirageqliu(劉強)
前言
騰訊Now直播iOS App在近期版本嵌入了Flutter功能開發模組,本文旨在討論我們Now直播終端團隊對iOS Flutter混合開發模式的一些思路和實踐,歡迎大家探討。整體來看團隊經歷了三個混編開發模式階段,分別是Xcode工程整合Flutter產出模式,Flutter工程整合Xcode工程模式和多團隊協作遠端構建產出整合模式。
Flutter標準工程結構
我們首先來看標準的iOS Flutter工程結構,其中Flutter工程包含了一個Xcode工程,而Xcode工程依賴於Flutter工程的產出,主要包括App.framework, Flutter.framework, flutter_assets等。
Xcode工程整合Flutter產出模式
基於Xcode工程僅依賴於Flutter工程產出的原理,為了應對產品快速上線的訴求,我們在獨立的Flutter工程內開發除錯完Dart程式碼後,將Flutter編譯產出直接以動態庫方式整合到Now工程。
這種整合方式不會影響現有工程專案的編譯,與現有的開發模式無縫整合。但是由於Dart程式碼開發儲存在本地,不適用於多人協作開發,同時也無法方便地進行程式碼除錯。Flutter工程整合Xcode工程模式
鑑於以上開發模式的缺陷,我們改變思路以Flutter工程為主體,將Xcode工程整合到Flutter工程下,同時對主體Xcode目錄進行調整,修正構建指令碼引數,使得開發環境能夠正常出包。
在這種開發模式下我們同時支援三種開發方式
1)版本需求只需要修改Native部分,直接開啟Xcode專案進行開發
2)版本需求只需要修改Flutter部分,直接使用AndroidStudio開啟Flutter工程開發
3)混合除錯開發方式,版本需求同時修改Flutter和Native程式碼,也要支援Flutter Native斷點除錯
我們以Now直播動態搜尋頁獲取Native圖片Url為例,看下如何進行斷點除錯
1)AndroidStudio開啟Flutter專案啟動debug,在入口處掛breakpoint
3)Xcode掛住呼叫入口breakpoint 4)Xcode函式處理完成後回撥給Dart 5)Flutter工程收到回撥內容並展示
這種整合方式在單獨iOS團隊整合開發來看,是可以滿足需求的,但是不能支援iOS/Android團隊公用Flutter程式碼開發的場景。
多團隊協作遠端構建產出模式
為了凸顯Flutter一份程式碼同時支援iOS/Android的優勢,我們最終考慮將Flutter程式碼單獨分離出去,由RDM機器自動編譯產出整合提交到指定的Xcode/Android分支目錄的方案。
首先我們在本地配置具備Flutter環境的編譯機器掛載對映到RDM上,在該機器上啟動定時任務,檢測到SVN有程式碼更新則自動啟動編譯,並將產出分別提交到對應的Xcode/Android工程SVN上。我們在提交的Flutter產出中標記上分支及revision版本資訊,以便後期方便地找到對應版本程式碼。
SVN程式碼庫分三個,Flutter,iOS,Android,分別維護各自的主流與分支版本。
每個版本需求開發分如下幾種情況
1)僅涉及到Native程式碼
iOS/Android團隊分別拉取Native程式碼開發,Flutter產物使用其主幹最新的
2)涉及到Dart程式碼
iOS/Android團隊分別拉取Native程式碼分支,同時拉取Flutter分支,標記上iOS/Android分支地址資訊,開發同時通過SVN定時任務將編譯產出同步到iOS/Android分支
總結
以上是我們Now直播終端團隊對iOS Flutter混合工程改造的思路和實踐過程,歡迎大家前來探討。Now直播終端團隊致力於為Flutter生態作出一點自己的貢獻,期待Flutter越來越好!