优雅地将Flutter项目打包aar上传Maven

Posted by Vove on March 1, 2021

前言

当flutter在项目中作为模块使用时,Android app工程应用flutter模块一般有两种方式:

  1. 重定向flutter模块
    1
    2
    3
    4
    5
    6
    
    include ':app'                                   
    setBinding(new Binding([gradle: this]))                                 
    evaluate(new File(                                                      
      settingsDir.parentFile,                                               
      'flutter_module/.android/include_flutter.groovy'                          
    )) 
    
  2. 打包为aar依赖,本地文件/maven 依赖

简单分析下两个方法的优劣:

  • 重定向方式:需要Android开发者配置flutter环境,且会增加构建时间;另外Android Studio 项目结构上会出现很多flutter依赖的模块,是项目视图变得杂乱。
  • 本地aar/maven 方式:Android开发者无需配置flutter环境,方便分离开发。

这里介绍一下一种方便将flutter模块发布至 maven 供Android项目使用的方式。

使用

假设flutter项目目录:flutter_module

  1. 在此新建文件夹 script
  2. 下载文件: flutter_aar_upload.gradlescript 目录。
  3. 新建 upload.sh (linux/macOS)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env sh
flutter pub get
cd ..
./gradlew build

cd .android

./gradlew \
  -I=../script/flutter_aar_upload.gradle \
  -Pmaven-url=http://your_maven_url \
  -Pmaven-user=admin \
  -Pmaven-pwd=admin123 \
  -Pis-plugin=false \
  -PbuildNumber=${pom-version} \
  -Ptarget-platform=android-arm,android-arm64,android-x64 assembleAarRelease

Windows 系统可能需要修改此脚本 参数说明

-Pmaven-url 可以是本地路径,也可为远程地址(注意: maven仓库需要开启重部署 开启方式
示例: maven-url=file:///Users/xxx/StudioProjects/xxx/build/host
maven-url=http://192.168.1.100:8081/repository/maven-releases/

maven-user 与 maven-pwd 为maven远程用户及密码,若发布到本地无需设置
-PbuildNumber=1.0.0 为发布到maven module的版本号

最后 assembleAarRelease 为打包类型,其他:assembleAarDebug, assembleAarProfile

  1. 执行 upload.sh

执行成功会得到

  1. 根据提示在Android项目 build.gradle 中添加
1
2
3
dependencies {
	implementation 'xx.xxxx.xxx:flutter_release:xxxx'
}

原理

flutter build aar 命令会将构建的aar输出到_module/build/host 目录下,既然能输出到本地,这段路径一定是在某个地方配置的。经过 flutter build aar -v 命令的查看执行记录,发现了下面一段命令:

1
2
3
flutter_module/.android/gradlew -I=/Users/xxx/Library/Flutter/packages/flutter_tools/gradle/aar_init_script.gradle
-Pflutter-root=/Users/xxx/Library/Flutter -Poutput-dir=/Users/xxx/Projects/flutter_module/build/host -Pis-plugin=false -PbuildNumber=1.0
-Ptarget-platform=android-arm,android-arm64,android-x64 assembleAarDebug

也就是 执行了 aar_init_script.gradle,在文件中也发现了配置输出路径的位置

1
2
3
4
mavenDeployer {
    //outputDir 为命令参数中的 output-dir
    repository(url: "file://${outputDir}/outputs/repo")
}

于是可通过修改 aar_init_script.gradle 来达到目的,不过为了不修改flutter环境源码,将 aar_init_script.gradle 复制出以修改。没错,flutter_aar_upload.gradle 就是修改至此文件

修改后可输出打包的plugin列表,不再需要指定 -Pflutter-root 路径,可自定义 mavenUrl 支持本地与远程上传,支持输出Host项目需要的配置信息。

此外,还对flutter依赖上传进行优化,不再讨论。