Flutter安卓Java层初始化源码分析

初始化

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的世界。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容