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来获取了。 构建脚本

相关文章
相关标签/搜索