工程結構
-
核心邏輯:如何在最小改動已有IOS或Android工程的前提下運行Flutter漏设。
????Flutter理解為一個單獨的模塊蕾各,通過Pod庫 [IOS] 或者AAR庫 [Android] 的方式另凌,由CocoaPods和Gradle引入主工程看幼。
Flutter啟動下的Flutter調式與熱重載
主要工作:
- 檢查是否需要重新生成flutter_tools.snapshot席覆。
- 基于pubspec.yaml依賴 [pub packages get] 直砂,并生成插件描述文件.flutter-plugins和pubspec.lock菌仁。
- 基于Flutter配置,生成Generated.xcconfig [IOS] 和local.properties [Android] 静暂。
- 基于Gradle和Xcodebuild構建應用济丘。
- 基于ADB和LLDB啟動應用。
- 等待應用中的Flutter啟動洽蛀,尋找Observatory端口摹迷,通過Dart Debugger連接以便調試弯院。
- 尋找到端口后同步Hot Reload依賴的文件,同時透過Daemon監(jiān)聽命令 [用戶點擊插件按鈕] 實現Full Restart或Hot Reload泪掀。
????解決Navtive啟動下的Dart調試和Hot Reload听绳,就可以解決fluttertools造成的編譯慢、以及調試環(huán)境不穩(wěn)定的問題异赫。
Native啟動下的Flutter調式與熱重載邏輯
Native與Flutter聯合調試
結合Xcode的Attach to Process可以實現IOS與Flutter聯調椅挣。
混合工程改造實踐
1. 項目背景及問題
在默認情況下,引入Flutter的Native工程無法脫離父目錄進行獨立構建和運行塔拳,因為它會反向依賴于Flutter相關的庫和資源鼠证。
在擁有了Native工程的情況下,開發(fā)者不太可能去創(chuàng)建一個全新的Flutter工程并重寫整個項目靠抑,因此Flutter工程將包含整個Native工程量九,產生了一系列問題:
- 構建打包問題-----引入Flutter后,Native工程因此對其產生了依賴和耦合颂碧,從而無法獨立構建荠列。
- 混合編譯導致開發(fā)效率降低-----向Flutter轉型的過程中必然有很多項目使用Native開發(fā),工程結構的改動會使開發(fā)過程無法在純Native環(huán)境下進行载城,適配到Flutter工程結構對純Native開發(fā)來說會降低開發(fā)的效率肌似。
2. 制定解決方案
(1).兩種模式
模式 | 理解 | 內容 |
---|---|---|
Standalone模式 | Native工程處于獨立目錄環(huán)境 | 純Native開發(fā)或平臺打包 |
Flutter模式 | Flutter代碼在該模式下進行開發(fā),對開發(fā)人員和打包平臺來說是透明的 | Flutter代碼相關庫的生成诉瓦、編譯和調試都執(zhí)行Flutter定義的流程 |
(2).厘清依賴
厘清Standalone模式對Flutter的依賴川队,并將其提取成第三方庫、資源或源碼文件睬澡。
????1. App.framework: Dart業(yè)務源碼相關文件
????2. Flutter.framework: Flutter引擎庫文件
????3. pubs插件目錄及用于索引的文件: Flutter下的插件固额,包括各種系統的插件和自定義的channels [橋接通道]
????4. flutter_assets: Flutter依賴的靜態(tài)資源,如字體和圖片等
(3).依賴引入的策略
依賴 | 優(yōu)點 | 缺點 |
---|---|---|
本地依賴 | 將Flutter相關內容的改動同步到Standalone模式也比較方便 | 需要對Flutter原有的構造流程進行稍復雜的改動煞聪,并且與后續(xù)的Flutter代碼合并會有沖突斗躏,且Native工程與Flutter的代碼、庫以及資源等內容還是耦合在本地米绕,不夠獨立 |
遠程依賴 | 對Flutter自身的構建流程改動較少瑟捣,較為徹底的解決了本地耦合的問題 | 同步的流程變的更加繁瑣馋艺,Flutter內容的變動需要先同步到遠程倉庫后再回步到Standalone模式才能生效 |
3. 改造的實現過程
(1).目錄的組織
在Flutter目錄下栅干,父工程目錄下的IOS和Android的子目錄分別包含對應的Native工程。
在代碼管理上捐祠,子工程可以使用Git的Submodule形式碱鳞,保證目錄間的獨立。
(2).遠程依賴的實現
在Standaloene模式下踱蛀,Flutter的依賴內容都指向遠程倉庫中的對應文件
在Flutter模式下依賴的方式不變
????1. 向Standalone模式同步Flutter的變更
????2. 同步的時機:
????????建議在提測和灰度期間窿给,每次Flutter業(yè)務的提交都能夠觸發(fā)同步腳本的執(zhí)行和App打包
????????在開發(fā)期間贵白,保證每日一次的同步即可