Flutter完整开发实战详解(十四、混合开发打包 Android 篇)(1)

一般而言,对于普通项目我是建议以 第二种方式集成到项目中的 ,通过新建一个 Flutter 工程,然后对工程进行组件化脚本处理,让它 既能以 apk形式单独运行调试,又能打包为aar形式对外提供支持。

相信对于原生平台熟悉的应该知道,我们可以通过简单修改项目gradle 脚本,让它快速支持这个能力,如下图片所示,图片中为省略的部分脚本代码,完整版可见 flutter_app_lib

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们通过了 isLib 标记为去简单实现了项目的打包判断,当项目作为 lib 发布时,设置 isLib 为 true,之后执行 ./gradlew assembleRelease 即可 ,剩下的工作依旧是 Flutter 自身的打包流程,而对于打包后的 aar 文件直接在原生项目里引入即可完成依赖。

而一般接入时,如果需要 token 、用户数据等信息,推荐提供定义好原生接口,如 init(String token, String userInfo) 等,然后通过MethodChannel 将信息同步到 Flutter 中。

对于原生主工程,只需要接入 aar 文件,完成初始化并打开页面,而无需关心其内部实现,和引入普通依赖并无区别。

你可能需要修改的还有 AndroidManifset 中的启动 MainActivity 移除,然后添加一个自定义 Activity 去继承 FlutterActivity 完成自定义。

三、插件

如果普通情况下,到上面就可以完成 Flutter 的集成工作了,但是往往事与愿违,一些 Flutter 插件在提供功能时,往往是通过原生层代码实现的,如 flutter_webviewandroid_intentdevice_info 等等,那这些代码是怎么被引用的呢?

这里稍微提一下,用过 React Native 的应该知道,带有原生代码的 React Native 插件,在 npm 安装以后,需要通过 react-native link命令完成安装处理。 这个命令会触发脚本修改原生代码,从而修改 gradle 脚本增加对插件项目的引用,同时修改 java 代码实现插件的模版引入,这使得项目在一定程度被插件“污染”。

React Native 中带有原生代码的插件,会被以本地 Module 工程的方式引入,那 Flutter 呢?

其实原理上 Flutter 带有原生代码的插件,在插件安装后,也是会以本地 Module Project 的形式引入 ,但是它整个过程更加巧妙,让开发中对这个过程几乎无感。

如下图所示,不知道你注意过没有,在插件安装之后,所有带原生代码的插件,都会以路径和插件名的key=value 形式 存在 .flutter-plugins 文件中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而在 android 工程的 settings.gradle 里,如下图所示,会通过读取该文件将 .flutter-plugins 文件中的项目一个个 include 到主工程里。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

之后就是主工程里的 apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 脚本的引入了,这个脚本一般在于 flutterSDK/packages/flutter_tools/gradle/ 目录下,如下代码所示,其中最关键的部分同样是 读取 .flutter-plugins 文件中的项目,然后一个一个再 implementation 到主工程里完成依赖。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自此所有原生代码的 Flutter 插件,都被作为本地 Module Project 的形式引入主工程了 ,最后脚本会自动生成一个 GeneratedPluginRegistrant.java 文件,实现原生代码的引用注册, 而这个过程对你完全是无感的。

说了那么多就是为了说明,既然插件是被当作本地 Module Project 的形式引入,那么这时候按照原来直接打包 aar 是会有问题的:

`Android` 默认 `gradle` 脚本打包时,对于 `project` 和远程依赖只会打包引用而不会打包源码和资源。

所以这时候就需要 fat-aar 的加持了,关于 fat-aar 的详细概念可见 :《从Android到React Native开发(四、打包流程解析和发布为Maven库)》 ,这里可以简单理解为,这是一个支持将引用代码和资源到合并到一个 aar 的插件。

如下代码所示,我们在原本的组件化脚本上,通过增加 apply plugin: 'com.kezong.fat-aar' 引入插件,然后参考 Flutter 脚本对 .flutter-plugins 文件中的项目进行 embed 依赖引用即可 ,这时候再打包出的 aar 文件即为完整 Flutter 项目代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

完整版可见 flutter_app_lib

四、堆栈

最后需要说的问题就是堆栈了。

如果说混合开发中最难处理的是什么,那一定是各平台之间的堆栈管理,一般情况下我们都会避免混合堆栈的相互调用 ,但是面对不得不如此为之的情况下,闲鱼给出了他们的答案:fluttet_boost

我们知道 Flutter 整个项目都是绘制在一个 Surface 画布上,而fluttet_boost 将堆栈统一到了原生层,通过一个单例的 flutter engine 进行绘制。

每个 FlutterFragmentFlutterActivity 都是一个 Surface承载容器,切换页面时就是切换 Surface 渲染显示,而对于不渲染的页面通过 Surface 截图缓存画面显示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这样整个 Flutter 的路由就被映射到原生堆栈中,统一由原生页面堆栈管理,Flutter 内每 push 一个页面就是打开一个 Activity

flutter_boost 截止到我测试的时间 2019-05-16, 只支持 1.2之前的版本。 flutter_boost 的整体流程相对复杂,同时对于 Dialog 的支持并不好,且业务跳转深度太深时会出现黑屏问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自此,第十四篇终于结束了!(///▽///)

资源推荐

完整开源项目推荐:

分享读者

作者2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。

被人面试过,也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!

我们整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。

腾讯T3架构师学习专题资料

如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!

我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
更值钱。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值