1. 解析 libapp.so 获取 snapshot hash
0xdcdcf5f5
是 snapshot 的魔数,占 4 字节,
魔数后面紧跟着 8 字节是 length,
再后面 8 字节是 kind,
再后面 32 字节 是 snapshot hash。
2. snapshot hash 和 flutter 版本的对应关系
官方提供了一个 Flutter 各个版本的版本信息:
https://storage.googleapis.com/flutter_infra_release/releases/releases_windows.json https://storage.googleapis.com/flutter_infra_release/releases/releases_linux.json https://storage.googleapis.com/flutter_infra_release/releases/releases_macos.json
我们主要关注 release 中的内容,以 flutter 3.15.0-15.1.pre 版本为例:
1 | { |
hash
为 flutter 仓库中,3.15.0-15.1.pre 版本所对应的 revision number,我们可以在 github 上 查看 flutter 的 tags:
查看此次的变动:
注意 engine.version 文件的变动,这是 flutter 3.15.0-15.1.pre 版本所对应的 engine 仓库的 revision number。同样的,查看 github 上 engine 仓库的 tags 确认一下:
查看此次的变动:
只更新了 DEPS 文件中的 dart_revision,及 3.15.0-15.1.pre 版本所对应的 dart sdk 的 revision number。
在 dart 仓库下的 tools 目录下有个 make_version.py 脚本,这个脚本是用来生成 snapshot hash 的。
先 checkout 到指定的 revision:
1
git checkout 4d7636806fcd58a266973da52d39385fdefb254c
创建 input file 和 output file,input file 的内容为
{{SNAPSHOT_HASH}}
,output file 为空文件,用于输出 snapshot hash;运行 make_version.py 脚本:
1
python tools/make_version.py --input=inputFile --output=inputFile
查看 output file 中的内容,即为 snapshot hash。
3. 总结
- 解析 libapp.so 获取到 snapshot hash;
- 根据 flutter revision number 获取到对应的 engine revision number;
- 根据 engine revision number 获取到 dart revision number;
- 根据 dart revision number 获取到 snapshot hash;
- 与 libapp.so 的 snapshot hash 匹配是否相等;