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

Posted

技术标签:

【中文标题】给定 APK 文件,我如何检测应用程序是不是使用 React Native?【英文标题】:How do I detect if the app uses React Native, given APK file?给定 APK 文件,我如何检测应用程序是否使用 React Native? 【发布时间】:2017-11-02 06:59:40 【问题描述】:

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

【问题讨论】:

为什么不直接使用 dex2jar 反编译 apk 并查看应用程序内部使用的包。 知道这个细节的用例是什么? @suman 好奇心 【参考方案1】:

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

解决方案 1

您可以使用dex2jar。 打开生成的jar文件时,如果有文件夹/com/facebook/react/,可以查看是否使用React Native。

解决方案 2

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

【讨论】:

如果包名被混淆了? com.facebook.react 不会被混淆(正确地保护);否则它将无法被调用/初始化。 react native JS 可以反编译回 JS 吗? @kojow7 cmets 没有问题。随意不回答。 ✅ 提示:Android Studio 可以“分析 APK”,因此您可以在菜单中执行该选项,或者只需将 APK 拖放到其中。然后点击*.dex文件【参考方案2】:

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

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

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

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

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

【讨论】:

我不想更改已接受答案的唯一原因是因为我没有时间亲自检查它(就像我在提出原始问题并从事与它)。 libreactnativejni.so 是做什么的?有些应用程序有那些/com/facebook/react/ 的东西,但没有这个 SO 文件... 共享对象库为 React Native Android 的许多布局功能提供了动力(在幕后它实际上使用了libyoga.so,但其他应用程序也可以在不使用 RN 的情况下包含它)。 com.facebook.react 包的内容不仅仅是 RN 的东西,虽然我自己没有见过这个案例。您有具有该属性的示例应用吗?【参考方案3】:

不确定这是否经过验证。

从商店下载apk到你的电脑,我用APK DownloaderFireFox扩展(如果你还没有应用apk的话)。

使用 Zip 软件打开 apk(我在 Linux 上,所以我使用了 Ark)。 现在您可以看到项目的部分内容了。

转到res->layout 并搜索com_facebook...,在我的例子中是com_facebook_activity_layout.xml。 如果你有一个带有com_facebook 的布局,那么这个 apk 是用 React 创建的。

【讨论】:

【参考方案4】:

最简单的解决方案

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

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

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

【讨论】:

以上是关于给定 APK 文件,我如何检测应用程序是不是使用 React Native?的主要内容,如果未能解决你的问题,请参考以下文章

如何检测 Windows 资源管理器是不是显示给定文件夹?

如何根据 APK 文件获取应用签名时间

如何检测android 文件签名成功(转帖)

简述-gdb检测apk是不是可以被调试

如何使用 Eclipse 压缩 .apk 文件?

如何检测给定类大小的 UIView 是不是存在?