一、Flutter简介。
Flutter是Google使用Dart语言开发的移动应用开发框架,使用一套Dart代码就能构建高性能、高保真的iOS和Android应用程序,并且在排版、图标、滚动、点击等方面实现零差异。
Flutter是如何实现跨平台:Flutter能够在iOS和Android上运行起来,依靠的是一个叫Flutter Engine的虚拟机,Flutter Engine是Flutter应用程序的运行环境,开发人员可以通过Flutter框架和API在内部进行交互。
Dart语言学习成本?
dart 语言是学习成本很低,因为无论对于擅长 JS 的前端而言,还是对于掌握 Java\Kotlin\Swift 的客户端而言,Dart 无论怎么看都是“弟弟”。
dart是AOT(Ahead Of Time)编译的,也可以通过JIT(Just In Time)进行编译。
为什么要尝试使用Flutter?
- 跨平台使用相同的UI和业务逻辑,平台一致性,节省开发时间。
- 无限接近原生的交互体验
- 丰富的UI动画
- 能够很容易与原生进行交互
- 适用于更多的平台 (Flutter不仅是可以在移动设备上使用,还支持Web端。)
Flutter使用大势所趋
- 目前Google正在研发Fuchsia OS(与Flutter配合使用),因此Flutter会继续投入研发人员维护和升级,不会中断。
- 使用Flutter的门槛并不高,因为社区中已经有了很多的人气很高的Android开发人员都在提倡和使用Flutter。
- 已经有很多大公司在使用,例如:阿里巴巴,微信,Google Ads,Bilibili,快手,哈罗出行,Ford等等,这是Flutter实力的证明。
Flutter系统架构图:
Flutter框架分为三层:Framework层、Engine层和Embedder层。
1、 Framework层:由Dart来实现,包含众多安卓Material风格和iOS Cupertino风格的Widgets小部件,还有渲染、动画、绘图和手势等。Framework包含日常开发所需要的大量API,普通应用开发熟悉这些API的使用基本OK了,不过很多特殊场景的控件需要自己根据实际情况进行自定义。
2、 Engine层:由C/C++实现,是Flutter的核心引擎,主要包括Skia图形引擎、Dart运行时环境Dart VM、Text文本渲染引擎等;
3、 Embedder层:主要处理一些平台相关的操作,如渲染Surface设置、本地插件、打包、线程设置等。
框架对比:
二、Flutter与native对比有何优势。
优点:
* 简单易学,Dart语言更具优势;
* 混合开发可以快速兼容多个系统,开发周期快,更新发布快 * 跨平台开发,核心代码只需编写一次就可以部署到多个平台,节省开发时间和成本 * 后期运用维护成本低,只需要一个团队就可以维护app的更新迭代; * 原生和web的融合,是新的技术趋势,尤其对经常需要更新的app,如淘宝、大众点评等app,将h5技术应用到原生app里,已经是大的趋势。
缺点
* 脱离不开原生,开发人员需要具备原生(Android、iOS)基础开发能力; * 相对原生来说,性能稍慢。但混合开发已经是未来的发展趋势。
* apk包相对native apk包大小增加。 * 加载缓慢/网络要求高:混合APP数据需要全部从服务器调取,每个页面都需要重新下载,因此打开速度慢,网络占用高,缓冲时间长,容易让用户反感;
三、Flutter App与Native App性能对比以及apk大小对比。
运行性能测试:
1.android原生列表展示3000个textview为例:
a.运行在前台时:
cpu:保持在3%以下
Memory:储存保持在97.6MB
b.运行到后台:
cpu:保持在0%
Memory:储存保持在32.8MB
2.flutter列表展示3000个textview为例:
a.运行在前台:
cpu:保持在12%左右
Memory:内存保持在142.7MB左右
b.flutter app 运行到后台:
cpu:保持在12%左右
Memory:内存保持在94MB左右
apk安装包对比:
native与flutter apk对比(编写一个ui效果一模一样的 apk)使用AndroidStudio自带的APK Analyzer进行分析,如下图:
native apk: 3.4MB / classes.dex file 2.3MB
flutter apk: 15.9MB / classes.dex file 128.2KB
native 与flutter apk大小对比总结:
- apk 大小 可以明确的看出来,原生的安装包要比 flutter 安装包小约 12.5MB 左右。
- classes.dex 大小看dex 大小你会不会很奇怪,原生的 classes.dex 竟然比 flutter 版的dex大2MB,这是因为原生的 dex 里引入了 support 库和各种基础控件(ImageView TextView等等),而flutter 的 dex 里面没有support库,也没有原生控件,实际上 flutter 实现了一套自己的控件,包括 Material Design 和 Cupertino(iOS风格的widget)。
- lib 库 大家可能会发现,我们的 flutter 版 app 多出了一个 lib 库,打开里边是一个 libflutter.so,因为Flutter 引擎是用 C、C++ 来编写的,在 android 上会使用 ndk 编译,在 iOS 上使用 LLVM编译,而我们自己写的 dart 代码会通过 AOT 编译成各个平台的本地代码。
总结:
通过以上的分析,我们可以很明确的得出结论,android 原生在内存、CPU 资源占用方面要低于 flutter,并且安装包的体积也要小于 flutter,所以,不考虑其他因素,单纯从性能角度来说,android 原生肯定是要优于 flutter 的。但 flutter 也有它的优点,比如跨平台的开发、毫秒级的热重载等等,另外跨端开发也逐渐的流行。
四、flutter依赖第三方库可能存在功能不全问题(例如百度地图sdk):
native baidu map sdk支持的功能很多
flutter baidu sdk插件相对原生sdk功能支持少了很多。
总结:
通过百度第三方库的支持来看,native的baidu sdk功能覆盖全面,而flutter baidu 插件缺少一部分功能,如点聚合、导航、语音助手、工具集等等。如果flutter想使用这些功能,可以在flutter页面上显示出native view 让native sdk来实现缺失的功能。
五、native接入flutter开发方案。
业内绝大部分的App都不可能推倒重来,所以混合工程的方式接入Flutter是目前主流开发模式,下面简单说说业界两种工程管理模式:
统一管理模式(不推荐)
- 优点 :适合全新使用Flutter开发的项目
- 缺点:后期代码耦合严重,相关工具链耗时大幅增长,导致开发效率低
项目结构:
三端分离模式(推荐)
优点
- 快速实现Flutter功能“热插拔”,降低原生工程的改造成本
- 可以直接进行Dart代码和原生代码开发调试
项目结构: