Flutter Engine的核心组件Shell
Shell是Flutter Engine的“中枢神经系统”,包含了多个组件,并继承它们相应的Delegate类。
- 代码地址: github.com/flutter/eng…
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 函数执行流程
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已经关闭且资源已经被回收。
转载自:https://juejin.cn/post/7227062606041841724