flutter-elinux启动流程解读

本文详细阐述了如何通过bundle资源路径构造DartProject对象,创建FlutterViewController的ViewProperties,并利用它们构建FlutterWindow。重点讲解了FlutterEngine的初始化过程,包括从DartProject中加载资源,创建TaskRunner,以及与各种插件和平台交互。最后,深入剖析了FlutterWindow的Run方法,涉及事件传递与处理机制。

流程解说

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对象
	
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值