likes
comments
collection
share

Flutter: 架构 -- Engine

作者站长头像
站长
· 阅读数 11

Engine 层由 C/C++ 实现,Flutter Engine 为 Flutter 应用提供了运行环境,是 Flutter 的核心。

Flutter: 架构 -- Engine 上图是 Engine 层的截图,Engine 下面标了 C/C++,表示了 Engine 层由 C/C++ 实现,而且可以看到 Engine 层包含了很多的功能,我把它归纳如下:

  • 渲染相关:Composition 、 Rendering 、 Frame Scheduling 、 Frame Pipelining
  • Dart 相关:Service Protocol 、 Dart Isolate Setup 、 Dart VM Managemnt
  • 平台通道:Platform Channels
  • 系统事件:System Events
  • 资源解析:Asset Resolution
  • 文字渲染:Text Layout

其中的核心功能,包括动画和图形渲染,文件和网络 I/O,Platform Channels ,插件体系结构,以及 Dart 的运行时环境和编译工具链等

接下来介绍一些核心的东西。

渲染引擎:Skia

Skia 是 Flutter 的图形引擎,是 Flutter 渲染过程中的重要一环。

Skia 是 Google 的跨平台 2D 向量图形库,而且已经发展的很成熟:在 2005 年被 Google 收购后,已经成为 Google Chrome,Chrome OS,Android, Mozilla Firefox, Firefox OS 等众多产品的图形引擎,支持的平台包括 Windows7+,macOS 10.5+,iOS8+,Android4.1+,Ubuntu14.04+ 等,并且 Skia 发展的已经很稳定了。

Android 是自带 Skia,所以 Android 端 Flutter 不需要打包 Skia,所以在 Android端,Flutter 的包大小会小一些;而 iOS 不带 Skia,所以 iOS 的 Flutter 包会大一些。

Dart 运行时环境

Dart 运行时环境包括 Dart VM 及其他 Dart 运行所需要的库。

  • Dart VM Dart VM 除了实现普通 Dart 的核心库之外,还增加了一个 dart:ui 库,这个库是专门为 Flutter 定制的,提供 Skia 和 Shell 功能的低级 API。 而且在 Flutter Debug 模式中,Flutter Engine 使用的是 Dart VM ,而 Dart VM 支持 JIT(即时编译),从而使 Flutter 在 Debug 阶段有 Hot Reload 的功能。
  • Dart 相关库 在 Release 模式下,Flutter 不会带 Dart VM,因为 Flutter 使用的是 AOT(静态编译),会编译成 Native Arm Code,所以不在需要 Dart VM,但是运行 Native Arm Code 也需要其他 Dart 相关库,例如 Garbage Collection (GC,垃圾回收) 等,这些库不包含在 Dart VM 里。

讲到这里,我有一个问题: 为什么 Dart 可以运行在不同的平台上?

是因为 Dart 并不是直接运行在平台上,而是运行在 Flutter Engine 上,Flutter Engine 为 Dart 提供了运行环境。

Platform Channel

Platform Channel 是平台通道,用于 Flutter 与 Native 通信:

  • 应用的 Flutter 部分通过平台通道(platform channel)将消息发送到 Native(iOS 或 Android)。
  • Native 接收消息,然后调用 Native 的 代码处理, 然后将响应发送回 Flutter 。