Flutter : Engine 架构

写在前面

本篇主要是对 Flutter 引擎(Engine)进行概述,主要来自官方的 The Engine architecture

内容

简介

Flutter Engine 实现了 Flutter 的一系列核心库,包括动画和图像,文件还有网络 I/O,辅助功能支持,插件架构,还有用于开发、编译、运行 Flutter 应用的 Dart 运行时和工具链。

Flutter 的引擎把核心技术,Skia,2D 图像渲染库,还有 Dart,一门具有垃圾回收机制、面向对象语言的虚拟机放进一个壳(shell)里。不同的平台有不同的壳。例如现在有针对 Android 和 iOS 的壳。另外还有 embedder API 可以让 Flutter 的引擎当做库来使用。(参考 Custom Flutter Engine Embedders

线程

Flutter 引擎本身是没有创建和管理自己的线程的操作。相反,是 embedder 负责为 Flutter 引擎创建和管理线程。embedder 使用 task runners 的概念为 Flutter 引擎提供线程管理。此外 Dart 虚拟机也有它自己的线程池,但 Flutter 引擎和 embedder 都没有权限访问它。

Task Runner 配置

Flutter 引擎让 embedder 给它提供 4 个 Task Runner 的引用。对引擎来说,它不关心这些引用是否实际上就是同一个 task runner,或者这几个 task runner 是同一个线程来服务的 (相当于说 Flutter 引擎需要四个这样的接口,至于接口的具体实现它是不关心的)。但从最佳性能上来说,embedder 应该是要为每个 task runner 创建单独的线程。毕竟虽然引擎不关注这些,但它还是期望线程的配置在整个生命周期里应该是稳定的。

也就是说一旦 embedder 决定选择一个特定的线程来服务一个 task runner,那它就应该只是为这个 task runner 执行任务。

这些主要的 task runner 分别是:

  • Platform Task Runner
  • UI Task Runner
  • GPU Task Runner
  • IO Task Runner

Platform Task Runner

embedder 把这个 task runner 所对应的线程当做主线程。例如 Android 里的 Main Thread 或者是苹果平台里的 Main Thread。

这个 task runner 所对应的线程的任何优先级的任务都是由 embedder 赋予的。 Flutter 引擎对这个线程来说没有什么特别的含义。也就是说我们可以做到让多个 Futter 引擎运行在不同线程的 Platform Task Runner 上。这就是在 Fuchsia 系统里,Flutter Content Handler 的工作方式:每一个 Flutter 应用都会创建出一个新的 Flutter 引擎,并且每个引擎也相应的会创建出一个平台线程 (在 iOS 和 Android 上,则是多个 Flutter 引擎实例是共享同一个 Platform Task Runner )

只要是跟 Flutter 引擎发生交互,就必须在平台线程里进行。如果是在其它线程里跟平台进行交互,那么在未优化的版本里,那些断言就会失效(trip assertions),还有在 release 版本里,无法起到线程安全的效果。Flutter 引擎里很多组件都不是线程安全的。一旦 Flutter 引擎配置好后并开始运行,所有 embedder API 的访问就都在平台线程里进行。

另外,这个线程除了处理 embedder 和引擎的交互外,还需要执行任何平台的消息。因为只有在平台的主线程里访问大部分的平台 API 才是安全的。对于插件,它不需要把调用自己的线程切换(rethread)到主线程里。如果插件管理自己的工作线程,那么它需要负责将返回结果派发回 Platform Thread 以便 Dart 能够安全地处理。总的来说,就是要让与引擎的交互始终都在平台线程里,这是规定。

虽然说长时间阻塞平台线程不会阻塞 Flutter 的渲染管道(rendering pipel

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值