snapshot、dill概念理解
在学习flutter过程中,遇到一些snapshot、dill文件,不知道它们是什么,是做什么的。其实它们是一种dart的编译产物。而snapshot和dill在一些情况下是同一个东西。
dart产物类型
- exe:可执行文件,自带了精简版的Dart运行环境
- aot-snapshot:一种特定架构的文件,没有dart运行环境
- jit-snapshot:一种特定架构的文件。它里面是在程序运行期间生成的已解析的类和已编译的代码
- kernel snapshot:可移植的二进制快照
- js:可部署的JavaScript文件
exe(独立可执行文件 self-contained executables)
exe独立可执行文件,可以在Windows、MacOS或Linux上单独运行。是由指定的dart文件及其依赖编译而成。它里面带有小型的dart运行环境,可以用来处理类型检查和垃圾回收。
编译:
dart2native hello.dart
运行:
➜ dartTest ./hello.exe
hello world
上面运行的时候不需要dart命令,由此也可以知道它是独立的可执行文件,内部有dart运行环境。
最新的编译命令:替换了dart2native命令
dart compile exe hello.dart
aot-snapshot
使用AOT snapshots可以减少磁盘空间。它是一种指定当前框架的产物。即:如果你使用macos创建的.aot文件,那么你只能运行在macOS上。
编译:
dart2native hello.dart -k aot
运行:运行时需要使用dartatoruntime命令
➜ dartTest dartaotruntime hello.aot
hello world
最新的编译命令:
dart compile aot-snapshot hello.dart
jit-snapshot
JIT snapshot中有所有的解析类和编译的代码(在程序运行的时候生成的),当运行jit-snapshot时,dart虚拟机不需要再去解析和编译类,因此VM可以运行的更快。
编译:
dart --snapshot-kind=app-jit --snapshot=helloJit.dart.snapshot hello.dart
运行:
➜ dartTest dart helloJit.dart.snapshot
hello world
最新的编译命令:
dart compile jit-snapshot ./hello.dart
kernel snapshot
kernal snapshot是单个可移植文件,能运行在所有的操作系统和CPU架构上。kernel snapshot包含了dart程序的抽象语法树(AST)的二进制形式
编译:默认不指定kind,就是kernel类型
dart --snapshot-kind=kernel --snapshot=hello1.dart.snapshot hello.dart
运行:
➜ dartTest dart hello1.dart.snapshot
hello world
最新命令:
dart compile kernel ./hello.dart
查看其生成的文件:hello.dill。由此我们可知dill文件就是snapshot类型为kernel的文件。它们是一个东西
产物大小比较
-rw-r--r-- 1 laomao staff 1007072 May 13 14:05 hello.aot
-rw-r--r-- 1 laomao staff 31 May 12 17:54 hello.dart
-rw-r--r-- 1 laomao staff 568 May 13 14:35 hello.dill
-rwxr-xr-x 1 laomao staff 7269472 May 13 11:57 hello.exe
-rw-r--r-- 1 laomao staff 3958304 May 13 14:27 hello.jit
可以得出:exe > jit-snapshot > aot-snapshot > kernel > dart source code
exe中有dart运行环境所以很大,jit-snapshot和aot-snapshot是特定架构文件,kernel是AST的二进制文件,可以在平台之间迁移。