REA Android APK静态分析:headless JADX接入完整指南
REA(Reverse Engineer Anything)是一款面向 AI Agent 的逆向工程工具集,它通过内置的 headless JADX 引擎,让你无需模拟器、无需 Android SDK,就能对 Android APK 做纯静态分析:查看清单权限、搜索类、反编译方法、追踪引用关系,并且每个结论都附带可审计的 Evidence。本文带你用 5 条命令跑通 APK 静态分析全流程。
为什么选择 REA 做 APK 静态分析?
传统 APK 反编译往往要手动装 jadx-gui 或 Android SDK,流程繁琐且结果难以被 AI 工具消费。REA 的 Android 能力有几个显著优势:
- 纯本地分析:不执行 APK、不写入原始文件,安全无副作用
- Agent 原生:CLI 与 MCP 共用同一套工作流,Claude Code、Cursor 等 Agent 可直接调用
- 证据可审计:结果保留 APK 的 SHA-256、引擎 JAR 的 SHA-256 和原始响应,结论可追溯
- 零臃肿依赖:不需要 Gradle 构建、不需要设备服务和模拟器
⚠️ 平台限制:headless JADX 提供方支持 Linux 和 macOS,Windows 暂不支持。详见 docs/android-analysis.md。
REA 如何接入 headless JADX
REA 并不"魔改" JADX,而是通过 Provider 适配器包装一个未修改的、commit 锁定的 jadx-headless-mcp(v0.7.1)引擎:
- 引擎源码以 Git 子模块形式保存在 third_party/jadx-headless-mcp,保留上游 Apache-2.0 许可
- REA 侧适配代码集中在 src/android/ 目录,包括协议、会话、传输等 JadxProvider.ts 等模块
- REA 分析时不会自动下载任何引擎,需要你自行提供 JAR,并用 SHA-256 校验审计版本
- 应用层服务见 src/application/android/AndroidAnalysisService.ts
这种"原样引擎 + 自研适配层"的设计保证了分析结果完全来自上游引擎,边界清晰。
环境准备:两步配置搞定
你只需要一个完整的 JDK 17+(含编译器模块)和引擎 JAR,REA 不会替你安装任何 Java 或 Android 工具:
# 1. 指向 jadx-headless-mcp 0.7.1 的 fat JAR
export REA_JADX_MCP_JAR=/absolute/path/jadx-headless-mcp-0.7.1-all.jar
# 2. 可选:指定使用某个已存在的 JDK
export JAVA_HOME=/absolute/path/existing-jdk
可选的 JVM 调优(大 APK 建议加大堆内存):
export REA_JADX_HEAP_MIB=8192 # 堆内存上限(MiB)
export REA_JADX_ACTIVE_PROCESSOR_COUNT=4 # 可见处理器数
💡 当前元数据桥接已在 macOS arm64 + OpenJDK 21 上验证,Linux 同样受 POSIX 适配器支持。
5 条核心命令:从包到引用的完整分析链路
命令均在 src/cli/androidCommands.ts 中注册,按分析深度递进:
1️⃣ 检查 APK 包结构
rea inspect-android-package /path/Example.apk
返回解码后的 manifest XML、声明摘要、权限列表和类/资源数量。注意:签名验证会明确标记为 not_performed。
2️⃣ 搜索类名
rea search-android-classes /path/Example.apk MainActivity
大小写敏感的子串搜索,会消费所有分页并校验计数。传入空查询则可盘点 APK 中全部类名。
3️⃣ 查看类的成员清单
rea inspect-android-class /path/Example.apk example.MainActivity
无需生成源码即可读取解析后的元数据,返回类型、字段和内部类名。
4️⃣ 反编译单个方法
rea inspect-android-method /path/Example.apk example.MainActivity onCreate
# 存在同名重载时,必须显式指定重载序号(从 0 开始)
rea inspect-android-method /path/Example.apk example.MainActivity select --overload-index 1
🔑 关键设计:遇到同名重载方法时,REA 会直接拒绝模糊请求,而不是悄悄选第一个匹配项——避免把错误的函数体归因给错误的重载。
5️⃣ 追踪引用关系
# 追踪指向该类的静态引用
rea trace-android-references /path/Example.apk example.MainActivity
# 追踪指向某个唯一方法的引用
rea trace-android-references /path/Example.apk example.MainActivity --method-name onCreate
让 AI Agent 直接分析 APK:MCP 接入方式
如果你在 Agent 中使用 REA(npx rea-agents setup 完成注册后),对应的 MCP 工具与 CLI 一一对应:
| MCP 工具 | 作用 |
|---|---|
inspect_android_package | 检查 APK 声明与 manifest |
search_android_classes | 搜索/盘点类名 |
inspect_android_class | 查看类成员清单 |
inspect_android_method | 反编译指定方法(支持 overload_index) |
trace_android_references | 追踪类/方法引用 |
例如让 Agent 调用方法反编译工具:
{
"name": "inspect_android_method",
"arguments": {
"path": "/path/Example.apk",
"class_name": "example.MainActivity",
"method_name": "select",
"overload_index": 1
}
}
工具契约与输出模式详见 docs/mcp-contracts.md。
理解结果:Evidence 告诉你"结论从哪来"
REA 的每次请求都会把原始请求、APK SHA-256、引擎 JAR SHA-256 和原始响应保留在 Evidence 中。这意味着:
- 反编译出的源码是派生表示,完整文本 ≠ 完整语义,不等于可字节级重构
- 引用结果是节点间的静态关系,不是运行时观测到的调用
- 无函数体的 native/abstract 方法会报告
body_status: "not_available",不做猜测 - 这些操作不处理 split APK/AAB、签名校验和 native 库分析;如需存档层面的证据,可配合工件清点工具再用
project-android-application-graph做无执行的图谱投影
资源与生命周期:这些限制你要知道
| 项目 | 数值 | 说明 |
|---|---|---|
| 会话闲置清理 | 60 秒 | 超时/失败/断连均触发清理 |
| 操作执行时限 | 120 秒 | 到达队列头部后计时 |
| 上游反编译时限 | 90 秒 | JADX 引擎侧限制 |
| manifest/方法文本 | 1 MiB | 超预算会报告截断 |
| 协议帧上限 | 8 MiB | 超限失败而非返回残缺数据 |
会话复用很智能:APK 和引擎 JAR 的摘要、JVM 配置会先校验,匹配才复用已加载引擎;输入变化会自动淘汰旧会话。一次性 CLI 命令返回前总会等待清理完成,且 REA 永不写入原始 APK、永不启动目标代码。
跑官方验证:确认真实引擎可用
项目提供了完整的端到端验证 lane,使用公开的 Appium ApiDemos APK 作为测试样本:
npm run fixtures:android
export REA_JADX_MCP_JAR="$PWD/_reference/apk-integration/jadx-headless-mcp-0.7.1-all.jar"
export REA_ANDROID_TEST_APK="$PWD/_reference/apk-integration/ApiDemos-debug.apk"
npm run verify:android
下载脚本会校验固定的 SHA-256 值并拒绝覆盖已有文件,整个过程无需 Gradle、模拟器或 Android SDK。
常见问题
Q:分析需要联网吗? 不需要。引擎 JAR 需自行提供,分析过程完全本地进行,不上传任何文件。
Q:Windows 上能用吗? 该提供方目前不支持 Windows(owned stdio 进程边界限制),Linux/macOS 均可。
Q:结果和 jadx-gui 手动反编译的差异? 两者使用同一引擎内核,但 REA 的会话复用、摘要校验和 Evidence 保留使其更适合被脚本和 AI Agent 稳定消费。
总结
| 步骤 | 要点 |
|---|---|
| 1. 装 JDK 17+ | 完整 JDK,含编译器模块 |
| 2. 配置 JAR 路径 | REA_JADX_MCP_JAR 指向 0.7.1 引擎 |
| 3. 检查包结构 | inspect-android-package 看权限与声明 |
| 4. 定位目标代码 | search-android-classes → inspect-android-class |
| 5. 深挖与追踪 | inspect-android-method + trace-android-references |
从 APK 权限清单到方法级反编译再到引用追踪,REA 把 headless JADX 的能力封装成了 AI Agent 可以直接调用的分析原语。配合 docs/android-analysis.md 的完整契约说明和 third_party/README.md 的上游溯源记录,你可以在几分钟内建立起一条可信的 Android 静态分析流水线。🚀
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/gitblog_00479/article/details/167370680




