美文网首页
在已有项目中集成Flutter(混合开发)-Android篇

在已有项目中集成Flutter(混合开发)-Android篇

作者: 小刚_0e61 | 来源:发表于2019-02-26 18:51 被阅读0次

这篇文章用于帮助刚上车的人,如果你已经是Flutter界的老司机,那就没必要浪费时间了。我们使用Flutter的形式有两种,一种是纯flutter(这里说的纯代码native层几乎不写我们自己的业务代码,业务都用dart实现),一种是flutter与native混合开发。纯Flutter开发就不用介绍了,按照官方文档来,没有什么难点。对于大多数公司来说,想在已有项目上尝试flutter技术就必需进行混合开发。现在网上有很多文章,但说的大都比较坎坷,说实话可能会带来一些误导,其实有很多坑是可以绕过去的。要知道,我们对flutter编译环境改的越多,就意味着以后升级维护越复杂。

首先下面要说的开发模式都是standalone的, Android、IOS、Flutter是三个工程,互不影响,这样效率是比较高的。在已有项目中使用flutter,官方是有wiki说明的(https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps#experiment-turn-the-flutter-project-into-a-module),里面的大致步骤如下:
1.创建flutter模块。

$ cd some/path/YouProject/
$ flutter create -t module my_flutter

2.上一步我们就创建了一个新模块(module),接下来让主项目依赖这个模块。

// 修改settings文件,MyApp/settings.gradle
include ':app'                                     // assumed existing content
setBinding(new Binding([gradle: this]))                                 // new
evaluate(new File(                                                      // new
  settingsDir.parentFile,                                               // new
  'my_flutter/.android/include_flutter.groovy'                          // new
))  

// 修改主项目build文件,MyApp/app/build.gradle
dependencies {
  implementation project(':flutter')
}

经过这两个步骤,我们就集成了flutter模块并可以运行了,下一步就是启动flutterActivity,运行flutter界面了。
接着,我们发现上面的集成方式其实有一些问题。Flutter模块作为一个module集成到了Andorid项目中,ios项目该怎么集成?flutter作为一个独立的通用平台,不应该单一集成在android、ios项目里,另外,flutter的引入使得项目的所有开发人员都必须配好flutter环境,否则项目就跑不起来,这无疑给大家造成了时间浪费。好了,下面进入主题。如何快速、简单的集成flutter? 我们都知道Android可以通过aar包的形式集成三方库,flutter实际上也是flutterso库+dart编译产物+一些资源+部分java桥接代码组成的,理论上作为aar集成是可行的。事实上也是可行的,下面分享一种比较简单的方法,最终的集成产物只有几个aar,既可以直接集成,也可以上传maven通过maven依赖集成,可以方便的满足正常版本迭代的需求。

最终我们需要集成的所有flutter文件:


image.png

为了实现上面的效果,第一步,也是最核心的一步,我们先要找到flutter-release.aar; 经过文章一开始介绍的官方集成的方法,其实my_flutter 模块在编译完以后,在my_flutter/.android/Flutter/build/outputs/aar 目录中已经存在 flutter-xxx.aar了,那我们能拿出来用吗?答案是可以的。但是处理一些坑。首先我们把flutter-release.aar集成到项目中,在application.oncreate初始化flutter模块

  FlutterMain.startInitialization(this)

然后在特定的位置启动FlutterActivity,实现混合开发;
编译aar的方法有两种,编译的结果略有不同,第一种在my_flutter目录下,执行flutter run --release,此时编译脚本会根据连接的设备进行编译,现在的手机一般都是64位cpu,所以编译出来的aar中的so库是arm64-v8a的;第二种方法是在my_flutter目录下,执行flutter build apk --release,这种方法编译出来的aar中的so库用的arm-v7a(原因详见sdk目录中的 flutter.gradle,内部写死)。

好吧,在写这篇文章的时候flutter 1.2.1 stable版已经发布了,这个版本编译的aar可以放到app直接使用了,不会报错(除去一些target、java 1.7要升1.8的小编译问题)。在些之前编译的aar是不能用的,需要处理一些坑。。。相信flutter会越来越强大,开发的过程中遇到什么问题可以一起交流~~

相关文章

网友评论

      本文标题:在已有项目中集成Flutter(混合开发)-Android篇

      本文链接:https://www.haomeiwen.com/subject/zkdzyqtx.html