關于 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.pswp.cn/diannao/83866.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83866.shtml
英文地址,請注明出處:http://en.pswp.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 腳本靈活擴展業務邏輯。它簡化了動態邏輯的實現。 二、安裝…