反编译 5 分钟,翻代码 5 小时。如果你做过 APK 逆向,一定懂这种痛。
痛点
分析一个 APK,传统流程是:
apktool解包jadx反编译- 在成千上万个类里
grep关键词 - 人肉追调用链
- 画流程图
代码是死的,人是活的。但人肉在几万行混淆代码里找逻辑,效率实在太低。
解决方案:apks2opencode
apks2opencode 把 JADX 反编译、jrag 语义索引和 OpenCode AI 助手串成一条流水线,让你用自然语言分析 APK。
一句话概括:让 AI 理解反编译后的代码,并追踪调用链。
核心优势
- 一键部署:
docker compose up拉起全套环境,不用逐个安装配置。 - 自然语言分析:不用手动翻代码,直接问“支付逻辑在哪”、“谁调用了这个函数”。
- 语义搜索 + 调用链:jrag 提供向量检索和图查询,比
grep高效得多。 - 全本地索引:代码不离开机器,索引持久化,支持增量更新。
架构
┌──────────────────┐ ┌─────────────────┐
│ jadx-ai-mcp │ │ opencode │
│ JADX GUI (6080) │◀───────▶│ AI Agent │
│ MCP Server(8651)│ │ │
└──────────────────┘ └────────┬────────┘
│
┌────────▼────────┐
│ jrag │
│ Vector DB + Graph DB │
│ (MCP via stdio) │
└─────────────────┘
- jadx-ai-mcp:提供 JADX GUI(noVNC)和 MCP HTTP 服务,用于精确反编译和 Android 专有信息。
- opencode:AI Agent,通过 MCP 协议调用 jrag 和 jadx。
- jrag:基于 jadx 源码构建的语义索引和调用图,随 opencode 一起安装。
快速开始
依赖
- Docker + Docker Compose
- 一个 OpenAI 兼容的 API(DeepSeek、SiliconFlow、OpenAI 等)
启动
docker compose up -d --build
首次启动会:
- 下载 evil-opencode 最新版二进制
- 安装 jrag-cli(约 5-10 分钟)
- 创建 dummy pom.xml(如果源码目录为空)
- 构建初始索引
配置 API
进入 OpenCode TUI 后,用 /connect 命令配置 API:
docker attach opencode
在 TUI 里执行 /connect,选择你的提供商,粘贴 API Key 和 Base URL。凭据会持久化在 opencode-data 卷中。
添加 APK
./add_apk.sh /path/to/your_app.apk
脚本会完成:复制 APK → jadx 反编译 → 源码添加到 ./repos/<apk名>/ → 重建索引。每个 APK 的源码放在独立子目录,互不覆盖。
使用
docker attach opencode
直接提问,例如:
这个 APP 里有哪些 Activity?
com.example.MainActivity 调用了哪些关键服务?
/mcp list 查看 MCP 连接状态。
可选配置
创建 .env 文件可覆盖以下默认值,全部可选:
# JADX GUI 和 MCP 服务的对外端口
JADX_GUI_PORT=6080
JADX_MCP_PORT=8651
# jrag 嵌入模型,选择 HuggingFace 上的模型
SBERT_MODEL=sentence-transformers/all-MiniLM-L6-v2
# jrag 嵌入设备:cpu / cuda / mps
# 有 NVIDIA 显卡设为 cuda,苹果设备设为 mps
SBERT_DEVICE=cpu
已知坑
1. JADX 双 Token
JADX 有两套独立 Token:
| Token | 默认值 | 作用 |
|---|---|---|
| Plugin Token | jadx-plugin-secret-token |
GUI 插件内部通信(8650) |
| MCP Admin Token | admin-secret-token |
MCP Server 对外认证(8651) |
OpenCode 连接的是 MCP Server,必须用 Admin Token,格式为 Bearer admin-secret-token(注意空格)。
2. jrag increment 检测不到新文件
jrag increment 只会更新已索引文件的变更,不会扫描新增文件。添加新 APK 后必须重建索引。add_apk.sh 已内置此逻辑:先尝试 increment,如果文件数不变,自动 fallback 到全量 jrag install。
3. jadx GUI 需要手动加载 APK
MCP 服务起来后,JADX GUI 里如果没有打开 APK,工具查不到任何东西。浏览器访问 http://<IP>:6080,在 GUI 里打开 /apks/xxx.apk。
4. 跨 APK 的 FQN 冲突
子目录隔离只解决路径冲突,不解决 FQN(全限定类名)冲突。如果两个 APK 都有 com.example.package.Class,LadybugDB 建图时还是会报 Symbol already exists。
工作流建议
给 AI 的提问模板(省 Token):
直接回答。只调用必要的工具,最多 1-2 次。不要做额外的状态验证。
分析流程:
jrag search定位相关类jrag neighbors/callers追调用链- 需要精确源码时用 jadx MCP 或直接读
/workspace/<apk名>/下的文件
项目地址
https://github.com/zhangdeepseek/apks2opencode
致谢
本项目是以下工具的编排配置,核心功能均由上游提供:
License
MIT
如果这个项目对你有帮助,欢迎 Star。也欢迎提 Issue 分享你的使用体验。