无法反编译React Native安卓APK提取bundle.js及项目文件如何解决
解决方案
为什么没有找到index.android.bundle
React Native打包时支持自定义bundle的输出文件名和路径,并非所有APK的JS bundle都固定命名为index.android.bundle,你在app目录下找到的bundle.js就是你需要的打包后JS产物,无需纠结文件名差异。
解包失败的排查与处理
首先确认bundle.js的文件类型,不同类型对应不同处理方案:
情况1:bundle是Hermes引擎编译的字节码
目前新版本React Native默认开启Hermes引擎,打包后生成的是Hermes字节码文件,而非纯JS代码,直接用debundle处理必然失败,判断和处理方式如下:
- 用文本编辑器打开bundle.js,若前几行出现乱码或Hermes相关标识,即可确认是字节码文件
- 先找到与APK打包时匹配版本的hermes工具包,使用其中的hbc-disasm工具将字节码反编译为可读JS代码后,再进行后续解包操作
情况2:bundle是普通metro打包的纯JS代码
如果打开bundle.js可看到以__d(开头的模块化代码,说明是标准metro打包产物,debundle失败是因为该工具已停止维护,对0.60以上版本的RN打包格式适配性差,可按以下步骤处理:
- 优先使用维护更活跃的react-native-decompiler工具
- 安装命令:
npm install -g react-native-decompiler - 解包命令:
react-native-decompiler ./bundle.js ./output-folder - 解包完成后可在output-folder中得到拆分后的所有JS模块文件
- 安装命令:
- 若仍解包失败,可先通过正则提取bundle内的模块ID与代码映射,再手动整理依赖关系
关于完整项目结构和package.json的说明
APK打包后不会保留原始项目的目录结构和package.json文件:
- JS部分的原始目录结构不会被打包产物携带,只能通过解包后的模块依赖关系手动重构
- 第三方依赖的版本需要你基于解包后的代码逻辑逆向推导,无法直接得到原始package.json
- 若bundle文件被开发者做了二次加密,还需要先逆向APK原生层找到解密逻辑,对bundle完成解密后才能正常解包
内容的提问来源于stack exchange,提问作者Sonny49
相关产品推荐
相关产品推荐

