初始化
FlutterMain.startInitialization()
- 初始化assets路径,这里可以通过metadata自定义产物路径。
- 如果vm_snapshot_data、vm_snapshot_instr、isolate_snapshot_data、isolate_snapshot_instr这四个文件在asset根目录下,则为AOT方式运行,否则为JIT方式运行。
- 异步把所有assets文件复制到app_flutter目录下,这里使用的是AsyncTask。
- 复制之前会检查时间戳,检查的维度是APP的version_code和上次更新时间,如果不相等才重新复制assets。
Activity启动
FlutterMain.ensureInitializationComplete()
-
sResourceExtractor.waitForCompletion()
等待初始化时复制assets文件的AsyncTask任务结束 - 构建参数,主要是将产物路径添加到参数中,也会从Activity的Intent中解析一部分参数。
- 设置各种路径,包含缓存,存储,产物路径等。
- 该方法每次启动只调用一次。
创建FlutterView以及FlutterNativeView
- 初始化各种channel
- 调用FlutterNativeView的nativeAttach,在native层会对应到AndroidShellHolder,返回该对象指针,这里会创建Engine和Shell。
FlutterView.runFromBundle()
调用native方法nativeRunBundleAndSnapshotFromLibrary
,可以传入下面4个参数,它们与native参数对应如下:
- bundlePath 即assetsPath -> jbundlepath
- entrypoint -> jEntrypoint
- libraryPath -> jLibraryUrl
- snapshotOverride -> jdefaultPath
除此之外还会传入AssetManager。
进行参数设置后,最终会调到engine中的PrepareAndLaunchIsolate
,最后调用dart_isolate.cc中的Run
方法启动,如果传入了libraryPath则调用RunFromLibrary
,到此之后dart VM就运行起来了,于是App愉快地进入了dart的世界。