在 mac 上反编译 APK --- 快速可行的流程(含命令与工具)
可以的,mac 完全可以反编译 APK 来查看源码与资源。常用流程是:把 APK 解包读取资源(apktool) + 反编译 dex 为 Java 源码(jadx / dex2jar + jd-gui) 。下面给出推荐工具、安装命令、具体步骤、注意事项与常见问题处理办法。
推荐工具(都可用 Homebrew 安装)
- jadx --- dex → Java 的反编译器,带 GUI,很方便直接浏览源码与资源。GitHub+1
- apktool --- 解码资源(AndroidManifest.xml、res/、smali 等),也支持重打包。apktool.org
- dex2jar(可选)--- 把 classes.dex 转成 jar,再用 JD-GUI 或其它 Java 反编译器查看。
安装(Terminal):
bash
# 如果没安装 Homebrew,请先安装 Homebrew(官网命令)
# 安装工具
brew install jadx
brew install apktool
brew install dex2jar
(Homebrew 上有这些公式,安装后会把命令放到 PATH 中)。
常见反编译工作流(最简单 --- 直接看源码)
-
在 Finder / Terminal 把
your-app.apk
放到某目录。 -
用 jadx GUI 直接打开 APK(最快):
jadx-gui your-app.apk
GUI 会显示包结构、Java 源、资源文件,适合大多数查看场景。GitHub
进阶(分开看资源与字节码)
-
用 apktool 解码资源与 smali(可以看到原始 AndroidManifest、资源 xml):
bashapktool d your-app.apk -o app_decoded # 结果在 app_decoded/ 包含 AndroidManifest.xml、res/、smali/ 等
apktool 对资源恢复更好,适合查看布局、string、manifest、以及做修改后重打包。apktool.org
-
用 jadx 命令行输出 Java 源到目录(或用 GUI 导出):
arduinojadx -d jadx_out your-app.apk # 或直接在 GUI 里 File → Save all
-
可选:用 dex2jar + JD-GUI(若你想用其他 Java 反编译器):
bash# 把 apk 解开,拿到 classes.dex(或直接使用 dex2jar on apk) d2j-dex2jar.sh your-app.apk -o classes-dex2jar.jar # 然后用 jd-gui 打开 classes-dex2jar.jar(或用其他反编译器)
如果想重打包 / 修改并安装回设备
-
修改完
apktool d
得到的目录后重建:cssapktool b app_decoded -o modified.apk
-
需要用
apksigner
或jarsigner
给 APK 签名,然后用adb install
安装。注意:如果原来是签名保护、或使用 Google Play 签名,替换签名可能导致安装失败或服务端校验失败。
常见问题与注意事项
- 混淆/脱壳:ProGuard/R8 混淆会把类/方法名改成短名(a, b...),反编译出来可读性差;某些应用还会通过壳/加固(如壳加密、Native 加载 dex)增加反编译难度。
- Kotlin 项目:jadx 能反编译 Kotlin,但结果可能不如 Java 原始源码整洁;部分 Kotlin 语法或 lambda 会反编译得比较"低级"。
- 不是 100% 原始源码:反编译得到的是"近似源码",注释和原始变量名通常丢失(除非未混淆)。
- 合法性:反编译他人应用可能涉及版权/服务条款问题。请只对你有权查看或自己发布的 APK 进行逆向,或在合法授权范围内操作。
- 资源恢复 :如果你只想看布局/strings/manifest,
apktool d
往往比 jadx 更准确(APK 中的二进制 XML 会被正确转换)。apktool.org
快速 Troubleshooting(常见命令回顾)
-
打开 GUI(jadx):
swiftjadx-gui some.apk
-
命令行导出 Java 源:
swiftjadx -d out_dir some.apk
-
解码资源(apktool):
swiftapktool d some.apk -o decoded
-
dex2jar 转 jar(若 brew 安装了 dex2jar):
csharpd2j-dex2jar.sh some.apk -o out.jar # 然后用 jd-gui(或 IntelliJ 的 FernFlower/Bytecode Viewer)打开 out.jar