背景:
基于原生项目开发把Flutter当作一个组件接入项目做到:
- 原生开发即使不配置Flutter环境依旧不影响原生业务开发
- 不希望修改Flutter依赖的第三方插件,以及将这些插件上传maven
- 当使用源码依赖的时候dart侧可以通flutter attach的方式debug调试,native侧同时也支持断点
基于以上考虑设计探索出一套基于AAR依赖的Flutter混合组件化开发.
Flutter源码依赖:
源码依赖
FlutterAAR依赖:
aar依赖
细节说明
Flutter版本: v1.9.1+hotfix.6
从dart侧看flutter项目:
Flutter build commands.
Usage: flutter build <subcommand> [arguments]
-h, --help Print this usage information.
Available subcommands:
aar Build a repository containing an AAR and a POM file.
aot Build an ahead-of-time compiled snapshot of your app's Dart code.
apk Build an Android APK file from your app.
appbundle Build an Android App Bundle file from your app.
bundle Build the Flutter assets directory from your app.
ios Build an iOS application bundle (Mac OS X host only).
Run "flutter help" to see global options.
符合当前项目组件化思想的AAR方式无疑是个不错的选择
按照正常思路
- 把这些aar上传到maven仓库
- 把项目的适配层flutterlib打成aar上传至maven仓库
- 完成
这时我就面临这样一个问题:
能不能像使用maven的gradle插件来完成这个事情?
这就导致我需要在flutter 的插件的gradle文件中添加代码自己开发也还好,但是如果是团队开发,你对这个插件项目本身进行了修改如果别人没有这个插件的源码,就显得不合理,所以就需要在git上再增加一个flutter插件的仓库来管理,可是插件很有可能会升级,这就导致你需要把之前的工作重复操作一遍.而且对一个原则上不修改的第三方库进行这样复杂的操作,显然是资源上的浪费.
原则上不对第三方插件进行修改
我的思路是,将这些产物放在宿主项目的libs下 通过
Implementation fileTree(dir: 'libs', include: ['*.aar'])
方式将flutter相关产物以aar的方式合并入安卓工程
然而使用当使用aar模式下flutterlib(native侧支持flutter运行和为flutter提供系统能力的适配层组件)时,flutterlib会默认从Maven仓库获取flutter产物和flutter插件产物
原因在Flutter官方提供的源码依赖方式:
implementation project(':flutter')
implementation project(':flutter_boost')
这就会导致最终flutterlib生成的aar多了:
<dependency>
<groupId>com.idlefish.flutterboost</groupId>
<artifactId>flutter_boost</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
这样的maven依赖
之前已经说了这些依赖已经放入了本地libs目录下,怎么让项目不从Maven仓库而是从libs获取?
//debug模式下源码依赖
debugImplementation project(':flutter')
debugImplementation project(':flutter_boost')
//只在编译时有效,不会参与打包
compileOnly project(':flutter')
compileOnly project(':flutter_boost')
再看pom.xml已经没有这个依赖了
操作步骤
- 使用Flutter命令 flutter build aar
- 执行native工程的适配层组件flutterlib的gradle脚本 从FlutterHost中获取aar
- 通过gradle命令将适配层组件flutterlib上传至用来放置组件的maven仓库
- 宿主项目使用aar方式依赖flutterlib -> 完成
网友评论