snapshot、dill概念理解

1,079 阅读2分钟

在学习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的二进制文件,可以在平台之间迁移。