上节课我们说到dart虚拟机发送网络请求给flutter的engine,那么我们的dart虚拟机是什么时候启动的呢?也许你还记得console打印的这句话
/opt/flutter/bin/cache/dart-sdk/bin/dart --enable-asserts --pause_isolates_on_start --enable-vm-service:65182 /opt/flutter/packages/flutter_tools/bin/flutter_tools.dart run
Observatory listening on http://127.0.0.1:65182/b0PEzvx66e4=/
我们可以打开vmservice.dart
vmservice.dart
打上断点,运行发现,启动的时候就会走到断点处,由此可见dart.vm确实是在启动时创建,往下走会发现对reloadSources的监听
if (reloadSources != null) {
_peer.registerMethod('reloadSources', (rpc.Parameters params) async {
final String isolateId = params['isolateId'].value as String;
final bool force = params.asMap['force'] as bool ?? false;
final bool pause = params.asMap['pause'] as bool ?? false;
if (isolateId.isEmpty) {
throw rpc.RpcException.invalidParams("Invalid 'isolateId': $isolateId");
}
try {
await reloadSources(isolateId, force: force, pause: pause);
return <String, String>{'type': 'Success'};
} on rpc.RpcException {
rethrow;
} on Exception catch (e, st) {
throw rpc.RpcException(rpc_error_code.SERVER_ERROR,
'Error during Sources Reload: $e\n$st');
}
});
注:
我们在Configurations的Program arguments 输入
run --local-engin-src-path /Users/apple/Desktop/engine/src --local-engine=android_debug_unopt
image.png
这个就是配置flutter工程来调用自定义flutter引擎,我们也可以通过
当然我们以前也用Xcode工程来配过,详见flutter engine开发。
上一节我们最终走到了HttpClientRequest发起一段http请求,这个http请求通过dartVM,最终给了flutter engine。
我们可以打开flutter engine源码
bool IsolateGroupReloadContext::Reload
方法里,大家可以尝试
总结整个热重载流程如下
热重载流程总结
网友评论