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 版本为例:
{
"hash": "b2ec15bfa37e6ecdc1f68e7dc6960422648fc6d6",
"channel": "beta",
"version": "3.15.0-15.1.pre",
"dart_sdk_version": "3.2.0 (build 3.2.0-134.1.beta)",
"dart_sdk_arch": "x64",
"release_date": "2023-09-15T17:00:54.507285Z",
"archive": "beta/linux/flutter_linux_3.15.0-15.1.pre-beta.tar.xz",
"sha256": "6fc2503bc70b69d7d063dc27216c0d24da5b31886ff9654a9fa0d28bc50190f8"
}
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:
git checkout 4d7636806fcd58a266973da52d39385fdefb254c
-
创建 input file 和 output file,input file 的内容为
{{SNAPSHOT_HASH}}
,output file 为空文件,用于输出 snapshot hash; -
运行 make_version.py 脚本:
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 匹配是否相等;
4. 项目地址:
https://github.com/porum/FlutterLibChecker