Flutter App運行機制
Flutter構建出的APK在運行時會將所有assets目錄下的資源文件解壓到App私有文件目錄中的flutter目錄下,主要包括處理字符編碼的icudtl.dat,還有Debug模式的kernel_blob.bin、platform.dill和Release模式下的4個snapshot文件。默認情況下Flutter在Application.onCreate
時調用FlutterMain.startInitialization
來啟動解壓任務,然后在FlutterActivityDelegate.onCreate
中調用FlutterMain.ensureInitializationComplete
來等待解壓任務結束。
Flutter在Debug模式下使用JIT執行方式,主要是為了支持廣受歡迎的熱刷新功能:
image
觸發熱刷新時Flutter會檢測發生改變的Dart文件,將其同步到App私有緩存目錄下,DartVM加載并且修改對應的類或者方法,重建控件樹后立即可以在設備上看到效果。
在Release模式下Flutter會直接將snapshot文件映射到內存中執行其中的指令:
image
在Release模式下,
FlutterActivityDelegate.onCreate
中調用FlutterMain.ensureInitializationComplete
方法中會將AndroidManifest中設置的snapshot(沒有設置則使用上面提到的默認值)文件名等運行參數設置到對應的C++同名類對象中,構造FlutterNativeView實例時調用nativeAttach來初始化DartVM,運行編譯好的Dart代碼。