背景:
基於原生專案開發把Flutter當作一個元件接入專案做到:
- 原生開發即使不配置Flutter環境依舊不影響原生業務開發
- 不希望修改Flutter依賴的第三方外掛,以及將這些外掛上傳maven
- 當使用原始碼依賴的時候dart側可以通flutter attach的方式debug除錯,native側同時也支援斷點
基於以上考慮設計探索出一套基於AAR依賴的Flutter混合元件化開發. Flutter原始碼依賴:
FlutterAAR依賴:細節說明
Flutter版本: v1.9.1+hotfix.6
從dart側看flutter專案:
Flutter build commands.
Usage: flutter build <subcommand> [arguments]
-h, --help Print this usage information.
Available subcommands:
aar Build a repository containing an AAR and a POM file.
aot Build an ahead-of-time compiled snapshot of your app's Dart code.
apk Build an Android APK file from your app.
appbundle Build an Android App Bundle file from your app.
bundle Build the Flutter assets directory from your app.
ios Build an iOS application bundle (Mac OS X host only).
Run "flutter help" to see global options.
複製程式碼
符合當前專案元件化思想的AAR方式無疑是個不錯的選擇 按照正常思路
- 把這些aar上傳到maven倉庫
- 把專案的適配層flutterlib打成aar上傳至maven倉庫
- 完成
這時我就面臨這樣一個問題: 能不能像使用maven的gradle外掛來完成這個事情? 這就導致我需要在flutter 的外掛的gradle檔案中新增程式碼自己開發也還好,但是如果是團隊開發,你對這個外掛專案本身進行了修改如果別人沒有這個外掛的原始碼,就顯得不合理,所以就需要在git上再增加一個flutter外掛的倉庫來管理,可是外掛很有可能會升級,這就導致你需要把之前的工作重複操作一遍.而且對一個原則上不修改的第三方庫進行這樣複雜的操作,顯然是資源上的浪費.
原則上不對第三方外掛進行修改
我的思路是,將這些產物放在宿主專案的libs下 通過
Implementation fileTree(dir: 'libs', include: ['*.aar'])
複製程式碼
方式將flutter相關產物以aar的方式合併入安卓工程 然而使用當使用aar模式下flutterlib(native側支援flutter執行和為flutter提供系統能力的適配層元件)時,flutterlib會預設從Maven倉庫獲取flutter產物和flutter外掛產物 原因在Flutter官方提供的原始碼依賴方式:
implementation project(':flutter')
implementation project(':flutter_boost')
複製程式碼
這就會導致最終flutterlib生成的aar多了:
<dependency>
<groupId>com.idlefish.flutterboost</groupId>
<artifactId>flutter_boost</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
複製程式碼
這樣的maven依賴 之前已經說了這些依賴已經放入了本地libs目錄下,怎麼讓專案不從Maven倉庫而是從libs獲取?
//debug模式下原始碼依賴
debugImplementation project(':flutter')
debugImplementation project(':flutter_boost')
//只在編譯時有效,不會參與打包
compileOnly project(':flutter')
compileOnly project(':flutter_boost')
複製程式碼
再看pom.xml已經沒有這個依賴了
操作步驟
- 使用Flutter命令 flutter build aar
- 執行native工程的適配層元件flutterlib的gradle指令碼 從FlutterHost中獲取aar
- 通過gradle命令將適配層元件flutterlib上傳至用來放置元件的maven倉庫
- 宿主專案使用aar方式依賴flutterlib -> 完成