关于 APK 反编译与重构工具集

一、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 → JARdex2jar
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.apkmyapp-dex2jar.jar
classes.dexclasses-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

常见用途

工具用途
baksmaliDEX → smali(反汇编)
smalismali → 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 2invoke-static {}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)Ireturn-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

可选参数:

参数说明
--kskeystore 文件路径
--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. 参数总览表

参数说明
--kskeystore 文件路径
--ks-key-aliasalias 名
--ks-pass pass:123456keystore 密码
--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: 已签名 APK

  • output/unsigned: 无法签名或跳过的 APK

  • output/aligned: zipalign 后的 APK

2. 常用参数说明

java -jar uber-apk-signer.jar [options]
参数说明
--apk指定单个 APK
--apks指定目录批量签名所有 APK
--ks指定 keystore(可选)
--ksAlias指定 alias 名(默认:key0
--ksPasskeystore 密码
--ksKeyPassalias 密码
--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 步:使用 dex2jarclasses.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. 搭配使用工具

步骤工具作用
1apktool解包 APK 提取 classes.dex
2dex2jarclasses.dex 转成 .jar
3JD-GUI查看 .jar 文件源码结构
4jadx-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文件

  • .classJava 编译器(javac) 生成的字节码文件,运行于 JVM(Java 虚拟机)

  • .dexAndroid 编译器(dx/d8) 将多个 .class 转换后生成的,运行于 Android 虚拟机(Dalvik/ART)

对比表格

对比项.class 文件.dex 文件
来源javac Hello.javadx --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

需要先反编译:

  1. 提取 classes.dex(用 apktool 或直接解压)

  2. 转换为 JAR(用 dex2jarenjarify

  3. 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 查看 .classunzip xxx.jar
查看 .class 内容JD-GUIjadx
.dex 生成 .jardex2jarenjarify
.java 编译为 .classjavac
.class 打包为 .jarjar 命令

APK 反编译完整流程图

          +-----------------------------+|          APK 文件           |+-----------------------------+|+---------------+----------------+|                                |
apktool                           dex2jar
(资源+smali)                       (dex → jar)|                                |+--v--+                         +---v---+|smali|                         | .jar  ||代码 |                         | 文件  |+--+--+                         +---+---+|                                ||                           JD-GUI 查看源码v
baksmali(反汇编)
smali(汇编)

工具作用解释 

工具名作用说明
apktool解包 APK,提取资源文件 + 把 classes.dex 变成 smali 汇编格式(可修改)
smaliAndroid 的字节码汇编语言(类似汇编)
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 插桩、绕过检测等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[解决方案] Word转PDF

背景&#xff1a; 之前做过一些pdf导出&#xff0c; 客户提了一个特别急的需求&#xff0c; 要求根据一个模版跟一个csv的数据源&#xff0c; 批量生成PDF&#xff0c; 因为之前用过FOP&#xff0c; 知道调整样式需要特别长的时间&#xff0c; 这个需求又特别急&#xff0c; 所…

01 基本介绍及Pod基础

01 查看各种资源 01-1 查看K8s集群的内置资源 [rootmaster01 ~]# kubectl api-resources NAME SHORTNAMES APIVERSION NAMESPACED KIND bindings v1 …

19 C 语言位运算、赋值、条件、逗号运算符详解:涵盖运算符优先级与复杂表达式计算过程分析

1 位运算符 位运算符是对整数的二进制表示&#xff08;补码形式&#xff09;进行逐位操作的运算符。以下是主要的位运算符及其功能描述&#xff1a; 运算符描述操作数个数副作用&按位与2无|按位或2无^按位异或2无~按位取反1无<<按位左移2无>>按位右移2无 1.1…

哈希查找方法

已知哈希表长度为11&#xff0c;哈希函数为H&#xff08;key&#xff09;&#xff1d;key&#xff05;11&#xff0c;随机产生待散列的小于50的8个元素&#xff0c;同时采用线性探测再散列的方法处理冲突。任意输入要查找的数据&#xff0c;无论是否找到均给出提示信息。 int f…

JavaScript性能优化实战(10):前端框架性能优化深度解析

引言 React、Vue、Angular等框架虽然提供了强大的抽象和开发效率,但不恰当的使用方式会导致严重的性能问题,针对这些问题,本文将深入探讨前端框架性能优化的核心技术和最佳实践。 React性能优化核心技术 React通过虚拟DOM和高效的渲染机制提供了出色的性能,但当应用规模…

类和对象------2

目录 一. C面向对象模型初探1 .成员变量和函数的存储 二 this指针1 &#xff09;this指针工作原理2 &#xff09;this指针的使用3&#xff09; const修饰成员函数4 &#xff09;const修饰对象(常对象) 3.友元1 )友元语法2) 课堂练习 4 强化训练(数组类封装) 四 运算符重载&…

量子计算在金融科技中的应用前景

随着量子计算技术的飞速发展&#xff0c;其在各行业的应用潜力逐渐显现&#xff0c;金融科技领域更是备受关注。量子计算的强大计算能力有望为金融行业带来前所未有的变革&#xff0c;从风险评估到投资组合优化&#xff0c;从高频交易到加密技术&#xff0c;量子计算都可能成为…

Redisson 四大核心机制实现原理详解

一、可重入锁&#xff08;Reentrant Lock&#xff09; 可重入锁是什么&#xff1f; 通俗定义 可重入锁类似于一把“智能锁”&#xff0c;它能识别当前的锁持有者是否是当前线程&#xff1a; 如果是&#xff0c;则允许线程重复获取锁&#xff08;重入&#xff09;&#xff0c;并…

srs-7.0 支持obs推webrtc流

demo演示 官方教程: https://ossrs.net/lts/zh-cn/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP 实现原理就是通过WHIP协议来传输 SDP信息 1、运行 ./objs/srs -c conf/rtc.conf 2、obs推流 3、web端播放webrtc流 打开web:ht

面试题——JDBC|Maven|Spring的IOC思想|DI思想|SpringMVC

目录 一、JDBC 1、jdbc连接数据库的基本步骤&#xff08;掌握**&#xff09; 2、Statement和PreparedStatement的区别 &#xff08;掌握***&#xff09; 二、Maven 1、maven的作用 2、maven 如何排除依赖 3、maven scope作用域有哪些&#xff1f; 三、Spring的IOC思想 …

从代码学习数学优化算法 - 拉格朗日松弛 Python版

文章目录 前言1. 问题定义 (Problem Definition)2. 拉格朗日松弛 (Lagrangian Relaxation)3. 拉格朗日对偶问题 (Lagrangian Dual)4. 次梯度优化 (Subgradient Optimization)5. Python 代码实现导入库和问题定义辅助函数:求解拉格朗日松弛子问题次梯度优化主循环结果展示与绘图…

密码学实验

密码学实验二 一、实验目的&#xff08;本次实验所涉及并要求掌握的知识点&#xff09; 掌握RSA算法的基本原理并根据给出的RSA算法简单的实现代码源程序,以及能够使用RSA对文件进行加密。掌握素性测试的基本原理&#xff0c;并且会使用Python进行简单的素性测试以及初步理解…

力扣面试150题-- 从中序与后序遍历序列构造二叉树

Day 44 题目描述 思路 这题类似与昨天那题&#xff0c;首先来复习一下&#xff0c;后序遍历&#xff0c;对于后序遍历每一个元素都满足以下规律&#xff1a; &#xff08;左子树&#xff09;&#xff08;右子树&#xff09;&#xff08;根&#xff09;&#xff0c;那么我们直…

2区组的2水平析因实验的混区设计

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著傅珏生译)第7章2k析因的区组化和混区设计第7.4节的python解决方案。本文尽量避免重复书中的理论&#xff0c;着于提供python解决方案&#xff0c;并与原书的运算结果进行对比。您可以从Detail 下载实验设计与分析…

反向传播算法——矩阵形式递推公式——ReLU传递函数

总结反向传播算法。 来源于https://udlbook.github.io/udlbook/&#xff0c;我不明白初始不从 x 0 \boldsymbol{x}_0 x0​开始&#xff0c;而是从 z 0 \boldsymbol{z}_0 z0​开始&#xff0c;不知道怎么想的。 考虑一个深度神经网络 g [ x i , ϕ ] g[\boldsymbol{x}_i, \bold…

2025年PMP 学习二十三 16章 高级项目管理

2025年PMP 学习二十三 16章 高级项目管理 文章目录 2025年PMP 学习二十三 16章 高级项目管理高级项目管理战略管理战略管理的组成要素&#xff1a;企业战略转化为战略行动的阶段&#xff1a; 组织战略类型战略组织类型组织级项目管理OPM&#xff08;公司项目管理&#xff09; 组…

Journal of Real-Time Image Processing 投稿过程

投稿要求双栏12页以内(包括参考文献)&#xff0c;这个排版要求感觉不是很严格&#xff0c;我当时就是用普通的双栏的格式去拍的版&#xff0c;然后就提交了&#xff0c;也没单独去下载模版。 投稿过程 12.12 Submission received 12.12 Submission is under technical check 1…

t检验详解:原理、类型与应用指南

t检验详解&#xff1a;原理、类型与应用指南 t检验&#xff08;t-test&#xff09;是一种用于比较两组数据均值是否存在显著差异的统计方法&#xff0c;适用于数据近似正态分布且满足方差齐性的场景。以下从核心原理、检验类型、实施步骤到实际应用进行系统解析。 一、t检验的…

Web4X·AI实业未来家庭普及产品矩阵

Web4XAI实业未来家庭普及产品矩阵 > 打造一个“AI能干活、人更自由”的超级生活系统&#xff08;web4-web4.0&#xff09; 一、AI生活服务类 1、代表产品&#xff1a;  AI语音助手&#xff08;对话、提醒、天气、家庭调度&#xff09;  AI陪护机器人&#xff08;老…

Centos上搭建 OpenResty

一、OpenResty简介 OpenResty 是基于 Nginx 的扩展平台&#xff0c;完全兼容 Nginx 的核心功能&#xff08;如 HTTP 服务和反向代理&#xff09;&#xff0c;同时通过内嵌 LuaJIT 支持&#xff0c;允许开发者用 Lua 脚本灵活扩展业务逻辑。它简化了动态逻辑的实现。 二、安装…