一、apktool — APK 解包 / 重打包
apktool
是一款开源的 Android APK 工具,用于:
反编译 APK
查看资源和布局文件
生成 smali 文件(DEX 的反汇编)
对 APK 进行修改后重新打包
它不能还原 Java 源码,只能将 DEX 转为 smali。
下载地址:https://github.com/iBotPeaches/Apktool/releases
查看版本和帮助命令:
apktool -version
apktool -h
1. apktool核心功能命令
功能 | 命令 | 说明 |
---|---|---|
解包 | apktool d <apk> |
反编译 APK |
打包 | apktool b <dir> |
将修改后的项目打包为 APK |
加载资源框架 | apktool if <apk> |
安装系统 APK 作为 framework,用于编译 |
查看版本 | apktool -version |
显示当前 apktool 版本 |
查看帮助 | apktool -h |
显示帮助文档 |
2. APK 解包命令
apktool d <file.apk> -o <output_dir>
常用参数表:
参数 | 说明 |
---|---|
d / decode |
解包操作 |
-o <目录> |
指定输出路径 |
-f |
强制覆盖已有目录 |
-s |
保留原始资源文件(不解码 resources.arsc ) |
--no-src |
不反编译 smali(跳过代码) |
--no-res |
不解码资源(只提取代码) |
--only-main-classes |
仅提取主 dex |
--use-aapt2 |
使用 AAPT2 解码资源(新版应用更兼容) |
示例:
apktool d myapp.apk -o myapp_src -f
解包并输出到 myapp_src
目录,强制覆盖旧目录。
3. APK 重打包命令
apktool b <解包目录> -o <输出apk>
常用参数表:
参数 | 说明 |
---|---|
b / build |
打包操作 |
-o <apk> |
输出重打包后的 APK |
-f |
强制覆盖已有的 APK |
--use-aapt2 |
使用新版 AAPT2 构建资源(推荐) |
示例:
apktool b myapp_src -o myapp_rebuild.apk
4. 安装框架资源命令
某些系统应用或带有复杂样式的 APK 解包/打包时会出错,可通过安装依赖资源解决:
apktool if framework-res.apk
使用场景:解包或打包 系统 App、MIUI ROM、Flyme 等 报错 can't find resources
时使用。
5. 解包目录结构说明
APK 文件
↓(apktool d xxx.apk)
反编译(结构还原)
↓
res/ ← 资源目录(布局、图片等)
AndroidManifest.xml ← 解包为可读可编辑的 XML
smali/ ← DEX 字节码反汇编成 smali 汇编代码
original/ ← 原始签名等信息(如 META-INF)
apktool.yml ← 构建所需元数据文件
myapp_src/
├── AndroidManifest.xml # 核心配置文件
├── smali/ # smali 反编译代码
├── res/ # XML 布局和资源文件
├── assets/ # 原始资源目录
├── original/ # 原始 META-INF、签名等
├── unknown/ # 无法解析的内容(如加固数据)
6. 常用实战流程
完整实战流程命令(带签名 + 对齐)
# 解包
apktool d myapp.apk -o myapp_src -f
# 修改代码/res资源/smali逻辑...
# 重打包
apktool b myapp_src -o unsigned.apk
# 对齐(可选)
zipalign -v 4 unsigned.apk aligned.apk
# 签名(推荐用 apksigner)
apksigner sign --ks my.keystore --ks-key-alias mykey --ks-pass pass:123456 aligned.apk
二、jadx — Java 源码反编译
jadx
(Java Decompiler for Android) 是一款高质量的 DEX → Java 反编译工具,它支持将 APK 或 DEX 文件中的代码还原为可读性极强的 Java 源码。
它支持两种模式:
命令行模式(
jadx
/jadx-cli
)图形化界面(
jadx-gui
)
适用于查看、分析 APK、smali 转 Java 的所有逆向分析工作流程。
下载地址:https://github.com/skylot/jadx/releases
反编译能力概览
能力 | 支持情况 |
---|---|
支持 APK / DEX / JAR | 支持 |
输出 Java 源码 | 支持 |
输出 smali 文件 | 支持(选项) |
支持多 dex | 支持 |
支持资源导出(res/layout) | 支持 |
代码跳转、方法索引(GUI) | 支持 |
GUI 支持查找类/方法 | 支持 |
1. 命令行版 :jadx
常用命令
jadx [options] <apk_or_dex_file>
最常用命令示例
jadx -d out myapp.apk
将 myapp.apk
中的 Java 源码解出并保存到 out/
目录。
所有常用命令参数整理(CLI 版本)
参数 | 作用 |
---|---|
-d <目录> |
指定输出目录 |
--show-bad-code |
显示无法还原的代码块(标红) |
--no-res |
不导出资源文件(如布局 XML) |
--no-src |
不导出 Java 源码 |
--deobf |
开启名称混淆恢复(deobfuscation) |
--deobf-min <int> |
混淆还原最小名称长度 |
-- output-format<java|json> |
输出为 Java 源码或结构化的json |
--threads N |
多线程反编译速度更快 |
--log-level <LEVEL> |
设置日志等级(INFO/DEBUG/ERROR) |
--export-gradle |
生成 gradle 项目结构(实验性) |
--skip-res |
跳过资源(快捷方式) |
--version |
显示 jadx 版本 |
--help |
查看帮助 |
用法参考:
jadx -d out/ --output-format java app.apk
示例命令合集
➤ 反编译 APK 到 Java + 资源
jadx -d out myapp.apk
➤ 仅导出 Java,不要资源文件
jadx -d out myapp.apk --no-res
➤ 启用混淆名称还原(deobf)
jadx -d out myapp.apk --deobf
➤ 提升反编译速度(多线程)
jadx -d out myapp.apk --threads 6
2. 图形界面版:jadx-gui
启动方式(Linux/macOS)
jadx-gui myapp.apk
GUI 功能:
功能 | 说明 |
---|---|
类名搜索 | 可通过 Ctrl+K 搜索类、方法 |
跳转到定义 | 支持点击跳转定义 |
显示源码 / smali | 支持双视图切换 |
导出项目 | 可点击 File → Save All 导出源代码 |
项目结构查看 | 类似 IDEA 结构树 |
中文支持好 | UI 简洁清晰 |
3. 输出目录结构说明
APK 文件(或 DEX 文件)
↓(jadx -d xxx.apk)
反编译(逻辑还原)
↓
sources/ ← 还原出的 Java 源码(近似原始)
AndroidManifest.xml ← 可读 Manifest(但可能不完整)
resources/ ← 提取的资源文件(如图片等)
res/ ← XML 布局资源
out/
├── sources/ # Java 源码(主目录)
├── resources/ # 资源文件(layout、drawable)
├── AndroidManifest.xml
4. 实战案例命令
目标:反编译 APK 并提取 Java 源码 + 修改 + 查看主 Activity
jadx -d out myapp.apk
cd out/sources
grep -r "extends Activity" .
快速定位入口 Activity 并开始分析逻辑。
5. 与其它工具搭配
工具 | 用途 |
---|---|
apktool | 查看 smali + XML 资源 |
jadx | 查看 Java 逻辑 |
dex2jar + JD-GUI | 对比查看 Java 反编译差异 |
smali | 查看/修改反汇编代码 |
三、
dex2jar — DEX → JAR 转换
dex2jar
是一个开源工具,用于将 Android 中的 DEX(Dalvik Executable)格式 文件转换为标准的 JAR(Java Archive)格式 文件,以便用 JD-GUI 或 jadx 查看 Java 源码。
下载地址:https://github.com/pxb1988/dex2jar/releases
作用与场景
操作 | 工具 |
---|---|
APK → DEX | 自动完成(APK 中本身包含 classes.dex) |
DEX → JAR | dex2jar |
JAR → Java | 使用 JD-GUI、jadx、CFR 等查看 Java 代码 |
用途:逆向分析 APK 内部逻辑代码,适合加固前/脱壳后的 APK。
1. 常用命令
常用命令参数大全
参数 | 含义 |
---|---|
-f |
强制覆盖已存在的 JAR 文件 |
-o <file> |
指定输出文件名 |
--debug-info |
保留调试信息(行号/局部变量) |
--force |
同 -f ,强制输出 |
--multi-dex |
支持多 dex 文件转换 |
--exception-file <file> |
输出错误日志 |
--no-reuse-reg |
不复用寄存器,调试用 |
--version |
显示版本信息 |
--help |
查看帮助信息 |
示例命令
windows 用 d2j-dex2jar.bat Linux 用 d2j-dex2jar.sh
➤ 转换 APK 中默认 classes.dex
d2j-dex2jar.bat myapp.apk
输出为:myapp-dex2jar.jar
➤ 指定输出 jar 文件名
d2j-dex2jar.bat -o output.jar myapp.apk
➤ 支持多 dex 文件(classes2.dex、classes3.dex 等)
d2j-dex2jar.bat --multi-dex myapp.apk
➤ 保留调试信息(可调试的源码行号)
d2j-dex2jar.bat --debug-info myapp.apk
➤ 转换多个 dex 文件(可用于脱壳后提取)
d2j-dex2jar.bat -f classes.dex
d2j-dex2jar.bat -f classes2.dex
2. 输出文件说明
原始文件 | 生成结果 |
---|---|
myapp.apk |
myapp-dex2jar.jar |
classes.dex |
classes-dex2jar.jar |
生成的 .jar
文件可以直接用下面工具查看源码:
JD-GUI
jadx-gui
CFR 反编译器
dex2jar 反编译流程:
APK 文件
↓(解压出 classes.dex)
提取 DEX 字节码
↓(dex2jar classes.dex)
转换格式
↓
classes-dex2jar.jar ← DEX 转换为标准 Java 字节码(JAR 文件)
↓(jd-gui 打开)
反编译成 Java 源码(近似)
↓
Java 源码浏览(仅查看、不可编辑 JAR 内)
3. 实战流程命令串
# 解包 APK
apktool d myapp.apk -o myapp_src
# 转换 dex 为 jar
d2j-dex2jar.sh myapp.apk
# 查看 Java 代码(GUI 工具打开 JAR)
jd-gui myapp-dex2jar.jar
4. 与其它工具联动
工具 | 用法 |
---|---|
apktool |
解包资源、提取 smali |
dex2jar |
还原 Java JAR 文件 |
jd-gui |
查看 Java 代码(图形界面) |
jadx |
替代 dex2jar + jd-gui 的整合方案 |
frida |
动态调试结合静态分析更准确 |
四、smali / baksmali
— DEX 与 smali 的互转工具
smali
:将 .smali
汇编代码编译成 .dex
文件(汇编器)
baksmali
:将 .dex
文件反编译成 .smali
文件(反汇编器)
smali 是 Android DEX 字节码的可读文本格式表示,结构清晰,非常适合逆向修改、插桩分析。
下载地址:https://bitbucket.org/JesusFreke/smali/downloads/
运行方式(基于 Java)
java -jar baksmali.jar disassemble classes.dex -o smali/
java -jar smali.jar assemble smali/ -o classes.dex
常见用途
工具 | 用途 |
---|---|
baksmali |
DEX → smali(反汇编) |
smali |
smali → DEX(汇编) |
应用场景 | 插桩调试、添加日志、修改类行为、绕过检测等 |
1. 常用命令
1)反汇编 DEX 到 smali(baksmali)
baksmali disassemble <input.dex> -o <output_dir>
常用参数
参数 | 说明 |
---|---|
-o |
指定输出目录 |
--api <LEVEL> |
指定 Android API 版本 |
--no-debug-info |
不生成调试信息 |
--sequential-labels |
使用顺序标签名(可读性好) |
示例:
baksmali disassemble classes.dex -o smali_out/
2)将 smali 汇编为 dex(smali)
smali assemble <smali_dir> -o <output.dex>
常用参数
参数 | 说明 |
---|---|
-o |
输出 dex 文件路径 |
--api <LEVEL> |
指定 API 版本 |
--debug |
包含调试信息 |
--register-info |
添加寄存器调试信息(用于调试) |
示例:
smali assemble smali_out/ -o new_classes.dex
3)实战推荐
➤ DEX → smali(反汇编)
baksmali disassemble classes.dex -o smali/
➤ 修改后 smali → DEX(汇编)
smali assemble smali/ -o new_classes.dex
2. 文件结构说明
基本文件结构示例(反编译结果)
com/
example/
app/
MainActivity.smali
.smali
文件中包含类声明、方法、寄存器、指令等信息,可手工修改后重新打包。
反汇编(baksmali
)流程:
classes.dex
↓(baksmali disassemble classes.dex)
反汇编
↓
smali/ ← DEX 转换成 smali 汇编代码(可读、可编辑)
汇编(smali
)流程:
smali/ 目录
↓(smali assemble smali/)
重新汇编
↓
classes.dex ← 生成新的 DEX 文件,可用于重新打包 APK
baksmali 的输出结构:
classes.dex
↓(baksmali disassemble)
反汇编成 smali 汇编代码
↓
smali/
├── com/
│ └── example/
│ └── app/
│ └── MainActivity.smali
...
smali 的汇编回 dex 流程:
smali/
↓(smali assemble)
汇编为 DEX 字节码
↓
classes.dex
3. 实战使用技巧
插桩调试示例
# 原方法
.method public myFunc()V
.registers 2
invoke-static {}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
return-void
.end method
可以手动插入日志打印代码或跳过检测逻辑。
4. 与其他工具联动
推荐流程
# 解包 APK
apktool d myapp.apk -o myapp_src
# 进入 smali 目录修改代码
cd myapp_src/smali/com/example/...
# 修改完成后重新打包
apktool b myapp_src -o new.apk
# 签名 APK
apksigner sign --ks my.keystore new.apk
五、
zipalign — APK 对齐优化工具
zipalign
是 Android SDK 提供的 APK 对齐优化工具,用于在 APK 打包完成后进行 字节对齐处理。
对齐的好处:
提升运行时性能(更快的资源加载速度)
是 Google Play 上架前必须执行的优化步骤
避免内存浪费(系统按对齐方式高效读取资源)
一句话:“zipalign 是让 APK 资源按 4 字节对齐,使系统运行更快、更省内存”
下载地址:Android SDK 自带的签名工具。已经安装过 Android Studio 或下载了 SDK Build Tools,可以在如下地址找到:
C:\Users\Admin\AppData\Local\Android\Sdk\build-tools\30.0.3\zipalign.exe
可以将其加入环境变量,方便全局使用。
zipalign 的工作原理
APK 是一个 zip 文件,里面的资源文件如果没有对齐,在加载时 Android 系统需要额外内存拷贝。
zipalign 将所有资源按 4 字节边界(默认) 对齐,避免这种开销。
使用场景
在签名前对齐(老流程)
在签名后对齐(推荐做法)
发布前最后一步,打包+签名+zipalign 是标准流程
1. 常用命令
常用命令格式
zipalign [options] <alignment> <input.apk> <output.apk>
1)最常见的对齐命令(标准流程)
zipalign -v 4 input-unsigned.apk output-aligned.apk
-v
:显示详细日志4
:默认 4 字节对齐(Google 推荐)
2)对已签名 APK 进行对齐(推荐做法)
zipalign -v -p 4 signed.apk aligned.apk
-p
:跳过重复压缩的文件(提高速度)
注意:zipalign 不会破坏 APK 签名(对已签名包使用是安全的)
3)验证 APK 是否已对齐
zipalign -c -v 4 your.apk
输出内容如:
Verification successful
说明该 APK 已完成对齐。
参数汇总
参数 | 说明 |
---|---|
-v |
显示详细信息 |
-p |
跳过已压缩的文件 |
-c |
验证 APK 是否已对齐 |
<alignment> |
对齐边界,推荐为 4(即 4 字节) |
2. 常见使用流程
打包 → 签名 → 对齐
# 解包 + 修改 APK 后(例如用 apktool)
apktool b myapp -o unsigned.apk
# 签名
apksigner sign --ks my.keystore --out signed.apk unsigned.apk
# zipalign(对齐优化)
zipalign -v -p 4 signed.apk final.apk
# 验证对齐是否成功
zipalign -c -v 4 final.apk
3. 流程结构图
zipalign 对齐优化流程(用于最终打包优化):
已打包的 APK 文件(未对齐)
↓(zipalign -v -p 4 unsigned.apk aligned.apk)
对齐优化(必须对齐才能上架或正确签名)
↓
aligned.apk ← 成功对齐的 APK 文件,结构优化,准备签名
整体结构图参考(zipalign 环节):
APK 文件(重打包后)
↓(zipalign)
优化对齐结构
↓
aligned.apk(待签名)
通常完整打包流程如下:
apktool b out_dir/ -o unsigned.apk
↓
zipalign -v -p 4 unsigned.apk aligned.apk
↓
apksigner sign --ks your.keystore aligned.apk
↓
final.apk ← 可安装、可上线的正式签名 APK
六、
apksigner — APK 签名工具
apksigner
是 Android SDK 提供的 官方签名工具,用于给 APK 添加/验证 v1/v2/v3 数字签名,保障 APK 在 Android 系统中的合法性。
签名后的 APK 才能安装到 Android 系统
支持 Google Play 要求的 v1(JAR)+ v2(APK Signature Scheme)+ v3 签名
Android 7.0+ 要求 v2/v3 签名,v1 签名仅用于兼容老系统
下载地址:Android SDK 自带的签名工具。已经安装过 Android Studio 或下载了 SDK Build Tools,可以在如下地址找到:
C:\Users\你的用户名\AppData\Local\Android\Sdk\build-tools\版本号\apksigner.bat
使用场景
对
apktool
打包出来的 APK 进行签名发布前对齐 + 签名
验证已签名 APK 的完整性
渗透测试过程中伪造签名测试、绕检测
1. 准备工作
签名前需要一个 Java Keystore(.jks
或 .keystore
) 文件,使用以下命令生成:
keytool -genkeypair -v -keystore my.keystore -alias mykey -keyalg RSA -keysize 2048 -validity 10000
然后在输入两次最低六位数的密钥口令,下面的信息直接 Enter ,最后 y 即可!如下图:
keytool 、 jarsigner 工具是JAVA JDK自带的,配置好JAVA环境即可!
2. 常用签名命令
1)签名 APK(最常用命令)
apksigner sign --ks my.keystore --ks-key-alias mykey input.apk
可选参数:
参数 | 说明 |
---|---|
--ks |
keystore 文件路径 |
--ks-key-alias |
使用的 alias 名称 |
--ks-pass pass:<密码> |
keystore 密码 |
--key-pass pass:<密码> |
密钥密码 |
--out |
指定签名后输出的 APK |
示例(完整自动化):
apksigner sign --ks my.keystore --ks-key-alias mykey --ks-pass pass:123456 --key-pass pass:123456 --out signed.apk unsigned.apk
2)验证 APK 签名
apksigner verify signed.apk
查看签名版本和状态(适用于逆向检测):
apksigner verify --verbose --print-certs signed.apk
输出内容示例:
Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): false
3)只签 v1 / v2 / v3 签名(可选控制)
apksigner sign --ks my.keystore --ks-key-alias mykey --v1-signing-enabled true --v2-signing-enabled true --v3-signing-enabled false input.apk
3. 签名完整流程
# APK 解包 + 修改后
apktool b app -o unsigned.apk
# 签名
apksigner sign --ks my.keystore --ks-key-alias mykey unsigned.apk --out signed.apk
# 对齐优化
zipalign -v -p 4 signed.apk final.apk
# 验证签名
apksigner verify --verbose --print-certs final.apk
4. 参数总览表
参数 | 说明 |
---|---|
--ks |
keystore 文件路径 |
--ks-key-alias |
alias 名 |
--ks-pass pass:123456 |
keystore 密码 |
--key-pass pass:123456 |
密钥密码 |
--out |
输出的已签名 APK |
--v1-signing-enabled |
是否启用 v1 签名 |
--v2-signing-enabled |
是否启用 v2 签名 |
--v3-signing-enabled |
是否启用 v3 签名 |
--min-sdk-version |
最低兼容 API |
--verbose |
显示详细信息 |
--print-certs |
输出签名证书摘要 |
5. 签名调试与自动化建议
可以写一个一键签名 + 对齐脚本(shell 或 Python),例如:
#!/bin/bash
apk=$1
zipalign -v -p 4 $apk aligned.apk
apksigner sign --ks my.keystore --ks-key-alias mykey aligned.apk
6. 签名流程图
aligned.apk
↓(apksigner sign --ks keystore.jks aligned.apk)
APK 签名(添加 META-INF 目录中的签名文件)
↓
signed.apk(可安装、可上线)
apksigner 使用流程总结图
apktool b myApp/ -o unsigned.apk
↓
zipalign -v -p 4 unsigned.apk aligned.apk
↓
apksigner sign --ks keystore.jks aligned.apk
↓
signed.apk(可安装、可发布的 APK)
最终输出结构(signed.apk 内部):
signed.apk
├── classes.dex
├── AndroidManifest.xml
├── res/
├── resources.arsc
└── META-INF/ ← 由 apksigner 添加的签名信息
├── CERT.RSA
├── CERT.SF
└── MANIFEST.MF
七、uber-apk-signer — 一键签名 APK 的工具包
uber-apk-signer
是一个 开源的多功能一键签名工具,封装了:
zipalign
apksigner
签名算法支持(v1/v2)
自动识别未签名 APK 并签名
支持批量签名多个 APK
适用于不想每次都敲复杂参数的用户,适合自动化脚本、CI/CD 或渗透测试打包。
特点:跨平台(Java 编写)、开箱即用、无需自己写 zipalign + sign 脚本
下载地址:https://github.com/patrickfav/uber-apk-signer/releases
下载得到一个 JAR 包,如:uber-apk-signer-x.x.x.jar
1. 基本用法
签名单个 APK(最常见)
java -jar uber-apk-signer.jar --apk your.apk
批量签名目录下所有 APK
java -jar uber-apk-signer.jar --apks /path/to/your/apks/
会自动生成输出文件夹:
output/signed
: 已签名 APKoutput/unsigned
: 无法签名或跳过的 APKoutput/aligned
: zipalign 后的 APK
2. 常用参数说明
java -jar uber-apk-signer.jar [options]
参数 | 说明 |
---|---|
--apk |
指定单个 APK |
--apks |
指定目录批量签名所有 APK |
--ks |
指定 keystore(可选) |
--ksAlias |
指定 alias 名(默认:key0 ) |
--ksPass |
keystore 密码 |
--ksKeyPass |
alias 密码 |
--v1 |
启用 v1 签名(默认启用) |
--v2 |
启用 v2 签名(默认启用) |
--sign |
启用签名(默认启用) |
--zipAlign |
启用 zipalign 对齐(默认启用) |
--overwrite |
允许覆盖原 APK(默认 false) |
--output |
设置输出目录(默认 output/ ) |
示例 1:快速签名 + 对齐 APK
java -jar uber-apk-signer.jar --apk my.apk
自动输出到:output/signed/my-aligned-signed.apk
示例 2:指定 keystore 手动签名
java -jar uber-apk-signer.jar --apk my.apk --ks my.keystore --ksAlias mykey --ksPass 123456 --ksKeyPass 123456
示例 3:批量签名 APK 文件夹
java -jar uber-apk-signer.jar --apks ./build/apks/
3. 输出目录结构
签名后会自动生成以下目录:
output/
├── signed/ # 成功签名且 zipalign 的 APK
├── unsigned/ # 无法签名的 APK
├── aligned/ # zipalign 后的 APK(可选)
├── reports/ # 每个 APK 的签名日志报告(包含 v1/v2 检查)
uber-apk-signer
自动签名+对齐流程:
unsigned.apk
↓(java -jar uber-apk-signer.jar -a unsigned.apk)
自动签名 + zipalign + v1/v2签名校验
↓
output/
├── aligned-debugSigned.apk ← 成功签名对齐后的 APK(可安装)
├── aligned-debugSigned-aligned.apk
├── aligned-debugSigned.apk.idsig
├── log.txt ← 操作日志
作用说明:
功能 | 说明 |
---|---|
自动对齐(zipalign) | 内部已集成 zipalign ,无需单独执行 |
自动签名(apksigner) | 使用默认 debug 签名或自定义 keystore |
支持签名校验 | 自动验证 V1/V2 签名完整性 |
操作简单 | 只需要一个命令即可完成全部流程 |
使用流程结构图总结:
unsigned.apk
↓(uber-apk-signer)
自动完成以下步骤:
- 对齐(zipalign)
- 签名(默认 debug / 自定义 keystore)
- 校验签名完整性
↓
output/aligned-debugSigned.apk(最终可安装)
4. 常见使用流程
# 解包 + 修改 APK
apktool b app/ -o unsigned.apk
# 使用 uber-apk-signer 签名 + 对齐
java -jar uber-apk-signer.jar --apk unsigned.apk
八、JD-GUI — Java 字节码查看工具
JD-GUI(Java Decompiler GUI) 是一款跨平台的 Java 字节码反编译查看器,能把 .class
文件反编译为接近原始的 Java 源码。
主要用于查看 JAR 文件中反编译的 Java 源码
和
dex2jar
配合使用,可反编译 APK 中的 DEX → JAR → Java 源码属于 图形化工具,没有常规命令行参数
下载地址:https://github.com/java-decompiler/jd-gui/releases
功能特点
功能 | 描述 |
---|---|
支持 JAR 反编译 | 查看 Java 代码结构 |
导出源码 ZIP | 可将 .java 文件导出压缩包 |
GUI 图形界面 | 无需命令行操作 |
多平台支持 | Windows / macOS / Linux |
无需依赖 | 单一 .jar 文件即可运行 |
启动方式
JD-GUI
本身没有 CLI 命令,通过 Java 启动:
java -jar jd-gui.jar
然后通过界面操作打开 JAR 文件。
导出源码(在 GUI 内)
JD-GUI 顶部菜单栏 → File → Save All Sources→ 导出为 ZIP 包,里面是完整的 .java
源码。
1. 典型工作流程
APK --> DEX --> JAR --> JD-GUI 查看源码
↑ ↑
apktool dex2jar
2. 配套使用流程
第 1 步:使用 dex2jar
将 classes.dex
转为 JAR
d2j-dex2jar.sh classes.dex -o classes.jar
或者:
d2j-dex2jar.bat classes.dex
第 2 步:用 JD-GUI
打开 classes.jar
# 打开 JD-GUI 图形界面
./jd-gui
在图形界面中打开 classes.jar
,即可查看 Java 源码。支持:
导出所有源码为 ZIP(带
.java
文件)查找类、包、函数
直接浏览 Java 类结构
3. 搭配使用工具
步骤 | 工具 | 作用 |
---|---|---|
1 | apktool |
解包 APK 提取 classes.dex |
2 | dex2jar |
把 classes.dex 转成 .jar |
3 | JD-GUI |
查看 .jar 文件源码结构 |
4 | jadx-gui (可选) |
替代 JD-GUI,直接支持 DEX 查看源码 |
4. 结构流程图
JD-GUI
查看 Java 源码的流程图:
APK 文件
↓(dex2jar classes.dex → classes-dex2jar.jar)
转换为 Jar 文件
↓(JD-GUI 打开 classes-dex2jar.jar)
反编译成 Java 源码(只读,不可编辑)
JD-GUI 使用结构图总结(完整流程):
APK 文件
↓(解包提取 classes.dex)
classes.dex
↓(dex2jar classes.dex)
classes-dex2jar.jar
↓(JD-GUI 打开)
Java 源码(反编译查看,可另存为 .java)
可视化输出示例:
classes-dex2jar.jar
├── com/
│ └── example/
│ └── app/
│ └── MainActivity.class
(JD-GUI 中自动显示为 Java 源码)
5. 关于 .
class文件
.class
是 Java 编译器(javac) 生成的字节码文件,运行于 JVM(Java 虚拟机).dex
是 Android 编译器(dx/d8) 将多个.class
转换后生成的,运行于 Android 虚拟机(Dalvik/ART)
对比表格
对比项 | .class 文件 |
.dex 文件 |
---|---|---|
来源 | javac Hello.java |
dx --dex classes/ |
平台 | Java 平台(JVM) | Android 平台(ART/Dalvik) |
结构 | 每个类一个 .class |
所有类打包成一个或多个 .dex |
是否可反编译 | 是(如用 JD-GUI) | 是(用 jadx、dex2jar) |
用途 | Java 程序执行 | Android 应用执行 |
转换关系 | .java → .class |
.class → .dex |
转换流程
Java源码
↓ javac
.class(JVM字节码)
↓ dx/d8 编译器
.dex(Android字节码)
↓ 打包进 APK
APK(最终安装包)
如何从 APK 中提取 .class
?
需要先反编译:
提取
classes.dex
(用apktool
或直接解压)转换为 JAR(用
dex2jar
或enjarify
)用
JD-GUI
查看.class
内容或导出.java
6. 关于 .
jar文件
.class
是单个 Java 字节码文件,而 .jar
是一组 .class
+ 资源文件打包成的归档文件(Java Archive)。
文件类型 | 是什么? | 举例 |
---|---|---|
.class |
编译后的单个 Java 字节码文件 | Hello.class |
.jar |
包含多个 .class 和资源的压缩包 |
myapp.jar |
示例说明
假设有这个 Java 代码:
// Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
编译生成 .class
javac Hello.java
# 生成 Hello.class
打包成 .jar
jar cf hello.jar Hello.class
# 生成 hello.jar(里面含有 Hello.class)
可以直接解压 .jar
查看:
unzip hello.jar
# 会看到 Hello.class
.jar
内部结构
.jar
文件本质上是一个 ZIP 文件,里面内容可能包括:
.class
文件(编译后的 Java 类)META-INF/MANIFEST.MF
(清单)图片、配置文件、XML 等资源
常见用途
目的 | 工具 / 命令 |
---|---|
解压 .jar 查看 .class |
unzip xxx.jar |
查看 .class 内容 |
JD-GUI 、jadx |
从 .dex 生成 .jar |
dex2jar 、enjarify |
将 .java 编译为 .class |
javac |
将 .class 打包为 .jar |
jar 命令 |
APK 反编译完整流程图
+-----------------------------+
| APK 文件 |
+-----------------------------+
|
+---------------+----------------+
| |
apktool dex2jar
(资源+smali) (dex → jar)
| |
+--v--+ +---v---+
|smali| | .jar |
|代码 | | 文件 |
+--+--+ +---+---+
| |
| JD-GUI 查看源码
v
baksmali(反汇编)
smali(汇编)
工具作用解释
工具名 | 作用说明 |
---|---|
apktool |
解包 APK,提取资源文件 + 把 classes.dex 变成 smali 汇编格式(可修改) |
smali |
Android 的字节码汇编语言(类似汇编) |
baksmali |
把 .dex 文件反编译成 .smali 代码(可读、可修改) |
dex2jar |
把 .dex 转换为 .jar ,以供 JD-GUI 查看 Java 源码 |
JD-GUI |
图形化工具,浏览 .jar 文件中反编译出来的 Java 源码 |
如果只想查看源码:
APK → DEX(自动提取) → JAR(用 dex2jar) → JD-GUI 查看源码
适合目标:快速阅读 Java 逻辑、分析加密函数、爬虫逆向等。
jadx-gui
可以直接从 APK → Java 源码,无需中间转 .jar
,适合快速预览。
如果想修改代码再重新打包 APK:
APK → apktool 解包 → smali 修改代码 → apktool 打包 APK → 签名(apksigner)→ 安装
适合目标:功能修改、广告去除、HOOK 插桩、绕过检测等。