获取APP使用的Flutter版本

发现部分应用获取不到,可能有点问题

查看手机中哪些app使用了flutter,可以使用FlutterSharkFlutterEye

若要自己实现,参考获取 APP 所使用的 Flutter 版本

可以解析libapp.so获取snapshot_hash,再根据snapshot_hash得到对应的 Flutter 和 Dart 版本。目前看会有多个 Flutter Dart 版本对应同一个snapshot_hash

解析libapp.so获取snapshot_hash,在查找对应版本 #

libapp.so中查找snapshot魔数0xdcdcf5f5, 4字节,注意字节序(0xf5 0f5 0xdc 0xdc),其后紧跟8字节的length,再其后8字节的kind,再其后32字节即为snapshot_hash

若只需Flutter版本,可直接查询Snapshot hash 与 Flutter 对应关系(表一)。snapshot_hash即为表中的Snapshot version

若再需要Dart版本,再参考Flutter Release(表二)。 从libapp.so中读取到snapshot_hash后,在表一中查找对应的commitcommit在表二中为hash,即可找到对应的dart版本dart_sdk_version

手动生成Flutter``Dart版本与snapshot_hash对应关系表 #

需要clone三个库 flutter, engine, dart ,其中engine库再后续版本中已并入flutter,在生成之前的版本对应关系时才需要。

可以从表二中获取所有flutter版本tag,然后进入flutter库,切换到对应tag:git checkout $tag,在对应tag库中查找对应的dart库。

得到dartsdk)的revision后,进入sdk库,切换到对应revision,进入/tools目录,执行python3 make_version.py --format {{SNAPSHOT_HASH}},得到snapshot_hash,即为libapp.so中读到的值。在一些旧版本中,make_version.py的执行会不一样,需要先echo {{SNAPSHOT_HASH}} > inp,然后python3 make_version.py --input=inp --output=oup,输出文件oup中即为snapshot_hash;在更就一些的版本,需要用python2

小结:

  1. 根据flutter revision获取到dart(sdk) revision,中间可能需要通过engine revision
  2. 根据dart(sdk) revision获取到snapshot hash;即可得到snapshot hashflutter的对应关系表;
  3. libapp.so读取到snapshot hash,在上一步得到的表中查找得到flutter版本号

查找是否包含libapp.so时,不仅要查找通过packageManager.getIntalledPackagespackageMangaer.getInstallApplications得到的List中的apk,还要查找此apk同路径下的所有其他apk,因为Android有Split APK机制,可能会把其他资源文件分开成多个apk。