Flutter 編譯原理

九天星辰發表於2019-09-06

編譯模式介紹

JIT JIT(Just In Time) 翻譯為 即時編譯,指的是在程式執行中,將熱點程式碼編譯成機器碼,提高執行效率。常見例子有 V8 引擎和 JVM,JIT 可以充分利用解釋型語言的優點,動態執行原始碼,而不用考慮平臺差異性。這裡需要注意的是,對於 JVM 來說,原始碼指位元組碼,而不是 Java 原始碼。

AOT AOT(Ahead Of Time) 稱為 執行前編譯,指的是在程式執行之前,已經編譯成對應平臺的機器碼,不需要在執行中解釋編譯,就可以直接執行。常見例子有 C 和 C++。 雖然,我們會區別 JIT 和 AOT 兩種編譯模式,但實際上,有很多語言並不是完全使用 JIT 或者 AOT 的,通常它們會混用這兩種模式,來達到最大的效能優化。

Dart編譯模式

Script:最普通的 JIT模式,在 PC命令列呼叫 dart vm執行 dart原始碼檔案即是這種模式。

Script Snapshot:JIT模式,和上一個不同的是,這裡載入的是已經 token化的 dart原始碼,提前執行了上一步的 lexer步驟。

Application Snapshot:JIT模式,這種模式來源於 dart vm直接載入原始碼後 dump出資料。dart vm通過這種資料啟動會更快。不過值得一提的是這種模式是區分架構的,在 x64上生成的資料不可以給 arm使用。

AOT:AOT模式,直接將 dart原始碼編譯出 .S檔案,然後通過彙編器生成對應架構的程式碼。

Flutter 編譯原理

Flutter編譯模式

Script:同 Dart Script模式一致,雖然 Flutter支援,但暫未看到使用,畢竟影響啟動速度。

Kernel Snapshot:Dart的 bytecode 模式,bytecode模式是不區分架構的。Kernel Snapshot在 Flutter專案內也叫 Core Snapshot。bytecode模式可以歸類為 AOT編譯。

Core JIT:Dart的一種二進位制模式,將指令程式碼和 heap資料打包成檔案,然後在 vm和 isolate啟動時載入,直接標記記憶體可執行,可以說這是一種 AOT模式。Core JIT也被叫做 AOTBlob

AOT Assembly: 即 Dart的 AOT模式。直接生成彙編原始碼檔案,由各平臺自行彙編。包體積比較大,區分架構。

開發階段

Android : Kernel Snapshot模式

iOS : Kernel Snapshot模式

生產階段

Android : Core JIT

iOS : AOT Assembly

Flutter 打包編譯

flutter build apk
flutter build apk --debug
flutter build ios
flutter build ios —debug

Usage: flutter build <subcommand> [arguments]
-h, --help    Print this usage information.
Available subcommands:
  aot         Build an ahead-of-time compiled snapshot of your app's Dart code.
  apk         Build an Android APK file from your app.
  appbundle   Build an Android App Bundle file from your app.
  bundle      Build the Flutter assets directory from your app.
  ios         Build an iOS application bundle (Mac OS X host only).
複製程式碼

編譯產物

Android產物就是build/app/intermediates/flutter/XXX下面的flutter_assets/目錄中的所有內容。如果是release或者profile版本的話,還包含Dart的二進位制產物app.so或者***snapshot***。可以看到,除了預設情況的***snapshot***,我們還可以指定Dart產物為常規的so庫形式。

isolate_snapshot_data :用於加速 isolate啟動,業務無關程式碼,固定,僅和 flutter engine版本有關

vm_snapshot_data :用於加速 dart vm啟動的產物,業務無關程式碼,僅和 flutter engine版本有關

kernel_blob.bin :JIT模式下Dart編譯的中間程式碼

flutter.so :Flutter引擎

assets :資原始檔

Flutter 編譯原理

Flutter 編譯原理

Flutter 編譯原理

iOS產物 App.framework

Flutter相關程式碼的最終產物是:App.framework(dart程式碼生成)和Flutter.framework(引擎)。

Flutter 編譯原理

相關文章