给定 APK 文件,如何检测应用程序是否使用 React Native?

How do I detect if the app uses React Native, given APK file?

我从GooglePlay下载了APK文件,想知道应用程序的开发是否使用了React Native库。什么是快速稳定的方法呢? (如果它是我以后可以自动化的东西会更好 - 但这种自动化本身超出了这个问题的范围。)

我可以为您提供 2 种解决方案:

  • 解决方案 1

您可以使用 dex2jar。 打开生成的jar文件,如果有文件夹/com/facebook/react/.

,可以查看是否使用了React Native
  • 解决方案 2

    1. 将您的应用程序 APK app.apk 重命名为 app.zip
    2. 解压缩您的 zip 文件
    3. 使用 dexdump 来自 AndroidSDK$ANDROID_HOME/build-tools//dexdump:dexdump classes.dex`
    4. 在 dexdump
    5. 的输出中搜索 com/facebook/react

Not sure if this proven way.

从商店将 apk 下载到您的 PC,我使用了 APK Downloader FireFox 扩展(如果您还没有应用 apk)。

用Zip软件打开apk(我在Linux所以用的是方舟)。 现在您可以看到项目的部分内容。

转到 res->layout 并搜索 com_facebook...,在我的例子中是 com_facebook_activity_layout.xml。 如果您的布局中包含 com_facebook,则此 apk 是使用 React 创建的。

接受的解决方案肯定会给您正确的答案,但速度会很慢。这是我最初所做的,它的速度不足以满足我的需求,因为我 运行 这个脚本跨越了数百个 APK。我开发了一个替代解决方案并在原始解决方案通过 5% 的 APK 之前执行了它。

我不喜欢检查名称中有 com_facebook 的布局(另一个预先存在的解决方案)的原因是,应用程序完全有可能使用另一个包含以该字符串开头的布局文件。我不知道有没有误报,但似乎很可能会有一些。

相反,我检查 libreactnativejni.so 是否存在,我不得不想象只有在使用 React Native 时才会使用它。 (我最初是在寻找 libyoga.so,但我有一些误报,我想是因为有一个同名的日志库。)

具体来说,我正在使用 bash 脚本中 Mac 的条件(我认为它是可移植的,但尚未测试):

if [ "$(unzip -l $apkfile | grep libreactnativejni.so | wc -l)" -gt "0" ]
then 
echo "Uses RN"
fi

最简单的解决方案

Android Studio中打开APK 并检查 classes.dex 文件(可以是多个文件)。 您正在寻找的是:

  • React Native - 你找到文件夹 com\facebook\react 了吗?
  • Flutter - 你找到文件夹 io\flutter 了吗?
  • Xamarin - 找到文件夹 com\xamarin\ 了吗?

在 Android Studio 中可能看起来像这样