Flutter 混合開發實戰問題記錄(三)打包並上傳flutter aar 到maven

小豬睡枕頭single發表於2019-05-10

對於Android老專案來說接入flutter的最佳方式就是新增 flutter module,讓主module通過模組依賴方式來依賴flutter。

回顧下小步驟,因為網上資料很多,不詳細描述了。

1 建立 flutter module

在當前project下 執行命令

flutter create -t module my_flutter(my_flutter為生成的flutter module名稱)
複製程式碼

2增加配置程式碼

在工程的settings.gradle增加以下配置

setBinding(new Binding([gradle: this]))                                 // new
evaluate(new File(                                                      // new
        settingsDir.parentFile,                                               // new
        'yq_flutter/.android/include_flutter.groovy'                          // new
))
複製程式碼

在app 的gradle裡新增

implementation project(':my_flutter')
複製程式碼

這樣就可以邊開發,邊編譯看效果了。



不過隨之而來的問題是:現在flutter畢竟屬於小眾開發,團隊內部只有幾個人來做,而其他人不需要關注flutter的東西,上邊的依賴方式需要安裝flutter 環境,下載sdk等,否則無法編譯專案,所以還需要以依賴jar/aar的方式來整合。

下邊具體描述一下。 你新建的flutter module可以用另一個Android studio 視窗獨立開啟,基本的目錄結構是

Flutter 混合開發實戰問題記錄(三)打包並上傳flutter aar 到maven
在as終端裡輸入

flutter build apk
複製程式碼

可以生成一個release的apk,同時在rootProj/.android/Flutter/build/outputs/aar/目錄下生成aar,把這個aar拷出來直接放到你原生專案裡取依賴便可以擺脫依賴module的麻煩。 不過要規範點的話還需要在你們公司的自建nexus maven(或jcenter)上上傳aar,通過地址依賴。參考普通aar的打包上傳方式會發現能生成aar,但是執行會失敗,因為aar中沒有打包進Flutter的編譯產物。 正常生成的aar中結構圖

Flutter 混合開發實戰問題記錄(三)打包並上傳flutter aar 到maven
assets 資料夾中的 isolate_snapshot_instr , isolate_snapshot_data, vm_snapshot_data , vm_snapshot_instr 為Flutter編譯中間產物,flutter_assets 內為資原始檔,包含字型,圖片,此外還有需要的外掛部分原生程式碼和sdk的jar等。

普通的gradle構建無法打包進中間產物和資原始檔,所以參考flutter 專案中的gradle 檔案內容,可以看到,是在普通的gradle構建過程中加入了flutter gradle指令碼

Flutter 混合開發實戰問題記錄(三)打包並上傳flutter aar 到maven

具體內容可以進入sdk目錄去檢視,它的工作其實就是copy那些產物進你的apk檔案,所以我們可以先本地構建apk,然後解壓它,取出產物,複製到你的專案中,然後重新構建然後上傳到maven,參考網上的一些資料,修改了一個指令碼供使用。其中你可能需要修改的部分就是你們公司自用的uploadArchives指令碼了。

構建指令碼

然後在你的專案中依賴,甚至增加配置開關控制是aar依賴還是module依賴

gradle.properties 開關

FLUTTER_DEBUG = true
複製程式碼

原生module中依賴

 if(FLUTTER_DEBUG.equals("true")){
        implementation project(':flutter')
    }else {
        implementation 'com.xxx.xxx:my-flutter:1.0.0.@aar'
    }
複製程式碼

附:

1、遇到的gradle版本相容問題

我目前用的andrdoid studio 3.1.4, android gradle plugin 外掛版本是3.2.1, gradle版本是4.10.2,打包aar的時候報錯提示:本地gradle是4.4,最低要求4.6,我很是不解,本地明明比4.6還高,檢視了下官網gradle和plugin的匹配版本,貌似也沒問題。一番折騰後,把plugin版本降低到了3.1.2,gradle改為4.4才執行正常,檢視了flutter sdk的gradle版本也是3.1.2。只是這個報錯提示讓我很無奈。

2、我本地的flutter 環境,供參考

[✓] Flutter (Channel master, v1.3.7-pre.1, on Mac OS X 10.13.6 17G65, locale zh-Hans-CN)
[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[✓] iOS toolchain - develop for iOS devices (Xcode 10.1)
[✓] Android Studio (version 3.1)
[✓] VS Code (version 1.30.2)
[✓] Connected device (1 available)

複製程式碼

相關文章