一、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 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
可選參數:
參數 | 說明 |
---|---|
--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
: 已簽名 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 ) |
--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 插樁、繞過檢測等。