Flutter启动流程(2)

1、6FlutterActivityAndFragmentDelegate.onStart调用doInitialFlutterViewRun来初始化Flutter实现的View

2、16DartIsolate::RunFromLibrary获取dart入口函数,使用Dart_GetField获取入口函数,调用InvokeMainEntrypoint执行dart虚拟机。

3、7FlutterActivityAndFragmentDelegate.doInitialFlutterViewRun根据配置寻找dart入口点,主要是dart的文件路径和入口函数。然后将入口信息封装到DartEntrypoint,调用executeDartEntrypoint执行dart。

4、8executeDartEntrypoint调用flutterJNI.runBundleAndSnapshotFromLibrary执行dart入口函数。

5、14RuntimeController::LaunchRootIsolate调用DartIsolate::CreateRunningRootIsolate执行dart虚拟机

6、1MainActivity这个MainActivity什么逻辑都没有,只是继承了FlutterActivity,这个FlutterActivity的源码在Flutterengine的仓库里。我们来看一下Activity的onCreate和onStart里做的事~

7、13Engine::Run调用runtime_controller_->LaunchRootIsolate

8、3FlutterActivity.createFlutterView调用了delegate的onCreateView构造FlutterView

9、5FlutterActivity.onStart调用FlutterActivityAndFragmentDelegate.onStart

10、2FlutterActivity.onCreateonCreate中构造了FlutterActivityAndFragmentDelegate,用于逻辑解耦,逻辑都在这个类里,然后调用onAttach,onAttach里构造了FlutterEngine,FlutterEngine里面包含了FlutterJNI,DartExecutor等,FlutterEngine核心逻辑都是C++写的,这里就是通过JNI绑定Native真实的实现。

11、9FlutterJNI.runBundleAndSnapshotFromLibrary调用native函数,到C++层。

12、17InvokeMainEntrypoint调用DartInvokeField来调用Dart的方法,Dart_LookupLibrary和DartInvokeField都是dartsdk提供的接口。这里之后就到了main.dart进入dart入口。

13、12Shell::RunEngine通过engine->Run调用dart代码,这里RunEngine我们省略了一个重载函数,就是result_callback为null。result_callback是用于dart执行完成之后回调使用的。

14、10RunBundleAndSnapshotFromLibraryjni调用到C++层。

15、15DartIsolate::CreateRunningRootIsolate做了一些检查后,处理和配置了dart虚拟机创建和销毁回调,然后调用RunFromLibrary执行dart。

16、11AndroidShellHolder::Launch将dart入口函数信息封装到BuildRunConfiguration,然后调用RunEngine来执行。

17、4FlutterActivityAndFragmentDelegate.onCreateViewAndroid有两种渲染View,一种是基于TextureView的,一种是基于SurfaceView的,FlutterView继承了FrameLayout,然后会将这里的SurfaceView/TextureView添加到FlutterView中,后续的绘制都是在这个上面,我们来看SurfaceView的流程。onCreate创建完FlutterView之后,我们接着看ActivityonStart的流程。

上一篇:【uniapp3】分享一个自己写的h5日历组件


下一篇:如何实现Win 10录屏?2024年10款录屏软件给你用