初始化
FlutterMain.startInitialization()
- 初始化assets路徑拴鸵,這里可以通過metadata自定義產(chǎn)物路徑玷坠。
- 如果vm_snapshot_data蜗搔、vm_snapshot_instr、isolate_snapshot_data八堡、isolate_snapshot_instr這四個(gè)文件在asset根目錄下樟凄,則為AOT方式運(yùn)行,否則為JIT方式運(yùn)行兄渺。
- 異步把所有assets文件復(fù)制到app_flutter目錄下缝龄,這里使用的是AsyncTask。
- 復(fù)制之前會(huì)檢查時(shí)間戳挂谍,檢查的維度是APP的version_code和上次更新時(shí)間叔壤,如果不相等才重新復(fù)制assets。
Activity啟動(dòng)
FlutterMain.ensureInitializationComplete()
-
sResourceExtractor.waitForCompletion()
等待初始化時(shí)復(fù)制assets文件的AsyncTask任務(wù)結(jié)束 - 構(gòu)建參數(shù)口叙,主要是將產(chǎn)物路徑添加到參數(shù)中炼绘,也會(huì)從Activity的Intent中解析一部分參數(shù)。
- 設(shè)置各種路徑妄田,包含緩存俺亮,存儲(chǔ),產(chǎn)物路徑等疟呐。
- 該方法每次啟動(dòng)只調(diào)用一次脚曾。
創(chuàng)建FlutterView以及FlutterNativeView
- 初始化各種channel
- 調(diào)用FlutterNativeView的nativeAttach,在native層會(huì)對(duì)應(yīng)到AndroidShellHolder启具,返回該對(duì)象指針本讥,這里會(huì)創(chuàng)建Engine和Shell。
FlutterView.runFromBundle()
調(diào)用native方法nativeRunBundleAndSnapshotFromLibrary
富纸,可以傳入下面4個(gè)參數(shù)囤踩,它們與native參數(shù)對(duì)應(yīng)如下:
- bundlePath 即assetsPath -> jbundlepath
- entrypoint -> jEntrypoint
- libraryPath -> jLibraryUrl
- snapshotOverride -> jdefaultPath
除此之外還會(huì)傳入AssetManager。
進(jìn)行參數(shù)設(shè)置后晓褪,最終會(huì)調(diào)到engine中的PrepareAndLaunchIsolate
毁菱,最后調(diào)用dart_isolate.cc中的Run
方法啟動(dòng),如果傳入了libraryPath則調(diào)用RunFromLibrary
湖雹,到此之后dart VM就運(yùn)行起來了嗜桌,于是App愉快地進(jìn)入了dart的世界。