1、Dart历史
2、dart设计基础思想
3、Dart的编译模式
Dart VM 支持五种编译模式:
1, :最常见的 JIT 模式,可以直接在虚拟机中执行 Dart 源码,像解释型语言一样使用。通过执行dart xxx.dart就可以运行,写一些临时脚本,非常方便。
2, Kernel Snapshots: JIT 模式,和 模式不同的是,这种模式执行的是 Kernel AST的二进制数据,这里不包含解析后的类和函数,编译后的代码,所以它们可以在不同的平台之间移植在《Flutter’s Compilation Patterns》(https://proandroiddev.com/flutters-compilation-patterns-24e139d14177) 这篇文章中,将 Kernel Snapshots 称为 Snapshots 也是对的,这应该是之前的叫法,从 dart-lang 的 wiki 中可以看出来:Dart Kernel 是 Dart 程序中的一种中间语言,更多的资料可阅读 Kernel Documentation(https://github.com/dart-lang/sdk/wiki/Kernel-Documentation)。通过执行 dart --snapshot-kind=kernel --snapshot=xx.snapshot xx.dart生成。
3, JIT Application Snapshots:JIT 模式,这里执行的是已经解析过的类和函数,所以它会运行起来会更快。但是这不是平台无关,它只能针对 32 位或者 64 位架构运行。通过执行 dart --snapshot-kind=app-jit --snapshot=xx.snapshot xx.dart生成。
4, AOT Application Snapshots:AOT 模式,在这种模式下,Dart 源码会被提前编译成特定平台的二进制文件。要使用 AOT 模式,需要使用 dart2aot命令, 具体使用为: dart2aot xx.dart xx.dart.aot,然后使用 dartaotruntime命令执行。
5,Native: Datrt2.6以后提供可执行编译模式,dart2native
4、Flutter的编译模式
- Script: 同Dart Script模式一致,虽然Flutter支持,但暂未看到使用,毕竟影响启动速度。
- Script Snapshot: 同Dart Script Snapshot一致,同样支持但未使用,Flutter有大量的视图渲染逻辑,纯JIT模式影响执行速度。
- Kernel Snapshot: Dart的bytecode模式,与Application Snapshot不同,bytecode模式是不区分架构的,Kernel Snapshot在Flutter项目中也叫Core Snapshot。这种模式可以归类为AOT编译。
- Core JIT: Dart的一种二进制模式,将指令代码和heap数据打包成文件,然后在VM和isolate启动时载入,直接标记内存可执行,这是一种AOT模式。Core JIT也被叫做AOTBlob。
- AOT assemblely:即Dart的AOT模式。直接生成汇编源代码文件,由各自平台自行汇编。
-
开发阶段在开发阶段,我们需要Flutter的Hot Reload和Hot restart功能,方便UI快速成型。同时,框架层需要比较高的性能来进行视图渲染展现,因此开发模式下,Flutter使用了Kernel Snapshot模式编译,编译产物有:
isolate_snapshot_data:用于加速 isolate 启动,业务无关代码,固定,仅和 flutter engine版本有关
platform.dill:和 Dart VM 相关的 kernel 代码,仅和 Dart 版本以及 engine编译版本有关。固定,业务无关代码;
vm_snapshot_data: 用于加速 Dart VM 启动的产物,业务无关代码,仅和 flutter engine 版本有关;
kernel_blob.bin:业务代码产物 -
生产阶段
在生产阶段,应用需要的是非常快的速度,所以Android和iOS都选用了AOT打包,不过由于平台特性不同,打包模式还是有很大区别的。Android使用Core JIT编译模式,而iOS则使用AOT Assemblely。
iOS跟Android不同的原因在于:App Store审核条例不允许动态下发可执行二进制代码
Android也可以使用AOT Assemblely,但是这种方式需要支持多架构,增大代码包,而且还需要JNI调用,不如Core JIT的Java API方便,所以Android上默认使用Core JIT打包,而不是AOT Assemblely。
Core JIT 的打包产物有 4 个:isolate_snapshot_data、vm_snapshot_data、isolate_snapshot_instr、vm_snapshot_instr。我们不认识的产物只有 2 个:isolate_snapshot_instr 和 vm_snapshot_instr,其实它俩代表着 VM 和 isolate 启动后所承载的指令等数据。在载入后,直接将该块内存执行即可
6、源码分析前置知识基础
gn ,gni ,python ,C/C++