Flutter混合开发之打包aar并上传到nexus

今天我必须得写篇博客来记录下这“历史性”的时刻,耗时3天终于算是搞出来了。此时此刻只有一张图能形容我现在的状态。

我们的产品已经正式使用一年了,移动端Android和iOS都是采用原生开发,有一个模块使用频率非常高、改动的频率非常高、逻辑非常复杂,当初在做这个模块的时候就在想有没有一个框架能够嵌入到原生的应用中,就像网页一样的嵌入进去,这样只要开发一次就好了,避免了两端人员对需求的理解偏差,导致开发和测试成本增加,接触Flutter也有一个多月时间了,就觉得很契合我当初的设想。

其实项目从上线到现在已经有大半年了,让我去寻找这样一个框架的需求并不迫切,但是!在我看了iOS端代码后,这个需求强烈的不能再强烈了!这就是我说的那个使用频率很高的模块。

看到代码的那一刹那,我感觉我的一只脚已经跨出了公司的大门了。我不知道其他同学接手过的项目怎么样,我也不敢说自己写的代码有多精简和牛逼,但是这么一坨至少在我这里我是没法容忍了。为了挽回程序员那点颜面,也为了证明下自己,主要是想验证下混合方案的可行性,我决定收回那只脚。其实我这里多说一句,在工作中遇到的种种困难,都不要逃避,把这个困难当成一次历练,因为这种困难真的很难得!有这种机会就要把握住,分析困难,解决它,你就离成功又进一步了。

废话不说,进入正题。

Flutter和原生Native项目混合使用官方已经有方案,这里是官方方案,官方的方案就是将flutter作为module,然后native主工程引入进来。这种方式适合1到2人负责的项目,如果有多人协作开发的大型项目就不合适了,因为其他人首先要配置Flutter环境,而且团队里面其他人还要配置module的依赖,熟悉flutter,成本是很高的。我们能不能将flutter写的项目打包成aar然后native项目只要简单的implementation进来就行了呢?答案是肯定的。

这种方案最早提出者是闲鱼,大家可以观摩下这篇文章,其主要思想就是将flutter相关的产物(这让我想到了大便)打包起来,然后传到maven等仓库上。

我们需要解决的问题有以下几点:

1、如何把flutter的产物提取出来;

2、如何打包成aar;

3、如何上传到maven以及如何引入。

一、提取Flutter产物

产物提取的过程大家可以观摩下这篇掘金文章,写的很好,最核心的就是这位作者在最下面提供的那个脚本。我把提取的脚本代码贴出来,有几处我做了修改。

flutter.sh

大家把flutter.sh文件放到项目的项目根目录下,如我的是flutterdemo/flutter.sh。

然后在项目根目录下新建bak文件夹,将下面几个文件放进去。

dependencies_gradle_plugin.gradle

setting_gradle_plugin.gradle

其实把上面的步骤都做好后,再把

flutter.sh

文件232到258行注释掉,然后点击AndroidStudio下面的Terminal选项卡来切换到命令行模式,运行

sh flutter.sh

就能生成产物了,产物就在

/Users/longdw/Documents/Flutter/flutterdemo/.android/Flutter/src/main/assets/

下面。

二、编译出AAR文件

flutter.sh

文件232到240行放开,然后再运行一次

sh flutter.sh

,然后我们进入

/Users/longdw/Documents/Flutter/flutterdemo/.android/Flutter/build/outputs/aar/

会看到flutter-release.aar文件,进行到这一步大家可以把这个文件拷贝到一个纯原生的Android项目中,然后把它放到xxx/app/libs下面,然后修改app的build.gradle

至此,我们其实就可以引用flutter中所有的相关内容。当然距离我们的目标还差最后一步。

三、上传到nexus并引用

nexus的安装我们看这篇文章。安装很简单,安装好后我们再切换回来。

接下来我们在flutterdemo/bak/下面新建一个config文件夹,然后把下面这个文件拷贝进去

uploadArchives.gradle

然后在bak下面新建

gradle.properties

文件如下

然后我们把flutter.sh文件242到258行注释放开,接着再执行

sh flutter.sh

,耐心等待几十秒,我们会发现如下输出

然后登录我们的nexus看下仓库是否上传成功

最后一步就是在app的build.gradle中引入

修改project的build.gradle

同步下gradle,过一会儿,不出意外就完全成功了!

其实每一步都有原理在里面,需要深究的话还有很多东西可以学,接下来我再研究下iOS下怎么打包集成。

发表评论

电子邮件地址不会被公开。 必填项已用*标注