本人之前分别尝试用iOS原生和Flutter写了同一个小应用, 一个空气质量查询App, 名字叫Aireport, 目前已经分别上架了App Store.
Aireport原本是我自己在用, 但是在初步学习了Flutter后我决定用Flutter最大限度的去模仿iOS原生版的应用, 以评估Flutter是否有能力做到以假乱真的地步. 我们在上一篇文章中已经探讨了Flutter在开发中可能遇到的问题, 这篇文章我们将着重放在两者用户在实际体验中的差距.
1.安装包大小
安装包大小决定了用户等待下载的时间和可能会耗费的流量, 即便是即将迈入5G时代的今天, 我们依然需要尽量优化应用安装的大小.
Flutter应用安装包和安装后容量
iOS原生应用安装包和安装后容量
虽然Flutter的结果我多少能够猜到, 但安装包9倍, 磁盘占用4倍的差距还是让我感到失望, 何况如果我使用OC开发的话安装包还能进一步缩小(WWDC有可能将swift设为稳定版嵌入iOS系统内核, 届时swift版将有望自动瘦身).
由于项目很小就百行代码, 因此这30MB的空间占用基本就是Flutter的SDK容量.30MB的空间对于一款App来说已经是一个不小的数字, 而且应用之间不能共享SDK, 有几个Flutter应用就会有几个Flutter SDK. 这让技术团队在选择开发框架时不得不着重考虑一下今后App的容量问题.
2.启动速度
上面的应用容量除了影响磁盘占用外, 对启动速度也会有影响. 我在iPhone X上实测了一下, iOS原生应用的冷启动速度大概是在0.4秒左右, 而Flutter的冷启动速度在1.5秒左右.
毫无意外iOS这一局又占上风. Flutter的启动过程首先会去跑完完整的iOS原生应用的所有流程直至第一个ViewController实例化后,再由VC去调用加载Flutter SDK, 初始化Flutter的运行时环境. 也就是说Flutter应用的启动时间=iOS原生应用的启动时间+Flutter环境的启动时间. 用户对于应用的容量占用几乎很难察觉, 但是应用的启动时间对用户体验的影响绝对是致命的(虽然现在的启屏广告已经完全不考虑用户体验了). 在这一点上不知道往后Google团队还有没有优化的空间.
3.内存占用
内存占用一直是移动开发中的一个优化重点.不过目前来看Release版的Flutter在内存占用这一块也没有任何优势, SDK拖累是一方面, 单个页面内存占用也比原生多一倍.
注意, 我们知道Flutter在Build版本中的性能和Release是不一样的, 同一个应用, Build版的内存占用在100M左右, 为了热加载我也是忍了.
内存占用不仅影响着应用性能、电池损耗、 程序稳定性, 最重要但是, 内存占用越大, 被系统干掉后台的可能性就越大. 我自己的使用体验来看, iOS原生的Aireport基本上大部分时间都处于休眠状态, 而Flutter会在关闭不久后直接被系统干掉.
4.流畅度
从框架一出现,60FPS似乎始终贯穿于各大Flutter的介绍和分析文章中, 这让我们对Flutter的流畅度非常期待.然而:
上面是iOS原生App的帧率, 下面是Flutter的帧率, 很明显这是一个尴尬的结果.Flutter应用在运行过程中频繁出现了红色的警告, 这表明应用在这段时间没没有以60帧的速度完美渲染出页面.
这种帧率的差距也体现在了实际使用中. 无论是页面的切换, 还是ListView的滚动, Flutter都仅仅能达到还算流畅的程度, 但明显还达不到iOS原生60帧的丝般顺滑. 当然, 目前的Flutter还处在Beta版, 而且我个人认为, 相对于安装包大小和启动速度, 运行时的流畅度更容易进行优化. 我相信Flutter将在之后的版本中进一步优化应用的流畅度, 达到与原生媲美的程度.
5.iOS特性支持
iOS应用开发受益于强大的iOS系统和丰富的生态体系, 天生就具有大量实用且不可替代的特性, 例如Bitcode能够在云端自动优化我们App的代码, 原生应用默认就支持增量更新、后台应用刷新等等.
很显然Apple赋予iOS应用的这些种种特性与Flutter应用是无缘的, 如果Flutter能够支持热更新的化那么其可用价值就高了许多. 但目前实现起来还有诸多问题, 包括部署、性能问题, 以及苹果对于热更新的谨慎态度.
综合了目前Flutter在开发中的体验以及和原生应用的比较, 我目前对Flutter的评估结果是: 再等等.
Flutter的确提供了一种不同于目前其他跨平台开发框架的思路, 也极有可能成为未来跨平台开发的标杆. 如果你是个人开发, 我还是建议你学习一下Flutter, 它的Dart语言、Wiget化、数据绑定、单向数据流等等现代特性值得你去了解. 同时对于无法同时掌握多个移动开发平台的小伙伴而言, 使用Flutter也是一种成本较为低廉的方法. 但是对于公司而言, Flutter还无法完全投入生产环境, 而且初期Flutter的开发成本未必会低于原生平台.
目前Fuchsia的开发进度还不得而知, Flutter也还处在Beta3阶段. 相信等Fuchsia正式发布的时候才是检验Flutter正在实力的时候.