How do I detect if the app uses React Native, given APK file?
I can offer you 2 solutions:
- Solution 1
You can use dex2jar.
When you open the generated jar file, you can check if it uses React Native if there is a folder /com/facebook/react/
.
Solution 2
- Rename your application APK
app.apk
intoapp.zip
- Decompress your zip file
- Use
dexdump
from AndroidSDK
$ANDROID_HOME/build-tools//dexdump:
dexdump classes.dex` - Search for
com/facebook/react
in the output of dexdump
- Rename your application APK
The accepted solution certainly will get you the right answer, but it will be quite slow. It is what I did originally, and it was not fast enough for my needs since I was running this script across hundreds of APKs. I developed an alternate solution and executed it before the original made it through 5% of the APKs.
The reason I don't like checking for layouts having com_facebook in the name (the other pre-existing solution) is that it is entirely plausible for an app to be using another Facebook SDK that contains a layout file starting with that string. I don't know of any false positives, but it seemed reasonably likely that there would be some.
Instead I check for the presence of libreactnativejni.so
which I have to imagine only gets used if React Native is being used. (I originally was looking for libyoga.so, but I had a few false positives, I think because there's a logging library by the same name.)
Specifically, this condition on a Mac in a bash script is what I'm using (I think it's portable, but have not tested):
if [ "$(unzip -l $apkfile | grep libreactnativejni.so | wc -l)" -gt "0" ]
then
echo "Uses RN"
fi