Flutter在混合项目中的构建和集成

栏目: Android · 发布时间: 6年前

内容简介:在之前的一篇文章扇贝现有的项目是原生混合React Native,并且是以组件化的架构存在,现在想在一些页面上用Flutter进行重构,想要在新的Flutter项目上集成以前的所有代码肯定是不现实的,同时又不想将Flutter项目直接侵入到我们的项目结构中去,于是我们选择将重构好的Flutter代码单独编译成aar,以组件的形式被主工程依赖。这样做的好处是显而易见的: 对Flutter进行探索开发的同学可以在自己的Flutter工程内编写dart代码,独立运行调试,发布版本的时候打包成aar集成到主工程中

在之前的一篇文章 《Flutter的探索与实践》 中关于Flutter如何构建到现有项目这一节没有详细说,这篇文章将会介绍Flutter在混合项目中的构建和集成方面踩过的坑以及解决方案。

目标

扇贝现有的项目是原生混合React Native,并且是以组件化的架构存在,现在想在一些页面上用Flutter进行重构,想要在新的Flutter项目上集成以前的所有代码肯定是不现实的,同时又不想将Flutter项目直接侵入到我们的项目结构中去,于是我们选择将重构好的Flutter代码单独编译成aar,以组件的形式被主工程依赖。

这样做的好处是显而易见的: 对Flutter进行探索开发的同学可以在自己的Flutter工程内编写dart代码,独立运行调试,发布版本的时候打包成aar集成到主工程中让写native代码的同学接入,两方可以协同工作,不会产生耦合。

探索过程

下面的构建和集成是以Android项目为例。

首先用Android Studio或者命令行新建一个Flutter Application项目。

得到如下项目结构

Flutter在混合项目中的构建和集成

在命令行输入命令 flutter build apk 会编译生成apk文件,位于 build/app/outputs/apk/release/ 文件夹下。 将apk解压缩后就可以看到里面的结构组成。

Flutter在混合项目中的构建和集成

这个apk里的产物实际上是在Android的app/build.gradle构建代码里引入了Flutter的构建代码。

apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
复制代码

通过阅读flutter构建源码我们发现在构建apk文件的时候,会将需要的文件构建到apk中。

1.assets文件夹

assets文件夹下面有flutter_assets文件夹、flutter_shared文件夹、isolate_snapshot_data、isolate_snapshot_instr、vm_snapshot_data、vm_snapshot_instr文件。

  • flutter_assets里是flutter工程产生的assets文件
  • flutter_shared里是封装在flutter.jar里面的处理字符编码的ICU库
  • isolate_snapshot_data、isolate_snapshot_instr、vm_snapshot_data、vm_snapshot_instr为特定平台的数据和指令

2.lib文件夹

lib文件夹下是特定平台(arm或者x86)的so文件。

flutter在Android平台下会默认生成arm-v7架构的的so库,flutter.gradle源码中会根据 target-platform 属性判断平台动态生成对应的so,官方注释目前flutter只支持在debug模式下生成x86的so。

Flutter在混合项目中的构建和集成

扇贝应用集成了一部分三方的so库,而且只选用了arm架构的so库,x86的设备只占到1%左右,因此下面的操作都是默认为arm架构。对需要x86 so的同学下文会做说明。

抽取aar

上面通过编译命令得到了apk,那想要打包成aar,理论上只要把app/build.gradle中的 apply plugin: 'com.android.application' 修改为 apply plugin: 'com.android.library' ,同时删除 applicationId "com.shanbay.flutterapp" 再次执行 flutter build apk 命令,便可以得到 app-release.aar 文件。

Flutter在混合项目中的构建和集成

集成到现有项目

我们将得到的aar文件集成到现有的Android工程中供native的小伙伴使用,但是打开flutter页面却闪退了,同时flutter报出了error,错误是说aar里面缺少icudtl.dat文件。

Flutter在混合项目中的构建和集成

解压缩aar查看文件结构,可以发现其中的问题。

Flutter在混合项目中的构建和集成

在aar文件夹下的assets里面缺少了flutter_shared文件夹,icudtl.dat文件正是在该文件夹里面,也就是说flutter.gradle在编译流程中并没有将icudtl.dat文件打进aar包里面,这一点从flutter库的issue里面得到了证实,我们的办法是将apk里面得到的flutter_shared文件夹手动copy到flutter工程中,再次编译aar,这样就可以得到有icudtl.dat的aar文件。再次集成到Android项目中便可以成功运行,不会产生错误。

Flutter在混合项目中的构建和集成
Flutter在混合项目中的构建和集成

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

加密与解密(第4版)

加密与解密(第4版)

段钢 / 电子工业出版社 / 2018-10-1 / 198

《加密与解密(第4版)》以加密与解密为切入点,讲述了软件安全领域的基础知识和技能,如调试技能、逆向分析、加密保护、外壳开发、虚拟机设计等。这些知识彼此联系,读者在掌握这些内容之后,很容易就能在漏洞分析、安全编程、病毒分析、软件保护等领域进行扩展。从就业的角度来说,掌握加密与解密的相关技术,可以提高自身的竞争能力;从个人成长的角度来说,研究软件安全技术有助于掌握一些系统底层知识,是提升职业技能的重要......一起来看看 《加密与解密(第4版)》 这本书的介绍吧!

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具