Flutter 三天搞定混合开发持续化集成平台(一)
前言: Flutter目前在客户端的生态中以一个快速大面积覆盖的情况下,如何做到能快速稳定的集成到我们现有的工程,这一系列的文章就以这个命题为大家做一些分享。
目录:
(一)Flutter编译产物,Native如何集成
(二)plugin 快速集成篇
(三)版本控制篇
Flutter编译产物,Native如何集成
我们新建一个Flutter工程,执行 flutter build 命令。
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).
-iOS
flutter build ios
demo_job/build/ios/Release-iphoneos/Runner.app/Frameworks/App.framework
下会生成对应的编译framework产物
App.framework 是我们需要的对应的Flutter 业务代码产物部分,当然我们还需要引入Flutter engine部分,Flutter.framework.
获取这两个编译产物后就能正常引入至我们的iOS工程,届时iOS混入Flutter功能
-Andriod
flutter build apk
在对应的文件夹下面会生成对应的lib.jar文件,但此时还缺少Flutter engine对应产物,我们需要到对应版本内dart tool 文件内获取对应的flutter.jar部分。
"flutter/bin/cache/artifacts/engine/android-arm-release/flutter.jar"
Android项目再引入对应的资源部分(images这些资源文件)
到这个一步我们Android项目也能正常使用Flutter功能。
优化改进
如果作为一个程序员能接受这种【人工智能】方式接入Flutter的部分的话,我们可能要招两个小伙伴(iOS、Android)单独负责打包接入,比较繁琐移植性差
改进点:
- 自动持续化集成
- 远端发布编译产物部分
1.1 针对如何进行自动化持续化集成,CI框架/jenkins+webhook 方式都可以很好的解决自动持续集成
1.2 使用脚本代码代替【人工智能】方式
目前完成上诉部分后我们可能可以比较优雅的接入Flutter至Native工程之中,我们解决了繁琐部分的问题但是并没有解决了可移植性的问题。
对于移植性这个问题我们该如何解决?这个问题其实一直在客户端开发中存在,功能模块如何做到复用,不通工程移植性好。当然是组件化了~
-iOS
远端发布选择Cocoapods方式引入,产物pod库
iOS 工程 pod 直接依赖这个工程pod库,但是这样子缺少版本控制,我们需要对不通的版本功能开发迭代进行把控,因此我们还需要将这个pod发布到我们的对应的组件pod库
-Android
同理对应Android项目我们也是希望直接一句代码配置接入Flutter。选择maven作为远端发布的工具,上传我们对应的aar包,项目直接依赖 flt-business.aar 。
但是我们发现目前我们能获取到的Android的产物是 libs.jar 文件而不是aar。所以我们要做到如何生成aar文件(包含lib.so flutter.so 资源文件),通过gradle uploadArchive方式上传到我们自己的maven库。
- 新建packageflutter library module 来生成aar
- gradle buildFlutterPlugin 进行dependency flutter jar ,资源文件的依赖
- 执行uploadArchive 上传至我们的maven 库
总结
该文章是记录自己从接触Flutter后一步一步接入到native的历程,一步一步踩坑总结出的经验,当然只是完成这些步奏我们在快速开发flutter项目的时候还是不能完全完成 自动 持续 混合等概念,因为flutter项目还有个plugin概念,native 插件部分,这些也是要完成持续集成部分,在后面的文章我会带来如何完成这一部分的持续集成部分。
Q&A
1.为什么iOS不需要引入资源文件buAndroid需要,可以观察发现App.framework中我们已经有资源文件部分了,而lib.jar中并不存在对应的资源文件,因此我们需要自己再引入一次