JADX MCP 配置教程:用 Claude Code 和 REA 反编译 APK
本页目录
REA(morluto 的开源项目)可以把一个无头(headless)JADX 反编译器挂到 coding agent 的 MCP 连接后面。不用打开 jadx-gui,也不用常驻插件:agent 针对某个 APK 提问,REA 在私有工作目录里启动 JADX,返回的结果是绑定了 APK SHA-256 的 Evidence。
本文只讲 MCP 配置:Java 要求、JADX JAR、环境变量在 Claude Code 和 Codex 里写在哪、怎么向 agent 提问、常见报错是什么意思。完整的 Android 静态分析流程(Apktool 解码资源、ADB 拉包、Flutter 判定)见姊妹篇 用 REA 分析 Android APK。
适合谁读: 已经在用 Claude Code 或 Codex,想让 agent 直接读 APK 反编译代码的开发者。
你会学到:
- REA 6.4.0 接受哪些 Java 和 JADX 版本,它是怎么检查的
- 怎样把
REA_JADX_MCP_JAR加到 Claude Code 和 Codex 的 REA 服务配置里 - agent 能用到的 5 个 MCP 工具,以及怎么提问效果好
- 缺东西时 REA 返回的错误信息该怎么读
示例目标: F-Droid 客户端 的 APK(GPL-3.0,源码在 gitlab.com/fdroid/fdroidclient)。它是开源的,所有结论都能和源码对照。
REA 的 JADX 方案由哪几部分组成
一共三样东西,REA 一样都不替你装:
- 完整的 JDK,版本 17 或更高。 REA 启动时要从源码编译一个小的 Java「元数据桥」,需要
jdk.compiler模块,JRE 里没有。 - jadx-headless-mcp 0.7.1,即 v0.7.1 release 里的
-all.jar。REA 6.4.0 锁定了这个版本,审计过的 JAR 的 SHA-256 是6e5eacf500b64292bfb73c49797c1958f6ee44646e43e868039ae7feb573ff75。 - REA 6.4.0,用
npx rea-agents setup注册到你的 agent(见 安装指南)。
每次调用 JADX 工具时,REA 会依次检查宿主平台、解析 JAR 和 java 的位置、执行 java --list-modules、读取 JAR 的 ZIP 目录确认桥接需要的类都在。任何一步不通过,都会返回具体的 capability_unavailable 错误,JADX 根本不会启动。
和 jadx-ai-mcp 有什么不同
另一个常见方案 jadx-ai-mcp 是 JADX 图形界面的插件,配合一个单独的 Python MCP 服务器使用:你先在 jadx-gui 里打开 APK,agent 读取 GUI 当前加载的内容。如果你想边点边看、和 agent 结对分析,它很合适。
REA 走的是无头路线:
| REA + jadx-headless-mcp | jadx-ai-mcp | |
|---|---|---|
| 是否需要 GUI | 不需要 | 需要 jadx-gui 和插件 |
| 怎么指定 APK | 每次调用都带 APK 路径 | GUI 里当前打开的那个 |
| 输出 | 带 APK 和引擎 JAR 摘要的 Evidence | 插件的返回内容 |
| 同一个服务还能分析什么 | 原生、JavaScript、.NET、网页、固件 | 只有 Android |
想要可复现、可脚本化、在 CI 或纯 rea 命令行里也能跑的结果,选 REA;想要交互式结对,选 GUI 插件。
前置条件
- REA 6.4.0,已接入 Claude Code 或 Codex。
- Linux、macOS 或 Windows x64。其他宿主(例如 Windows arm64)在 6.4.0 里会被
unsupported_host拒绝。Windows x64 上,REA 用安装包自带的 Windows 原生组件接管 Java 的标准输入输出,这条路径是为 issue #1262 加的。 - 自行安装好的 JDK 17+ 和 jadx-headless-mcp 0.7.1 JAR。
- 一个你有权分析的 APK。本文用开源应用。
第 1 步:安装并检查 JDK
装任意一个完整 JDK 17+(Temurin、Zulu 或发行版自带的 OpenJDK 都行),然后确认 REA 要找的两个模块:
java --list-modules | grep -E '^(java\.base|jdk\.compiler)@'
为什么: REA 内部执行的就是 java --list-modules,要求输出里有 jdk.compiler,并且 java.base@ 的主版本号不低于 17。没有 jdk.compiler 就说明你装的是 JRE。
装了多个 Java 时,用 JAVA_HOME 固定一个。它必须是绝对路径,REA 会使用 $JAVA_HOME/bin/java(Windows 上是 java.exe)。不设 JAVA_HOME 时,REA 用 PATH 里的 java。
第 2 步:下载并校验 JADX JAR
从 release 页面下载 jadx-headless-mcp-0.7.1-all.jar,核对摘要:
shasum -a 256 jadx-headless-mcp-0.7.1-all.jar
# Windows PowerShell: Get-FileHash .\jadx-headless-mcp-0.7.1-all.jar -Algorithm SHA256
和 6e5eacf500b64292bfb73c49797c1958f6ee44646e43e868039ae7feb573ff75 对比。
为什么: REA 会把实际 JAR 的摘要写进每一条 Evidence,只有字节和审计版本一致时,才会填上上游源码的 revision。一定要用 -all 版:REA 会检查 JAR 里是否包含 jadx-headless-mcp 的会话类、JADX 的 JadxDecompiler、Gson 和 Kotlin MCP SDK 的 Server 类。普通的 JADX 发行包或不带依赖的瘦 JAR 都过不了这一关。
把 JAR 放在固定位置,比如 ~/tools/jadx/,后面都用绝对路径引用。
第 3 步:先在命令行里跑一次
改 agent 配置之前,先在终端确认各组件能用。从 f-droid.org 下载 F-Droid 的 APK,记下哈希,然后执行:
export REA_JADX_MCP_JAR="$HOME/tools/jadx/jadx-headless-mcp-0.7.1-all.jar"
export JAVA_HOME=/absolute/path/to/jdk-21 # optional
shasum -a 256 /absolute/path/F-Droid.apk
rea inspect-android-package /absolute/path/F-Droid.apk --json
为什么: CLI 和 MCP 服务走的是同一套流程。这里能跑通,之后 MCP 再出问题就只可能是 agent 配置的问题,不是 Java 或 JAR 的问题。记下 APK 哈希:F-Droid 的下载文件会随版本更新,只有摘要一致,你的结果才能和别人的对比。
结果里有解码后的 manifest、包名和 SDK 声明、权限、类和资源数量。它不校验 APK 签名(结果里标为 not_performed),也不会运行应用。
REA_JADX_MCP_JAR 必须是绝对路径。写成相对路径会被当作「未配置」,报错信息见后面的排错部分。
第 4 步:在 Claude Code 里加环境变量
npx rea-agents setup 会注册 REA,但不会把 REA_JADX_MCP_JAR 写进注册信息。MCP 客户端启动 REA 服务时,用的是配置文件里写的环境变量,不是你当前 shell 的环境,所以要自己把变量加到 rea 这一项里。
Claude Code 的配置由 setup 写在 ~/.claude.json(或你指定的 Claude Code 配置目录下的 .claude.json)。在已有的 rea 服务里加一个 env。command 和 args 保持 setup 写的样子:通过 npx 运行 setup 时就是下面这样,args 里锁定的版本号保证 agent 一直用 6.4.0;全局安装时则会写成 rea 的绝对路径:
{
"mcpServers": {
"rea": {
"command": "npx",
"args": ["-y", "[email protected]", "mcp"],
"env": {
"REA_JADX_MCP_JAR": "/Users/you/tools/jadx/jadx-headless-mcp-0.7.1-all.jar",
"JAVA_HOME": "/absolute/path/to/jdk-21"
}
}
}
}
然后彻底退出 Claude Code,开一个新会话,用 /mcp 确认 rea 已连接。
为什么要完全重启: 已经在运行的客户端会继续用旧的服务进程和旧环境。重新运行 REA 的 setup 时,已有的 env 设置会被保留,所以以后刷新注册也不会丢。
第 5 步:在 Codex 里加环境变量
Codex 读取 ~/.codex/config.toml(或 $CODEX_HOME/config.toml),setup 会在里面写一个 [mcp_servers.rea] 表。在它下面加 env 表:
[mcp_servers.rea]
command = "npx"
args = ["-y", "[email protected]", "mcp"]
startup_timeout_sec = 30
[mcp_servers.rea.env]
REA_JADX_MCP_JAR = "/home/you/tools/jadx/jadx-headless-mcp-0.7.1-all.jar"
JAVA_HOME = "/absolute/path/to/jdk-21"
Windows 上用原生路径,TOML 里写成单引号字面量,例如 'D:\tools\jadx-headless-mcp-0.7.1-all.jar',这样反斜杠不会被当成转义符。setup 在 Windows 上写的 command(cmd.exe /d /c npx ... 或 Node 的绝对路径)不用动。
改完后开一个新的 Codex 会话。
第 6 步(可选):资源限制
大 APK 可能把 JADX 默认堆内存用光。REA 6.4.0 会读取两个可选变量,转换成 JVM 参数:
| 变量 | JVM 参数 | 示例 |
|---|---|---|
REA_JADX_HEAP_MIB |
-Xmx<value>m |
8192 |
REA_JADX_ACTIVE_PROCESSOR_COUNT |
-XX:ActiveProcessorCount=<value> |
4 |
两个值都必须是正整数,和 JAR 路径写在同一个 env 里。每个 JADX 操作有 120 秒的期限,所以大 APK 超时时,加堆内存通常比反复重试更有效。
第 7 步:向 agent 提问
重连后,agent 能用 5 个 Android 工具:
| MCP 工具 | CLI 命令 | 用途 |
|---|---|---|
inspect_android_package |
rea inspect-android-package |
manifest、SDK、权限、数量统计 |
search_android_classes |
rea search-android-classes |
按类名子串搜索(区分大小写) |
inspect_android_class |
rea inspect-android-class |
字段、方法、重载序号 |
inspect_android_method |
rea inspect-android-method |
反编译单个方法(必要时退回 smali) |
trace_android_references |
rea trace-android-references |
静态引用(谁引用了它) |
每次调用都带 APK 的绝对路径 path,没有单独的「打开」步骤。好的提问说清楚目标和你要的证据,而不是规定工具顺序。例如:
Using REA's Android tools, inspect /absolute/path/F-Droid.apk.
1. Report the package name, minSdk/targetSdk and the declared permissions.
2. Find the class registered as android:name on <application> in the manifest,
list its methods, and decompile onCreate.
3. Tell me which statements come from decompiled code and which are your
inference. List anything you could not determine.
In /absolute/path/F-Droid.apk, find classes whose names contain "Repo".
Pick the one most likely to parse repository index data, show its methods,
and trace who references it. Cite class and method names for every claim.
用中文提问也完全可以,关键是把这三点说清楚:从 manifest 里的真实类名入手;每个结论注明来自哪个类和方法;单独列出无法确定的部分。
为什么这样问: manifest 给了 agent 真实的类名作为起点,而不是靠猜。发布版通常经过压缩混淆,没被 manifest 或 keep 规则保留的类可能只剩很短的名字,只靠类名搜索容易漏掉。要求列出「未知项」,能让 agent 把观察到的事实和推断分开。
agent 需要遵守的几个行为(必要时你要提醒它):
- 重载。 一个类里有多个同名方法时,
inspect_android_method不会替你猜。agent 必须先调用inspect_android_class,再传overload_index。这个序号只在当前 APK 和引擎里有效,不要跨版本复用。 - 引用是静态的。
trace_android_references返回的是静态的入向引用,不是运行时观测到的调用。反射和动态加载仍然是未知项。它也无法针对重载方法中的某一个,会如实报告为不支持。 - 反编译出的 Java 只是派生表示。 文本完整不代表语义完整。静态初始化块(
<clinit>)因此会以 smali 形式返回。
6.4.0 里怎么处理大 APK
npm 6.4.0 的 inspect_android_package 只接受 path,总是返回包括解码 manifest 在内的完整结果。android-analysis.md 里写的 detail: "summary" 选项,以及通过 inspect_analysis_view 分页查看 Android manifest,都只在仓库 main 上,6.4.0 里没有;6.4.0 的 inspect-analysis-view 只覆盖布局、JavaScript 应用和原生函数的 Evidence。分析大应用时,就让请求保持小而具体:一次搜一类名、看一个类、反编译一个方法。
跨目标通用的提问模板见 Claude Code 逆向 Skill。
常见报错和处理
下面引用的是 REA 6.4.0 代码里的报错原文,你看到的路径会不一样。
“Set REA_JADX_MCP_JAR to the absolute path of a caller-supplied jadx-headless-mcp 0.7.1 JAR. REA does not download or install it.”
变量不在服务进程的环境里,或者写成了相对路径。在 shell 里 export 不会影响由 Claude Code 或 Codex 启动的 MCP 服务。把它写进 env,然后重启客户端。
“… does not provide jdk.compiler … A JRE cannot compile REA’s source bridge.”
java 指向的是 JRE。把 JAVA_HOME 指向完整 JDK,或者调整 PATH。
“… must be JDK 17 or newer and include jdk.compiler”
排在前面的是旧版 JDK。把 JAVA_HOME 设成 17+ 的 JDK。
“JAVA_HOME must select an existing JDK by absolute path; omit it to use java on PATH.”
JAVA_HOME 是相对路径,或者包含客户端不会展开的 shell 写法(比如 JSON 里的 ~)。写成完整的绝对路径。这条信息一般在 CLI 里看到;如果写在 MCP 的 env 里,REA 6.4.0 在服务启动时就会校验 JAVA_HOME,相对路径可能让 rea 服务直接起不来。/mcp 里显示 rea 连接失败时,先查 JAVA_HOME。
“… does not contain the required metadata bridge classes …”
JAR 用错了,通常是下成了不带 all 的版本,或者是 JADX 本体。重新下载 0.7.1 的 -all.jar 并校验 SHA-256。
“REA_JADX_HEAP_MIB must be a positive safe integer”
写纯数字,比如 8192,不要写 8g。
Windows 上出现 unsupported_host。
REA 6.4.0 在 Windows 上只支持 x64。如果提示自带的 Windows 原生组件缺失或不支持 protocol stdin,重新安装对应的 Windows x64 包(npx [email protected] setup)。也可以改用 WSL 加 Linux 版 JDK。
“Cannot find java.exe on the selected Windows PATH.”
MCP 服务没有继承到包含 Java 的 PATH。在 env 里设置 JAVA_HOME,不要依赖 PATH。
大 APK 超时。
调大 REA_JADX_HEAP_MIB,缩小请求范围,超大应用上不要用空查询列出全部类。
rea doctor 完全不提 JADX。
这是正常的:6.4.0 的 rea doctor --provider 只接受 hopper、ghidra 和 ida。检查 JADX 的办法是在终端里跑一次 rea inspect-android-package,或者让 agent 调用 MCP 工具 binary_session,它会列出 Android 工具是否可用以及修复建议。
手里是 .aab 文件。
App Bundle 不是 APK,这些工具不会把它当 APK 处理。请使用项目发布的 APK。
下一步
- 完整的 Android 静态分析流程(Apktool 资源、ADB、Flutter):/zh/android-apk-analysis-rea/
- agent 提问模板:/zh/claude-code-reverse-engineering-skill/
- REA 与单引擎 MCP 服务器的对比:/zh/rea-vs-ghidramcp-ida-pro-mcp/
- 保存并对比不同版本的分析结果:/zh/rea-evidence-snapshots-compare/
- 参考文档:android-analysis.md(仓库
main版本,使用前请和你安装的版本核对)