sublime构建系统需显式配置绝对路径或环境变量才能调用第三方反编译工具,因其不继承终端完整环境;java class反编译推荐用jd-cli直出控制台,apk反编译应分步或交由外部脚本处理,调试时须精简配置、验证变量展开与环境隔离问题。

构建系统调用第三方反编译工具前,先确认它能不能被 Sublime 真正“看见”
Sublime 的 Build System 本质是执行 shell 命令或子进程,它不继承你终端里完整的环境变量(尤其是 macOS/Linux 图形界面启动时跳过 ~/.zshrc,Windows 下 npm 全局命令常因 PATH 不全而失效)。所以别只信终端里 snowman --version 或 jd-cli -h 能跑——关掉 Sublime,从 Dock / 开始菜单重启它,再在 Sublime 中新建一个 .sublime-build 文件,用最简配置测试:
{
"cmd": ["which", "jd-cli"],
"shell": true
}
如果输出为空或报 /bin/sh: jd-cli: command not found,说明路径没对上。此时必须显式写绝对路径,比如:
- macOS:用
which jd-cli拿到/opt/homebrew/bin/jd-cli,就填这个 - Windows:用
where jd-cli找到类似C:UsersAliceAppDataRoaming pmjd-cli.cmd,注意.cmd后缀不能省 - Linux:若装在
/usr/local/bin但 Sublime 找不到,可在cmd数组前加"env": {"PATH": "/usr/local/bin:/usr/bin"}
Java class 反编译:用 jd-cli 直接输出 Java 源码到控制台
假设已确认 jd-cli 可调用,且当前文件是 Example.class,目标是把反编译结果直接打印在 Sublime 输出面板(适合快速查看):
{
"cmd": ["jd-cli", "${file}"],
"selector": "source.java.bytecode",
"file_regex": "^(.*?):([0-9]+):([0-9]+):\s+(.*)$",
"working_dir": "${file_path}"
}
关键点:
-
selector设为source.java.bytecode(需先安装 Java Bytecode 语法高亮插件),否则新建.class文件不会自动匹配该构建系统 - 不要用
shell_cmd+ 重定向(如jd-cli ${file} > ${file_base_name}.java),因为 Sublime 输出面板不支持写文件,且重定向在跨平台下行为不一致 - 若想保存为
.java文件,得改用脚本封装:写个 Python 小脚本调用subprocess.run()执行jd-cli并写入同名.java,再让cmd指向该脚本
APK 反编译流程中调用 apktool 和 jd-gui(CLI 版)
APK 反编译通常分两步:资源解包(apktool d)+ 代码反编译(jd-cli 或 fernflower)。Build System 不适合串起多步复杂流程,但可分拆为两个构建项:
第一步,资源解包(保存为 ApkTool-Decompile.sublime-build):
{
"cmd": ["apktool", "d", "-f", "-o", "${file_path}/${file_base_name}_decompiled", "${file}"],
"file_regex": "brut\.androlib\.AndrolibException: (.*)",
"working_dir": "${file_path}"
}
第二步,对解包后的 classes.dex 反编译(需先用 dex2jar 转成 .jar,再用 jd-cli):
- 别指望单个
.sublime-build完成整个链路——错误难定位、进度不可见、失败后状态难恢复 - 推荐用 Shell/Bash/PowerShell 脚本把
dex2jar→jd-cli→ 格式化输出串起来,再让 Build System 调用该脚本 -
apktool输出含中文路径时大概率静默失败,确保${file_path}不含中文、空格、括号;必要时在脚本里用iconv或chcp 65001处理编码
常见静默失败和调试技巧
Sublime 构建系统失败时往往不报错,只在输出面板显示“[Finished in X.YZs]”然后空白——这是最头疼的情况。排查顺序如下:
- 先删掉所有非必要字段(
file_regex、variants、working_dir),只留cmd和shell,看是否至少有基础输出 - 把
cmd改成["echo", "hello", "${file}"],确认变量展开是否正常(${file}在未保存文件时为空字符串) - Windows 下若用
.bat脚本,记得在cmd数组里写["cmd.exe", "/c", "your_script.bat"],别漏/c - macOS/Linux 下避免用
shell_cmd调用含管道的命令(如apktool d xxx.apk | grep 'smali'),改用cmd数组 +subprocess脚本更可控
真正卡住的地方,往往不是命令本身,而是 Sublime 启动时的环境隔离、路径变量缺失、以及未保存文件导致的 ${file} 展开为空——这些细节不验证,配再复杂的 JSON 都白搭。











