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已经封闭且资源已经被收回。