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

對於Android老項目來講接入flutter的最佳方式就是添加 flutter module,讓主module經過模塊依賴方式來依賴flutter。html

回顧下小步驟,由於網上資料不少,不詳細描述了。android

1 建立 flutter module

在當前project下 運行命令git

flutter create -t module my_flutter(my_flutter爲生成的flutter module名稱)
複製代碼

2增長配置代碼

在工程的settings.gradle增長如下配置github

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

在app 的gradle裏添加bash

implementation project(':my_flutter')
複製代碼

這樣就能夠邊開發,邊編譯看效果了。app



合成中間產物

不過隨之而來的問題是:如今flutter畢竟屬於小衆開發,團隊內部只有幾我的來作,而其餘人不須要關注flutter的東西,上邊的依賴方式須要安裝flutter 環境,下載sdk等,不然沒法編譯項目,因此還須要以依賴jar/aar的方式來集成。maven



下邊具體描述一下。 你新建的flutter module能夠用另外一個Android studio 窗口獨立打開,基本的目錄結構是

在as終端裏輸入

flutter build apk
複製代碼

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

assets 文件夾中的 isolate_snapshot_instr , isolate_snapshot_data, vm_snapshot_data , vm_snapshot_instr 爲Flutter編譯中間產物,flutter_assets 內爲資源文件,包含字體,圖片,此外還有須要的插件部分原生代碼和sdk的jar等。

普通的gradle構建沒法打包進中間產物和資源文件,因此參考flutter 項目中的gradle 文件內容,能夠看到,是在普通的gradle構建過程當中加入了flutter gradle腳本gradle

具體內容能夠進入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'
    }
複製代碼

附:

一、遇到的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。只是這個報錯提示讓我很無奈。

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

[✓] Flutter (Channel master, v1.5.9-pre.235, 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.2)
[✓] VS Code (version 1.30.2)
[✓] Connected device (1 available)


複製代碼

【更新】

2019.5.27

以前的打包有個問題,假如你的flutter module又依賴了三方的flutter plugin,打包以後無法把plugin內容也打進去。

戀貓的小郭給了一個方案: github.com/CarGuo/flut…, 藉助fat-aar來構建。

1、 flutter module 中

1 使用插件
 apply plugin: 'com.kezong.fat-aar'

2 在dependencies 中添加

 def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
    def plugins = new Properties()
    def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
    if (pluginsFile.exists()) {
        pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
    }
    plugins.each { name, _ ->
        println name
        embed project(path: ":$name", configuration: 'default')
    }


2、 project 中的 build.gradle 裏添加

   classpath 'com.kezong:fat-aar:1.0.3'


3、setting.gradle 中 添加

    def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()

    def plugins = new Properties()
    def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
    if (pluginsFile.exists()) {
        pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
    }

    plugins.each { name, path ->
        def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
        include ":$name"
        project(":$name").projectDir = pluginDirectory
    }

複製代碼

此外,我又優化了下腳本,打包aar時中間產物和asset資源直接生成,再也不須要去解壓本地生成好的apk來獲取了。 構建腳本

相關文章
相關標籤/搜索