添加Flutter模块作为依赖


通常在做Flutter混合开发时,我们需要创建一个flutter模块,并通过模块依赖的方式添加给原生工程,这种方式对需要进行flutter混合开发的人员来说,没有问题,但是对于同组其他不需要进行flutter混合开发的人来说,却增加了额外的成本,比如需要配置Flutter开发环境,每次同步flutter module最新代码。所以,为了非flutter开发人员更好的开发体验,我们需要对flutter模块换一种依赖方式—AAR依赖

添加Flutter AAR作为依赖


Flutter是支持将flutter模块打包成AAR供原生工程添加依赖的,我们只需打开终端,切换到flutter module目录下,执行命令

//关于此命令,可通过-h查看更多
flutter build aar

或者通过AS菜单中的Build > Flutter > Build AAR菜单在 Android Studio 中为 Flutter 模块构建 AAR

flutter打包android flutter打包aar_maven

构建完成后,Gradle会在我们的flutter模块下的build文件夹中生成AAR包

flutter打包android flutter打包aar_maven_02

再按照提示进行集成,绿色字就是打包出的AAR的地址

flutter打包android flutter打包aar_flutter_03

到此,你的原生项目就完成了通过AAR的方式依赖flutter模块。

就这?这就没了?

当然不,按照提示进行集成后,flutter模块与原生工程的确进行了解耦,你的程序也能正常运行起来,这没什么问题,问题出在这个AAR的地址是在你本地,不方便其他人访问使用,当然你可以通过把AAR copy到项目中去使用,但是这样日后AAR的更新就比较麻烦,尤其是当你的Flutter代码更新比较频繁的情况下。

所以,最好的方式是将构建出来的AAR上传到一个我们都方便访问到的地方,例如Maven私有仓库。

flutter build aar 的秘密


那么,如何将打包出来的Flutter AAR包上传到我们的Maven仓库呢?
首先我们看看执行flutter build aar命令后,它都干了什么,它是怎么输出AAR的呢?

//执行-v命令,查看命令输出信息
flutter build aar -v

输出内容太多,这里我只挑部分有用的内容放出

可以看到,它执行了Gradle 任务 —assembleAarDebug,打包debug版AAR。

flutter打包android flutter打包aar_flutter_04


再然后执行了红线标记处的gradle脚本

flutter打包android flutter打包aar_java_05


这个脚本你一看它名字应该就知道它是干什么的。我们稍后在看这个脚本,先继续往下走接下来就是一堆常见的编译流程了

flutter打包android flutter打包aar_java_06

ok,等待一会儿后,assembleAarDebug任务执行完成,然后再继续执行assembleAarProfile任务

flutter打包android flutter打包aar_aar_07

assembleAarProfile任务执行完成,然后再继续执行assembleAarRelease任务

flutter打包android flutter打包aar_flutter打包android_08

ok,到此整个flutter build aar命令结束,并且提示了上面讲的集成步骤

flutter打包android flutter打包aar_aar_09

可以发现,整个flutter build aar命令中,其实就执行了这三个Gradle任务assembleAarDebugassembleAarProfileassembleAarRelease

而这三个任务都执行了aar_init_script.gradle这个gradle脚本。

看来,有关flutter AAR的所有的秘密都在这个脚本中,我们去探探究竟!

破案了,破案了,这个脚本头部已经标注的明明白白了~

// This script is used to initialize the build in a module or plugin project.
// During this phase, the script applies the Maven plugin and configures the
// destination of the local repository.
// The local repository will contain the AAR and POM files.
// 此脚本用于在模块或插件项目中初始化构建。
// 在此阶段,脚本应用 Maven 插件并配置
// 本地存储库的目的地。
// 本地存储库将包含 AAR 和 POM 文件。

再看到这段代码,我已经明白为啥aar会在build目录下生成了

project.uploadArchives {
        repositories {
            mavenDeployer {
              repository(url:"file://${outputDir}/outputs/repo")
            }
        }
    }

它在指定的目录下,生成了一个maven本地仓库,并将aar上传到了这里。

这个outputDir在执行gradle命令时,通过参数传递了进来

flutter打包android flutter打包aar_maven_10

关于这个脚本更多的信息,感兴趣的可以去这个目录下看看

flutter/packages/flutter_tools/gradle/aar_init_script.gradle

修改Flutter AAR打包地址,上传Maven私服


各位,到了这里,相信你们应该知道怎么做了吧,把repository中的地址改成自己的maven私服地址即可。

例如

repository(url: "http://172.17.0.172:8081/repository/maven-releases/") {
    authentication(userName: "xxx", password: "xxx")
}

如果你会写shell脚本,可以搞个更高级的,打包前将地址修改成你的,打包结束后再改回去,还可以加入版本控制,这样其他人就不用手动修改配置了,只需要执行你写的脚本即可。

ok,搞定后再次执行flutter build aar命令,你会发现flutter aar已经上传到你的Maven私服了~