获取APP使用的Flutter版本
发现部分应用获取不到,可能有点问题
查看手机中哪些app使用了flutter,可以使用FlutterShark或FlutterEye。
若要自己实现,参考获取 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后,在表一中查找对应的commit,commit在表二中为hash,即可找到对应的dart版本dart_sdk_version。
手动生成Flutter``Dart版本与snapshot_hash对应关系表
#
需要clone三个库 flutter, engine, dart ,其中engine库再后续版本中已并入flutter,在生成之前的版本对应关系时才需要。
可以从表二中获取所有flutter版本tag,然后进入flutter库,切换到对应tag:git checkout $tag,在对应tag库中查找对应的dart库。
- 如果
flutter中有/DEPS,则可通过cat DEPS | grep dart_revision | head -n 1 | awk -F"'" '{print $4}'得到dart(sdk)对应的revision; - 若没有
/DEPS,则通过engine库查找,需先把engine库切换到flutter库中文件/bin/internal/engine.version指定的revision,再在engine的/DEPS中得到dart(sdk)对应的revision。
得到dart(sdk)的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。
小结:
- 根据
flutter revision获取到dart(sdk) revision,中间可能需要通过engine revision; - 根据
dart(sdk) revision获取到snapshot hash;即可得到snapshot hash与flutter的对应关系表; - 从
libapp.so读取到snapshot hash,在上一步得到的表中查找得到flutter版本号
查找是否包含libapp.so时,不仅要查找通过packageManager.getIntalledPackages或packageMangaer.getInstallApplications得到的List中的apk,还要查找此apk同路径下的所有其他apk,因为Android有Split APK机制,可能会把其他资源文件分开成多个apk。