Flutter的架构分为框架、引擎和嵌入器层(Embedder),其中嵌入器层将Flutter嵌入各个平台。Flutter完整的架构图如下:
Flutter中的隔离是通过引擎层的一个线程来实现的,但是Flutter引擎线程的创建与管理又是由嵌入器负责的,也就是说嵌入器是平台引擎移植的中间代码。Flutter的引擎的运行架构图如下:
嵌入器中存在4个Runner,每个引擎各自对应一个UI Task Runner、GPU Task Runner、IO Task Runner,但是所有引擎共享一个Platform Runner.
- Platform Task Runner
Platform Task Runner 是 Flutter引擎的主Task Runner,因为平台的API只能在主线程中被调用,所以它对应Android上的主线程。Platform Task Runner 不仅可以处理Native平台的交互,还能与Flutter引擎交互。在创建每一个Flutter引擎的时候,都会创建一个Platform线程,供Platform Task Runner使用,即使Platform线程阻塞,也不会直接导致Flutter应用的卡顿。即便如此,也不建议在Platform Task Runner中执行耗时的操作,长时间卡住还是有可能会被系统强制杀死的。 - UI Task Runner
UI Task Runner 主要处理来自Dart Root isolate的代码、告诉Flutter引擎最终的渲染、Native Plugins的消息、timers(延时任务)、microtasks(微任务)以及异步的I/O操作、file handles等。 - GPU Task Runner
GPU Task Runner被用于执行与设备GPU相关的调用。GPU Task Runner运行的线程对应平台的子线程,并且和UI Task Runner运行在不同的线程上。如果GPU Task Runner耗时太久,同样会造成Flutter应用的卡顿。所以在GPU Task Runner中,不能执行耗时操作。 - IO Task Runner
IO Task Runner运行的线程也是对应平台的子线程。在Flutter开发中,当UI Task Runner和GPU Task Runner都出现过载时,就需要使用IO Task Runner执行一些预处理的读取操作,再上报给GPU Task Runner。因为只有GPU Task Runner才能接触到GPU,所以IO Task Runner相当于GPU Task Runner的助手。