Flutter 編譯產物的理解
理解 Flutter 編譯產物之前需要理解 Flutter 的編譯模式。 任何語言在執行之前都需要編譯,常見的編譯模式如 JIT 和 AOT。JIT 可以在執行時即時編譯,優勢是可以動態下發和執行程式碼,劣勢也是對應的會影響裝置執行速度。AOT 即提前編譯生成類 C 的二進位制程式碼,優勢是可以較快速度生成和執行平臺程式碼,劣勢就是需要提前知道對應平臺的架構,甚至要為不同平臺架構生成不同的程式碼。
JIT 編譯後產物
Flutter 在程式碼編寫階段(Debug)是採用 JIT 方式編譯程式碼,所有相關的 Dart 程式碼編譯之後打包在 APK 下的 assets 目錄下,是由對應的 libs 目錄下的 .so 庫中虛擬機器執行。
libs 目錄下對應的不同架構平臺的 Flutter 執行虛擬機器;
另外 assets 目錄下 kernel_blob.bin 是 Flutter 引擎的底層介面和 Dart 語言基本功能部分程式碼;
platform.dill 則是實現了 Flutter 頁面邏輯的程式碼,也包括 Flutter Framework 和其他由 pub 依賴的庫程式碼,和 Dart VM 相關的 kernel 程式碼,僅和 Dart 版本以及 engine 編譯版本有關。固定。
AOT 編譯後產物
Flutter 在 Release 模式下關閉了所有除錯資訊和斷言,包的大小都做了優化。
FLutter 在 Release 模式下采用 AOT 模式,solate_snapshot_data、vm_snapshot_data、isolate_snapshot_instr、vm_snapshot_instr。對比 JIT 模式下,不認識的產物有:isolate_snapshot_instr 和 vm_snapshot_instr,其實它倆代表著 VM 和 isolate 啟動後所承載的指令等資料。在載入後,直接將該塊記憶體執行即可;
snapshot 檔案由 Flutter SDK 中的 flutter/bin/cache/artifacts/engine/android-arm-release/darwin-x64/gen_snapshot 命令生成,vmsnapshot* 是 Dart 虛擬機器執行所需要的資料和程式碼指令,isolatesnapshot* 則是每個 isolate 執行所需要的資料和程式碼指令。
理解 Flutter 編譯產物的性質,有助於我們更加方便的整合 Flutter/Dart 執行時或者 Debug 時所需要的依賴到現有 Android / iOS 工程中,從而更加方便的模組化開發。