Shell是Flutter Engine的“中枢神经体系”,包含了多个组件,并承继它们相应的Delegate类。

  • 代码地址: github.com/flutter/eng…

Flutter Engine的核心组件Shell

Shell::Create

当Flutter应用程序启动后,调用 Shell::Create 同步的创立一个shell实例。是体系进入Engine模块的进口函数

  • android_shell_holder.cc 对应Android
  • FlutterEngine.mm 对应iOS/MacOS
  • embedder_engine.cc对应嵌入式
  • engine.cc 对应fuchsia体系
  platform_runner = fml::MessageLoop::GetCurrent().GetTaskRunner();
  raster_runner = thread_host_->raster_thread->GetTaskRunner();
  ui_runner = thread_host_->ui_thread->GetTaskRunner();
  io_runner = thread_host_->io_thread->GetTaskRunner();

Platform、raster、UI、IO线程

Shell管理着四个线程

  • Platform线程
    • APP的主线程
    • 对应MessageLoop: 相似iOS和Android体系中的Runloop, 有工作的时候干工作,没工作的时候休眠。
  • UI 线程: Engine运转与这个线程, 调度帧、推送layer tree用于烘托、请求解压图片并提交到GPU等工作。
  • raster线程
    • 光栅化(Rasterizer), 从Engine(UI)中提交layer tree给GPU制作
  • IO线程

Create 函数履行流程

Flutter Engine的核心组件Shell

Shell 创立过程

Flutter Engine的核心组件Shell
从代码中能够看出,在platform线程中创立了Shell,之后分别在栅格化线程中创立Rasterizer,在platform线程中创立PlatformView,在IO线程中创立ShellIOManager,在UI线程中创立Engine,并将这四者设置到Shell中去。 Shell分别承继了四者的Delegate,四者通过相应的Delegate将事情传递到Shell。

Engine

Engine类是Shell的组成部分之一,运转于UI线程。其主要功用是管理根Isolate和它的运转时。每个Shell只能具有一个Engine实例。Flutter应用的根Isolate会获取“窗口”绑定。通过这些绑定,能够调度帧、推送layer tree用于烘托、请求解压图片并提交到GPU等等。 Engine管理根Isolate的悉数生命周期。当Engine被收回时,其持有者会认为根Isolate已经封闭且资源已经被收回。