流程解说
1. 使用bundle资源路径构造flutter::DartProject对象
1.1 bundle资源路径下需要 /data/flutter_assets,/data/icudtl.dat,/lib/libapp.so
1.1.1 icudtl.dat 由FlutterTool提供,作为资源使用
1.1.2 flutter_assets 由FlutterTool构建
1.1.3 libapp.so 由FlutterTool构建,用于aot构建
1.2 DartProject是官方的类,构造中仅保存三个文件路径
2. 创建flutter::FlutterViewController::ViewProperties对象,填充宽高,旋转角度,是否有光标等参数
3. 使用flutter::FlutterViewController::ViewProperties对象和flutter::DartProject对象构建FlutterWindow对象
3.1 FlutterWindow对象应该就是自定义的
4. 调用FlutterWindow::OnCreate()方法启动引擎
4.1 使用flutter::FlutterViewController::ViewProperties对象
和flutter::DartProject对象构造flutter::FlutterViewController对象
4.1.1 构造中会使用flutter::DartProject对象构造flutter::FlutterEngine对象
4.1.1.1 构造中会从DartProject中取出argc,argv,以及三资源的路径初始化FlutterDesktopEngineProperties
4.1.1.2 构造中会使用FlutterDesktopEngineProperties构造FlutterProjectBundle对象
4.1.1.3 构造中会创建一个TaskRunner对象(用于执行任务), 运行时会检测engine是否为空,
不为空则会调用flutter API接口运行task(engine为FlutterEngine(添加符号是为了以后拓展),此时还未初始化)
task_runner_ = std::make_unique<TaskRunner>(
std::this_thread::get_id(), embedder_api_.GetCurrentTime,
[this](const auto* task) {
if (!engine_) {
ELINUX_LOG(ERROR)
<< "Cannot post an engine task when engine is not running.";
return;
}
if (embedder_api_.RunTask(engine_, task) != kSuccess) {
ELINUX_LOG(ERROR) << "Failed to post an engine task.";
}
});
4.1.1.3 构造中会使用FlutterProjectBundle对象构造FlutterELinuxEngine对象
4.1.1.3.1 构造中初始化FlutterEngineProcTable对象(内含Flutter操作API)
4.1.1.3.2 构造中构造FlutterDesktopMessenger对象,并使用FlutterELinuxEngine初始化engine成员
4.1.1.3.3 构造中创建FlutterDesktopPluginRegistrar对象,并使用FlutterELinuxEngine初始化engine成员
4.1.1.3.4 构造中使用FlutterDesktopMessenger对象构造BinaryMessengerImpl对象
4.1.1.3.5 构造中使用FlutterDesktopMessenger对象构造IncomingMessageDispatcherImpl对象
4.1.1.3.6 构造中使用FlutterELinuxEngine对象构造FlutterELinuxTextureRegistrar对象
4.1.1.3.7 构造中使用FlutterDesktopMessager对象,JsonMessageCodec单例json解码器构建BasicMessageChannel对象
该消息通道的name为:"flutter/settings"
4.1.1.3.8 构造中创建一个VsyncWaiter对象(通过该对象向flutter发送vsync事件)
4.1.1.4 构造中会强制将FlutterELinuxEngine转化为FlutterDesktopEngine对象(实际就是个void*, 无法操作),
并返回,目的是避免别人操作该对象,去掉类属性
4.1.1.5 构造中会使用FlutterELinuxEngine对象中的FlutterDesktopMessenger对象构造BinaryMessengerImpl对象