记录一下在现有Android端项目集成Flutter工作中遇到的问题。
flutter版本3.3.10 如下:
集成的主要步骤参考官方的文档将 Flutter module 集成到 Android 项目 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter
因为现有的原生工程已经迭代很久,拥有完善的网络框架:支持网关切换、请求加解密、通用的请求参数,业务接口异常埋点等功能,埋点组件、路由组件等很多基础业务组件,这部分的能力希望复用,而不是在flutter上再次实现一遍,如果这样,前期flutter的引入需要很大的代价去实现一系列基础组件,与我们目前引入flutter的初衷:降本增效——降低开发成本,提升开发效率相违背。同时如果存在两套组件,比如网络组件,后期也会增加维护成本。需要尽可能多的复用原生已有的能力。
flutter 的集成有如下两种方式
- 源码依赖集成
aar
集成
集成目标
一:在开发阶段如果如果不涉及flutter相关的开发、以及打包的时候则使用aar
集成的方式对flutter无感,避免隐形的编译成本。
二:涉及flutter相关的开发则切换的源码依赖的方式,毕竟要使用原生宿主的能力,需要先将app跑起来,在使用flutter attach
进行开发调试。
需要有一种很简单的方式,可能动态的改变flutter组件是aar依赖,还是源码依赖,这一块复用我们之前在组件化过程的配置的脚本即可。
源码依赖集成
第一步,在settings.gradle
文件中配置,将flutter工程引入到宿主工程中
1 | def flutterEmbedFile = file('../xxx_fluter/.android/include_flutter.groovy') // new |
第二步,在app/build.gradle
中引入flutter模块
1 | dependencies { |
之后就可以在app工程中使用io.flutter.embedding.android.FlutterActivity
注意:源码依赖集成时最好使用git submodel的方式,单独管理flutter工程
aar依赖集成
aar包构建
目前flutter 3.0
中已经提供了完善的构建aar的工具了,不会再有之前的构建的aar包中没有包含上第三方依赖的问题了。构建flutter aar产物的命令是 flutter build aar
会在本地生成maven repo
,不方便远程依赖,而我们希望是能够直接将aar产物上传到公司的maven私库中。
使用 flutter build aar -v
命令,详细的了解的该命令的执行过程,发现就是执行了sdk目录中的 aar_init_script.gradle
脚本。目录为 FlutterSdk\flutter\packages\flutter_tools\gradle
1 | executing: [D:\code_space\xxx_fluter\.android/] D:\code_space\xxx_fluter\.android\gradlew.bat -I=D:\FlutterSdk\flutter\packages\flutter_tools\gradle\aar_init_script.gradle |
该脚本的大概作用就是给gradle project
配置上maven-publish plugin
,同时进行相关的配置
基本该脚本,修改了一份 flutter_aar_upload.gradle
,支持配置publish到远程仓库。改动的地方可搜索 add by dong
查看
1 | // This script is used to initialize the build in a module or plugin project. |
同时,将调用该文件的脚本以及需要传递的参数放置于脚本 build_flutter_aar.sh
中,方便构建产物。
1 | !/usr/bin/env sh |
app工程flutter产物aar集成
app中配置maven仓库地址
1
2
3
4
5
6
7
8
9
10String storageUrl = System.getenv('FLUTTER_STORAGE_BASE_URL') ?: "https://storage.googleapis.com"
#flutter 国内镜像 storageUrl = https://storage.flutter-io.cn
repositories {
maven {
url '私库地址xxxx'
}
maven {
url 'https://$storageUrl/download.flutter.io'
}
}app/build.gradle中引入
1
2
3
4
5
6
7dependencies {
def flutter_aar_sdk_version = "1.0.0"
debugImplementation "$gourp_id:flutter_debug:$flutter_aar_sdk_version"
releaseImplementation "$groupd_id:flutter_release:$flutter_aar_sdk_version"
//flutter engine version 不用直接依赖了
}
CI 自动化构建
jenkins 新建job,执行build_flutter_aar.sh
负责构建flutter的aar产物,使用aar包构建的脚本自动上传到maven私库,aar的版本号使用对应的git库的master分支最后一次提交的commit。