阅读 727

Flutter 编译原理

编译模式介绍

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编译模式

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 :资源文件

iOS产物 App.framework

Flutter相关代码的最终产物是:App.framework(dart代码生成)和Flutter.framework(引擎)。

关注下面的标签,发现更多相似文章
评论