关于 Flutter 的一些想法

flutter

2018-10-24

Flutter 应该是目前比较热门的一项技术 —— 高效的开发效率,一套代码可以支持 Android/iOS 双端运行,Google 新的操作系统 Fuchsia 的默认 UI Toolkit 等等,都吸引了开发者社区大量的关注。

对还没接触过 Flutter 的开发者来说,首先要问的就是 Flutter 是什么?它在客户端开发的技术栈中处于什么位置?跟哪些技术比较相似,跟哪些技术存在相互竞争的可能?它的优点是什么?本文试图按照自己的理解来回答这些问题。

# What is Flutter

Flutter 是一个内置了布局引擎,渲染引擎,完全自绘 UI 界面的 UI Toolkit 和应用框架,使用 Dart 作为应用开发语言,采用 React 的方式编写 UI,支持一套代码在 Android/iOS 上双端运行。

在 Flutter 开发之初,就有一些非常重要的设计原则:

  • 开发效率至关重要

UI 代码的编写支持代码 Hot Reload,开发者在修改 UI 界面后,修改的代码马上被发送到已经部署了应用的设备上重新加载,同时应用的状态(特定对象)得以保留,开发者可以马上看到修改后的效果。重视开发工具链,Flutter 有完善的开发,调试,测试,性能分析环境。一套代码可以同时生成 Android/iOS 应用,双端运行,使业务方只需要组建一个移动开发团队,降低开发成本。

  • 充分发挥设备性能

渲染引擎使用 Skia 通过 GPU 做光栅化。应用的 Dart 代码在生成发布版本时,会生成真正的机器码直接运行在目标设备上,不再需要解析器解析运行或者 JIT,并且支持 Dead Code Removal 最小化发布版的 Binary 大小(这也是为什么选择 Dart 语言的主要原因,开发过程可以动态解析执行提高开发效率,发布时可以生成机器码最大化性能)。

屏幕快照 2018-06-09 下午3.20.08.png

Eric Seidel 是参与 Flutter 开发最早的几位开发者之一,他的 What is Flutter 访谈,谈到了当时为什么开发 Flutter,Flutter 设计初期的一些主要设计原则等。这个访谈可以让读者获得一个不错的概览。 Eric 在开发 Flutter 之前是在 Chrome 团队做排版和渲染。Flutter 早期的几位开发人员都来自 Chrome 团队,所以我们会看到 Flutter 的渲染流水线的设计跟浏览器有很多相似之处,甚至排版引擎的对象命名,如 RenderObject 等。 当然这些只是设计上的相似,实际上的运行有本质的区别。

# Flutter vs Native

flutter.png 在客户端开发的技术栈,假设我们分成 Native(原生 SDK 开发),Hybird(RN,Weex)和 Web 这三层,Flutter 所处的位置大概在 Native 和 Hybrid 之间,它最直接的竞争的对象就是 Native。

应该说自绘 UI 界面的跨平台 UI Toolkit 这个概念并不新鲜,Qt 就是这里面最有名的一个,Qt 很早就有做移动平台,后面新设计的 QML 在设计理念上也有很多先进的地方,包括使用 JavaScript 作为开发语言基于 v8 运行,QML 作为界面描述语言,使用 GPU 光栅化等等。当时 Qt 在移动平台上跟 Native 的竞争完全落败,那 Flutter 会有机会吗?

我自己觉得是有的,一方面 Flutter 的一些设计理念更先进,像开发过程的 Hot Reload,发布时直接生成机器码,React 的方式编写 UI 等等;另外一方面 Google 相比 Qt 一个小团队也有更多资源去推广和支持 Flutter,Google 本身的背书也让开发者更有信心。

最重要的是我自己认为在当前,Native 被取代的时机更成熟了,第三方应用框架带来的 Binary 大小增加,加载和初始化耗时增加,性能下降等负面因素已经变得越来越不重要,特别是 Flutter 在这方面表现的还很不错,比如说 Flutter Runtime 在 Android 上大概只增加 7m+ 的 APK 大小。而 Flutter 的高效率,低成本对开发者,特别是中小开发团队来说是非常有吸引力的。从长远来看,Native 被 Flutter 取代的概率会变得越来越高。如果你是一个中小团队的开发者,开发一个中等规模的新应用,也不像游戏或者直播这种应用需要直接访问 GPU,那从现在开始就使用 Flutter 已经变成了一个非常可能的选择。如果你开发的是一个大型的应用,需要使用 Native + Hybird,或者 Native + Web,在这种情况使用 Flutter 去取代 Native 可能倒不是一个好的选择,或者可以考虑局部使用 Flutter。

早前看的一些科技博客,也有其它作者表达相似的想法,Kotlin,Swift 很有可能会变成 DOA(Dead On Arrival)。 这里被取代并不是指完全不用 Native,或者没有应用使用 Native 开发,只是使用 Native 的比例和概率越来越低。

# Flutter带来的影响

我个人觉得影响在于使用 Flutter 用于自己应用的开发,比如闲鱼,已经在应用的部分场景使用 Flutter 来开发,未来应该会看到更多基于 Flutter 开发的应用。Flutter 对应 Native 甚至 RN 都有可能是一个可行,或者部分场景可行的替代方案。

另外,如果基于 Flutter 二次开发,定制自己的跨平台自绘渲染引擎,技术上仍然有一些问题需要解决,自己能想到的有:

  1. 小程序,快应用等使用 JavaScript 作为开发语言,而 Flutter 使用 Dart 作为开发语言;
  2. 小程序,快应用等都有需要内嵌原生 View 组件混合渲染的需求,而 Flutter 在这方面并没有很好的支持;

开发语言的问题,解决方案可能是开发一个 JavaScript 调用 Dart Flutter API 的 Wrapper 层,或者完全用 JavaScript 重写 Flutter 的上层模块,在 API 上保持兼容。跟原生 View 组件混合渲染的解决方案,修改 Flutter 的渲染引擎理论上应该也不会太难。