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

    原文作者:超丶赛亚叼
    原文地址: https://www.jianshu.com/p/d342da0b5430
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞