Flutter Engine的核心组件Shell

2,702 阅读1分钟

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

image.png

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 函数执行流程

image.png

Shell 创建过程

image.png 从代码中可以看出,在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已经关闭且资源已经被回收。