
做 Android 逆向或者開發(fā)調試時手里只有一個 APK 卻沒有源碼很多人第一反應就是“反編譯”。JADX 這個工具在我用過的一堆方案里算是體驗最省心的下載、安裝、把 APK 拖進去Java 源碼就出來了。這篇教程我打算把 JADX 的下載、安裝和首次使用從頭到尾捋一遍從下載渠道到環(huán)境變量再到常見報錯全部按實際操作來寫。哪怕你之前沒碰過逆向照著這篇走完也能把 JADX 跑起來。先說明一下教程里的“附安裝包”不是說我在文末塞了一個網盤鏈接。JADX 更新速度不慢網盤里的版本很快就會過時還可能被第三方改動。我建議你直接去官方 GitHub Releases 頁面下載最新版我會把每個平臺該選哪個文件、下載之后怎么校驗、怎么安裝都寫清楚。老規(guī)矩只反編譯你自己有權限分析的 APK這既是對原作者的尊重也是這一行能持續(xù)下去的基礎。1. 下載前的工具認知JADX 憑什么值得裝1.1 一個 APK 在 JADX 里能變成什么JADX 全稱是 Java Android Decompiler名字很直白。它的核心功能就是把 Android 應用安裝包里的 dex 字節(jié)碼轉換成我們可以讀的 Java 源碼。過去傳統(tǒng)方案是先用 dex2jar 把 dex 轉成 jar再用 JD-GUI 打開 jar 看代碼中間一旦遇到多 dex 或者復雜的字符串加密就容易斷在某個環(huán)節(jié)。JADX 把這些步驟合并成了一個動作直接把 .apk 拖進窗口等待進度條走完左側是包名樹右側就是還原出來的 Java 代碼。JADX 能看到的還不止代碼。AndroidManifest.xml、資源索引值、布局 XML、圖片資源、字符串資源它都會幫你整理好。對于大多數做分析的人來說這意味著一個工具就能覆蓋“看入口、看權限、看邏輯、看資源”的完整鏈路不用在多個軟件之間來回切換。尤其是剛入行的朋友第一次把 APK 拖進 JADX看到完整源碼的瞬間基本都會覺得這個工具值得裝。1.2 和 dex2jar JD-GUI 那套老組合比優(yōu)勢在哪如果只用一句話概括我會說 JADX 把“看代碼”這個核心體驗做到了極致。JD-GUI 看反編譯結果時經常會出現變量名退化成 a、b、c 之類或者代碼結構錯亂的情況JADX 在語法還原上更接近編譯器源碼。它對匿名內部類、lambda、switch 字符串哈希的處理都做了優(yōu)化分析業(yè)務邏輯的時候干擾少很多。拿我自己的一個體驗來說以前用 dex2jar 處理好幾個 dex 的 App 時經常要手動 merge類重復定義的問題能把人逼瘋。JADX 會自動合并所有 dex類名沖突的也會保留并標注。這一點在分析微信、淘寶這種大型應用時尤其重要。下表是我自己常用的幾個工具橫向對比方便你選型工具組合能否直接出源碼資源處理上手難度適合場景JADX能一般可看可導出低快速分析業(yè)務邏輯、找入口、導出工程dex2jar JD-GUI能步驟多弱中老項目、臨時看某個類apktool不能只出 smali強可重打包中修改資源、改包名、小改動回編譯GDA能較弱中高偏移動安全審計需要多維度調試平時我把 JADX 當主力閱讀工具遇到需要改資源再回編的情況才會搬出 apktool。如果某個 App 做了很強的代碼混淆JADX 依然能給你一個可讀的框架只是具體邏輯會像“被揉碎的紙片”這時候就要配合 smali 和動態(tài)調試繼續(xù)往下追了這一點后面會單獨講。2. 下載安裝前的環(huán)境準備2.1 到哪兒下載靠譜版本JADX 的官方發(fā)布地址在 GitHub 上項目名是 skylot/jadx。我不建議在搜索引擎首頁隨便點“高速下載”原因很簡單這種會被 SEO 優(yōu)化過的頁面經常帶捆綁軟件你還沒裝上 JADX先被安裝上一堆全家桶。正確做法是打開 GitHub Releases 頁面認準發(fā)布的 tag一般形式是 v1.5.x。頁面里會列出當前版本的發(fā)行包常見的有jadx-x.x.x.zip # 通用壓縮包Windows / macOS / Linux 都能用 jadx-x.x.x.msi # Windows 安裝程序 jadx-x.x.x.dmg # macOS 磁盤映像 jadx-x.x.x.tgz # Linux 壓縮包選好文件后如果下載慢可以找找有沒有鏡像源但務必保證文件校驗值和官方發(fā)布的一致。官方頁面一般會提供 SHA256 散列值下載完之后用 PowerShell 或終端算一遍比對一致再解壓。這一步看著麻煩卻能過濾掉絕大多數第三方改包。Windows 下校驗 SHA256 的命令是Get-FileHash .\jadx-1.5.1.zip -Algorithm SHA256macOS 和 Linux 用自帶的shasum -a 256或sha256sum就能算。比對結果那串字符串和官方發(fā)布頁是否一致一致再繼續(xù)這是我多年下載工具養(yǎng)成的習慣。2.2 Java 環(huán)境檢查與安裝JADX 是用 Java 寫的運行它必須要有 Java 運行時環(huán)境而且不是隨便一個舊版本都行。當前主流 JADX 版本要求 Java 11 及以上我本機用的是 OpenJDK 17跑 1.5.x 沒有任何問題。檢查方法很簡單打開終端窗口輸入java -version如果系統(tǒng)提示找不到 java或者顯示版本是 1.8那就要先去裝一個 JDK。發(fā)行版不限Oracle JDK、Eclipse Temurin、Zulu、騰訊 Kona 都可以選一個比較全的開源版本安裝。安裝完之后關鍵一步是配環(huán)境變量Windows 用戶在系統(tǒng)變量里新建JAVA_HOME指向 JDK 安裝目錄然后把%JAVA_HOME%\bin追加到Path。macOS 用戶裝完 .pkg 一般會自動配置好Linux 用戶根據自己的包管理器安裝即可。這里有一個經驗如果你電腦上已經裝過 Android Studio那么往往已經自帶 JBRJetBrains RuntimeJADX 大概率能直接覆蓋以前的版本。但如果你同時裝了多個 Java 版本終端里的java -version顯示的可能不是你想用的那個后續(xù)啟動 JADX 報版本不足時優(yōu)先檢查這里。還有一個小技巧很多系統(tǒng)自帶 Java 配置管理命令Windows 可以用where javamacOS/Linux 可以用which java來確認實際生效的是哪個路徑。2.3 把命令行工具加進 PATH可選JADX 安裝包里其實帶了兩套入口圖形界面jadx-gui和命令行jadx。日常拖 APK 看代碼用 GUI 就夠了但如果你想寫腳本批量反編譯或者通過命令行導出工程就需要把bin目錄加進 PATH。Windows 下解壓后的目錄假定是D:\tools\jadx-1.5.1那么在“系統(tǒng)屬性 - 環(huán)境變量”里找到Path新增一行D:\tools\jadx-1.5.1\bin。macOS/Linux 下直接把解壓目錄里的bin做成軟鏈接或者把這一行寫進.bashrc/.zshrcexport PATH$HOME/tools/jadx-1.5.1/bin:$PATH配好之后重新打開終端輸入jadx --version能看到版本號就說明環(huán)境沒有問題了。這一步不是必須的但配好之后會讓后面的命令行操作順滑不少。尤其是后面講批量反編譯的時候不用每次都敲一長串絕對路徑體驗完全不同。3. JADX 安裝全過程圖文拆解3.1 Windows 用戶zip 包免安裝玩法我第一次用 JADX 的時候選的就是 zip 包原因是不需要注冊表和安裝記錄解壓就能用。具體流程如下下載jadx-x.x.x.zip建議放到一個不含中文和空格的路徑下比如D:\tools\jadx-1.5.1因為后面的腳本對路徑里的特殊字符可能會出問題。右鍵壓縮包選擇“解壓到當前文件夾”完成后你會看到類似這樣的目錄結構D:\tools\jadx-1.5.1 │ ├─ bin │ ├─ jadx.bat │ ├─ jadx-gui.bat │ └─ jadx-gui │ └─ lib ├─ jadx-1.5.1.jar └─ ...打開bin目錄雙擊jadx-gui.bat稍等一兩秒會彈出一個深色主題的主窗口。如果雙擊后沒有任何反應或者屏幕閃了一下就沒了大概率是 Java 環(huán)境的問題。你先打開一個 cmd 窗口手動切到bin目錄執(zhí)行jadx-gui.bat這樣屏幕上會留下具體的報錯信息排查起來會清楚很多。等窗口啟動成功后頂部菜單是File、View、Navigation、Tools這些標準菜單界面布局非常接近常見的 IDE幾乎不需要學習成本。首次使用我建議先隨便找一個 APK 打開滾動一下源碼面板感受一下字體和配色不喜歡就去View - Theme里換主題。3.2 Windows 用戶MSI 安裝包玩法如果你習慣像裝普通軟件一樣點“下一步”那選 MSI 安裝包。雙擊運行安裝向導一路 Next到選擇安裝目錄那一步仍然建議改成純英文路徑。安裝完成后開始菜單里會多出來一個 JADX 文件夾里面有jadx和jadx-gui兩個快捷方式。MSI 版的好處是它會自動把相關命令注冊好你不需要手動配 PATH缺點是卸載和更新的時候某些殺毒軟件可能會把它當成可疑程序。遇到這種情況不用慌把jadx-gui.exe或者安裝目錄加入殺毒軟件的信任列表就行。另外MSI 安裝的版本如果以后要卸載記得別直接刪安裝目錄不然注冊表里留一堆垃圾。去“設置 - 應用 - 已安裝的應用”找到 JADX 再卸載順便能把 JADX 的緩存文件清理干凈。這樣下次裝新版時不會出現環(huán)境沖突。3.3 macOS 用戶DMG 拖拽安裝macOS 下打開下載的.dmg文件系統(tǒng)會掛載出一個磁盤映像窗口里面一般有一個 JADX 應用圖標和一個 Applications 文件夾的替身。你只需要把 JADX 圖標拖到 Applications 文件夾里就完成了安裝。首次啟動時如果提示“無法打開因為 Apple 無法檢查其是否包含惡意軟件”去“系統(tǒng)偏好設置 - 安全性與隱私 - 通用”頁面點擊“仍要打開”即可。如果連這個按鈕都沒有可以在終端里執(zhí)行xattr -dr com.apple.quarantine /Applications/jadx-gui.app之后再啟動就不會被攔了。需要注意的是 macOS 版的 GUI 入口其實是jadx-gui這個可執(zhí)行腳本如果你想把命令行工具軟鏈到/usr/local/bin可以直接鏈過去。不少 macOS 用戶還習慣用 Homebrew 安裝 JADX命令是brew install jadx這種方式能自動處理 Java 依賴但版本更新可能略晚于官方 GitHub Release怎么方便怎么來。3.4 Linux 用戶tgz 包快速部署Linux 用戶下載.tgz壓縮包或.zip都行解壓后進入目錄給 bin 下的腳本加上執(zhí)行權限chmod x bin/jadx bin/jadx-gui ./bin/jadx-gui如果你是在無桌面環(huán)境的服務器上使用那就用命令行版./bin/jadx app.apk反編譯結果會輸出到指定目錄。我經常在遠程機器上跑批量反編譯再用 scp 把結果拉到本地用 GUI 翻這樣能省下不少本地內存。Linux 用戶還需要注意一點如果用的是精簡版系統(tǒng)可能缺少libgtk-3之類的圖形庫GUI 啟動會報錯。建議在帶桌面的發(fā)行版上直接運行服務器環(huán)境老老實實用命令行版就好。4. 第一次實戰(zhàn)從 APK 到 Java 源碼4.1 準備一個測試 APK學習階段不建議直接拿一個商業(yè) App 練手。你可以去 GitHub 上找一個開源項目的 debug APK或者用 Android Studio 自己打一個包。這樣做有好處第一代碼本來就能看到方便你對照 JADX 反編譯的結果準不準第二不會觸碰使用條款避免不必要的麻煩。如果確實要分析某個 App請確保你有足夠的授權或者是在合規(guī)的測試環(huán)境里進行。自己打測試包的時候我建議打開 Android Studio 的開發(fā)者選項里的“不壓縮庫文件”功能默認反編譯資源時就不會被壓縮干擾。如果你手頭連 Android Studio 都沒有也可以去一些開源社區(qū)找現成的 sample APK??傊葴蕚湟粋€小體積、結構簡單的包第一次運行會順很多。4.2 jadx-gui 的界面操作打開 GUI 之后File - Open file...選擇你要分析的 APK。文件會開始加載左下角的進度條會顯示解析到哪個階段。遇到大型 APK 時這一步可能持續(xù)幾十秒耐心等待就好不要反復點擊菜單。加載完成后左側是一個樹形結構按照包名層級展開右側顯示選中類對應的源碼。很多新手第一次看到這一屏會很興奮但要注意這個窗口不是簡簡單單的“源碼閱讀器”它還有很多實用功能藏得很深。常用的幾個操作按CtrlShiftF全局搜索字符串或類名這對定位某個頁面特別有用在左側樹里右鍵類名選擇Find Usage可以查看這個方法被誰調用頂部Tools菜單里還有反混淆重命名、保存為 Gradle project 等功能。我個人最常用的是Navigation - Search class by name輸入 Activity 名稱秒跳到目標類。如果你要找某個應用的主入口可以看AndroidManifest.xml里帶有MAIN和LAUNCHERaction 的 Activity再順著它往下翻 onCreate整個啟動流程就很清晰了。4.3 項目導出與命令行反編譯GUI 適合人工分析批量場景還是要靠命令行。先把完整命令貼出來jadx -d output_dir your_app.apk-d指定輸出目錄運行結束后輸出目錄里會有sources文件夾和resources文件夾前者是還原出來的 Java 源碼后者是資源文件。如果你想在 Android Studio 里導入繼續(xù)改源碼JADX 也支持導出 Gradle 工程GUI 里是File - Save as Gradle project...命令行參數是--export-gradle。用這種方式導出的工程結構和正經 Android 項目已經比較接近但不要指望能一行不改直接編譯官方文檔自己都說了“反編譯后的代碼只能作為參考”。這里還有一個非常實用的參數--show-bad-code遇到某些 JADX 無法完整還原的代碼塊時它會把這部分用近似代碼展示出來而不是直接留空。分析疑難樣本時我基本都會加上。命令行版的完整調用我常用的是jadx -d out --show-bad-code --no-res app.apk--no-res表示只反編譯代碼不導出資源文件速度會快很多。如果你只關心某個關鍵方法可以用--single-class來導出指定類減少無關干擾。5. 安裝和使用中的高頻問題與排查實錄5.1 雙擊 bat 閃退的排查套路Windows 上最容易遇到的問題就是雙擊jadx-gui.bat后黑色窗口一閃而過GUI 沒起來。絕大多數原因是 Java 沒裝好或者 Java 版本低于要求。首先要做的不是重裝而是用當前用戶的命令行窗口手動執(zhí)行這個 bat。命令行會顯示具體的錯誤如果提示java 不是內部或外部命令說明 Java 沒配置到 PATH如果提示UnsupportedClassVersionError說明版本不夠去裝 Java 11 以上的 JDK。還有一個常見坑用戶裝的是 32 位 JDK而系統(tǒng)是 64 位也可能導致啟動異常建議統(tǒng)一用 64 位版本。另外如果你把解壓路徑放在C:\Program Files這種帶空格和權限控制的目錄里也有概率遇到腳本找不到類路徑的問題。把整個 JADX 目錄移到D:\tools這種簡單路徑能省掉很多煩惱。還有一個容易被忽略的問題殺毒軟件實時防護。有的安全軟件會把jadx-gui.bat或java.exe的運行攔截掉導致界面閃退。去安全中心看攔截記錄把 JADX 目錄加白名單問題立刻消失。5.2 內存不足或卡在加載界面JADX 默認的 JVM 堆內存不是很大遇到幾十 MB 甚至上百 MB 的 APK會卡在解析 dex 的過程里甚至直接報OutOfMemoryError。解決辦法是修改腳本里的 JVM 參數。Windows 的jadx-gui.bat里會讀取一個環(huán)境變量JADX_OPTS你可以在系統(tǒng)環(huán)境變量里新增JADX_OPTS-Xmx2gmacOS/Linux 下同樣把JADX_OPTS導出后再啟動。-Xmx2g表示最大堆內存 2GB如果你內存富余可以設到 4g。調大之后大型應用反編譯的成功率會明顯提高。另外反編譯是 CPU 密集型任務多核機器可以加-j 0讓 JADX 自動使用所有可用核心速度提升非常明顯。如果你是在命令行版里跑直接寫jadx -j 0 -Xmx2g -d out app.apk注意JVM 參數要放在java命令后面而不是jadx后面所以通過環(huán)境變量來傳遞是最穩(wěn)妥的方式。5.3 中文注釋亂碼怎么處理有時反編譯出來的源碼里中文字符串全都變成了方塊或問號。這一般不是 JADX 的問題而是文件編碼沒有設置為 UTF-8。GUI 啟動時可以在jadx-gui.bat前加一行set JAVA_TOOL_OPTIONS-Dfile.encodingUTF-8或者在你的JADX_OPTS里補上-Dfile.encodingUTF-8。改完重啟工具字符串基本就能正常顯示了。某些資源文件本身就用了 GBK 編碼這時要看原始 APK 的情況JADX 會盡可能地按聲明編碼去解。這個問題在 Windows 中文系統(tǒng)上尤其常見因為系統(tǒng)默認代碼頁是 GBKJava 讀取文件時如果沒有顯式指定 UTF-8就會按系統(tǒng)默認編碼去解析。建議在環(huán)境變量里把JAVA_TOOL_OPTIONS和JADX_OPTS都加上 UTF-8 配置。修改完記得重啟終端和 JADX不然不生效。5.4 反編譯結果與源碼不一致正常嗎很多新人看到反編譯代碼和自己寫的源碼對不上會以為工具壞了。其實 JADX 本質上是在做“翻譯”它沒有原始符號表只能根據字節(jié)碼逆推。編譯器做過內聯、常量折疊、switch 優(yōu)化之后反編譯代碼和原來寫的多多少少會不一樣。遇到明顯不合理的邏輯可以先看看是不是混淆過的原因?;煜龝杨惷?、方法名改成 a、b、c甚至加入無用代碼JADX 再厲害也變不回人類命名的樣子。這時候有兩條路一是用 JADX 自帶的反混淆功能它會給變量重新起有意義的名稱二是對著 smali 逐行看雖然累但能看到最底層的東西。JADX 的反混淆功能在Tools - Deobfuscation菜單下它會嘗試根據上下文推斷變量含義但不能保證 100% 還原。對于嚴重混淆的代碼我更推薦 JADX 配合--deobf參數在命令行里導出時自動做反混淆效果比 GUI 里的默認選項好一截。還有一個規(guī)律如果反編譯后的代碼里頻繁出現goto或者異常 try/catch 嵌套往往說明源碼用了 ASM 字節(jié)碼插樁或者雙護城河加固這時候不要死磕 JADX換個動態(tài)分析的思路可能更高效。6. 我的實操心得與后續(xù)擴展6.1 讓 JADX 更好用的幾個小配置第一次打開 JADX你會覺得深色主題很酷但長時間看字會覺得累。我習慣在View - Theme里切到淺色主題再把字體調成等寬字體比如 JetBrains Mono 或 Consolas。遇到某個類源碼行數特別多時可以用View - Show Bytecode在源碼和字節(jié)碼之間快速切換定位到關鍵邏輯后再切回 Java 視圖這種閱讀效率比單純抱著反編譯源碼啃高很多。還有一個快捷鍵值得記住在左側樹里按類名首字母能快速跳到對應的類在源碼里按CtrlB可以直接跳轉到方法定義。GUI 默認會在啟動時加載上一次打開過的項目如果不希望泄露工作痕跡可以在Setting里關掉“Restore previous session”。我還會把Code area - Word wrap打開長行邏輯讀起來不用橫向拖滾動條。這些配置看起來都是小事但實際分析一整天代碼后體驗差別非常大。6.2 組合拳JADX apktool 動態(tài)調試JADX 不是萬能的。碰到需要修改資源再回編譯的場景我會用 apktool 解包和重打包碰到關鍵邏輯走不通時再用動態(tài)調試工具在系統(tǒng)層去驗證。一個典型流程是這樣先用 JADX 打開 APK定位到目標方法確認它最終調用了哪些 native 函數接著用 apktool 解包看看 so 文件在哪里最后用調試器 hook 一下參數看真正傳給 native 層的數據是不是 JADX 里看到的那樣。這套組合拳能覆蓋大多數逆向分析的常規(guī)需求而 JADX 在其中承擔的是“地圖”的角色先有地圖再去探索比直接深入底層高效得多。簡單說就是 JADX 負責靜態(tài)代碼閱讀apktool 負責資源修改和重打包動態(tài)調試負責驗證運行時行為。三者各司其職缺一不可。如果你是剛開始接觸可以把一個簡單的開源 App 從 JADX 到動態(tài)調試完整走一遍比看一百篇教程都有用。6.3 學習方向與合規(guī)提醒如果你是因為興趣開始接觸 JADX我建議把 Android 開發(fā)四大組件、dex 文件格式、smali 語法這三塊補一補。逆向分析不是只會按按鈕理解了底層數據結構和系統(tǒng)啟動流程你看到的反編譯代碼才會從“天書”變成“有邏輯的文檔”。同時也提醒一句反編譯別人的應用之前一定要確認授權邊界。你可以用它來分析自己開發(fā)的 App 的加固是否到位也可以用它做安全研究但不要拿 JADX 去竊取別人的核心代碼或繞過付費機制。工具本身沒有立場使用方式決定了它的價值。最后分享一個我個人的操作習慣每次更新 JADX 版本前我會先把舊版本目錄整個刪掉再用新版本重新跑一遍平時常用的那批 APK。JADX 的更新經常帶來反編譯邏輯的改進有些老版本里崩潰的樣本新版可能一次就解開了。留一臺干凈的環(huán)境能幫你更快發(fā)現新版本的脾氣。