反编译查看源码

在 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 中)。

常见反编译工作流(最简单 --- 直接看源码)

  1. 在 Finder / Terminal 把 your-app.apk 放到某目录。

  2. jadx GUI 直接打开 APK(最快):

    复制代码
    jadx-gui your-app.apk

    GUI 会显示包结构、Java 源、资源文件,适合大多数查看场景。GitHub


进阶(分开看资源与字节码)

  1. 用 apktool 解码资源与 smali(可以看到原始 AndroidManifest、资源 xml):

    bash 复制代码
    apktool d your-app.apk -o app_decoded
    # 结果在 app_decoded/ 包含 AndroidManifest.xml、res/、smali/ 等

    apktool 对资源恢复更好,适合查看布局、string、manifest、以及做修改后重打包。apktool.org

  2. 用 jadx 命令行输出 Java 源到目录(或用 GUI 导出):

    arduino 复制代码
    jadx -d jadx_out your-app.apk
    # 或直接在 GUI 里 File → Save all
  3. 可选:用 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(或用其他反编译器)

如果想重打包 / 修改并安装回设备

  1. 修改完 apktool d 得到的目录后重建:

    css 复制代码
    apktool b app_decoded -o modified.apk
  2. 需要用 apksignerjarsigner 给 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):

    swift 复制代码
    jadx-gui some.apk
  • 命令行导出 Java 源:

    swift 复制代码
    jadx -d out_dir some.apk
  • 解码资源(apktool):

    swift 复制代码
    apktool d some.apk -o decoded
  • dex2jar 转 jar(若 brew 安装了 dex2jar):

    csharp 复制代码
    d2j-dex2jar.sh some.apk -o out.jar
    # 然后用 jd-gui(或 IntelliJ 的 FernFlower/Bytecode Viewer)打开 out.jar
相关推荐
leobertlan12 小时前
【好玩系列】训练一个神经网络指导小孩玩游戏
android·机器学习·程序员
Android-Flutter12 小时前
android LeakCanary 工作原理 详解
android·kotlin
AFinalStone13 小时前
Android 7系统无障碍服务(一)全景图与架构概览
android·无障碍服务
Android-Flutter13 小时前
android 自定义view 详解
android·kotlin
WAsbry14 小时前
协程任务的失败控制:取消、异常传播与Supervisor
android
Android打工仔14 小时前
从 finally 理解程序的控制流:它为什么不是 catch 后面的代码?
android·kotlin
随遇丿而安14 小时前
第15周:Service 全功能 + 后台优化
android
YXL1111YXL14 小时前
续体和状态机 —— suspend 函数的 CPS 变换
android·kotlin
WAsbry14 小时前
Flow数据模型:冷流、状态、事件与共享策略
android
WAsbry14 小时前
深入理解 Kotlin suspend:挂起语义、状态机与恢复调度
android