获取 APP 所使用的 Flutter 版本

2023-09-18

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
2
3
4
5
6
7
8
9
10
{
"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"
}

hashflutter 仓库中,3.15.0-15.1.pre 版本所对应的 revision number,我们可以在 github 上 查看 flutter 的 tags:

flutter_tags.png

查看此次的变动:

flutter_commit.png

注意 engine.version 文件的变动,这是 flutter 3.15.0-15.1.pre 版本所对应的 engine 仓库的 revision number。同样的,查看 github 上 engine 仓库的 tags 确认一下:

engine_tags.png

查看此次的变动:

engine_commit.png

只更新了 DEPS 文件中的 dart_revision,及 3.15.0-15.1.pre 版本所对应的 dart sdk 的 revision number。

在 dart 仓库下的 tools 目录下有个 make_version.py 脚本,这个脚本是用来生成 snapshot hash 的。

  1. 先 checkout 到指定的 revision:

    1
    git checkout 4d7636806fcd58a266973da52d39385fdefb254c
  2. 创建 input file 和 output file,input file 的内容为 {{SNAPSHOT_HASH}},output file 为空文件,用于输出 snapshot hash;

  3. 运行 make_version.py 脚本:

    1
    python tools/make_version.py --input=inputFile --output=inputFile
  4. 查看 output file 中的内容,即为 snapshot hash。

3. 总结

  1. 解析 libapp.so 获取到 snapshot hash;
  2. 根据 flutter revision number 获取到对应的 engine revision number;
  3. 根据 engine revision number 获取到 dart revision number;
  4. 根据 dart revision number 获取到 snapshot hash;
  5. 与 libapp.so 的 snapshot hash 匹配是否相等;

4. 项目地址

https://github.com/porum/FlutterLibChecker