热重载工具的启动流程
研究热重载
的价值:更方便对产品进行热更新
,Dart
代码编写完成Flutter.framework
会以亚秒级别的速度进行更新渲染。
热重载原理中已经实现了热重载挂载
,下面我们跟踪flutter_tools源码
来探索热重载
的流程
-
flutter_tools
工程选择模拟器
进行调试
-
flutter_tools
文件添加断点进行调试
,查看args
参数内容
args
参数就是上面Program arguments
中配置的
-
main
函数中对参数做分析,其中有一个非常重要的函数run
- 查看
run
方法以及参数,run
方法是一个异步方法
-
run
方法执行完成,开始执行下一个方法runCommand
runCommand
方法主要是参数的配置
,模拟器、真机等
设备的匹配就是在这个方法中。
-
runCommand
方法中有一个重要方法setupTerminal
,启动我们的终端
- 查看
Running Xcode build...
在什么时候打印?
buildCommands
传入_runBuildWithRetries
方法;flutter_tools
服务端会调起一些指令传递给Xcode
。
- 在源码中查找
控制台打印内容
,控制台所有的打印都在setupTerminal
方法中
- 启动虚拟机
Debugger工具
Flutter
工程启动完成会打开虚拟机
、Debugger调试工具
(用于监听项目)。
热重载底层找到增量文件
setupTerminal
方法中最重要的就是监听listen
,接收命令在_commonTerminalInputHandler
中处理
- 处理
r命令
中调用restart
进行热重载
,restart
方法便是热重载核心入口
断点调试最终执行到run_hot.dart
文件中的restart
方法内。
-
restart
方法内查看与热重载
相关的方法
- 点击进入查看
_hotReloadHelper
回调
- 查看
_reloadSources
源码实现
- 查看
_updateDevFS
增量更新方法源码
做增量渲染
的代码在content.file
文件中,即手机文件中;至此我们就找到了增量文件
。
注意:增量渲染
是以文件为单位,Dart
文件中如果修改注释,也会作为更改文件
进行重新渲染
。
增量文件传输
上面Dart
服务端已经能够获取增量文件
了,那么Dart Sever
端是如何把增量文件
传递给Dart
虚拟机的?
Dart虚拟机
与Dart Serve端
并不在一个地方
-
Dart Serve端
把增量文件
传递给Dart虚拟机
-
vmservice.dart
文件的setUpVmService
方法用来开启虚拟机
刚创建Dart Serve端
的时候也会把虚拟机
也打开。
- 注册虚拟机
执行hot_reload
的时候就会调用Callback
回调。
-
Dart虚拟机
与Dart Serve端
走的是RPC通信
,即点对点的传输协议
底层是Socket
协议
热重载和引擎的联调
之前我们配置Runner项目
与自定义引擎源码
进行了关联,下面我们配置flutter_tools
与自定义引擎源码
进行关联?
-
Program arguments
配置完成之后,直接运行flutter_tools
工程
- 下面使用
Xcode
附加工程,使用Xcode调试
- 打开
flutter_engine
工程
- 进行
断点调试
Flutter
Dart端、引擎端
以及Dart Servc端
进行了关联。
热重载渲染流程
热重载流程图- 标注橙色的
Dart代码
发生修改; -
Dart Sever
服务端会去读取Dart代码
,查看哪些代码发生了更改;以Dart文件
为单位; -
Dart Sever
服务端通过RPC协议
会把更改的Dart代码
给到Dart虚拟机
,虚拟机
在启动的时候就会加载,然后监听回调; -
Dart虚拟机
也是通过RPC协议
最终把更改的Dart代码
给到Flutter.framework渲染引擎
执行Reload
进行重新渲染。
网友评论