今天介紹一個很是好用的反編譯的工具 jadx 。jadx 的功能很是的強大,對我而言,基本上知足平常反編譯需求。java
jadx 優勢:git
這些優勢都讓 jadx 成爲我反編譯的第一選擇,它能夠處理大部分反編譯的需求,基本上是我反編譯工具的首選。github
接下來咱們就來看看,jadx 如何使用吧。算法
jadx 自己就是一個開源項目,源代碼已經在 Github 上開源了。c#
Jadx Github :設計模式
有興趣能夠直接 clone 源代碼,而後本地本身編譯。可是多數狀況下,咱們是須要一個編譯好的版本。編譯好的版本,能夠在 sourceforge 上下載到。多線程
sourceforge 下載 jadx。編輯器
直接下載最新版就能夠了,如今的最新版是 jadx-0.6.1 。下載好解壓以後,你會得到這樣的目錄結構:
對於 Mac 或者 Linux,使用 jadx-gui ,Windows 下就須要使用 jadx-gui.bat 了,雙擊能夠直接運行,若是有安全警告,忽略它就能夠了。(後文主要以 Mac 環境爲講解,Windows 下的大部分操做都是相似的)
前面提到,直接雙擊 jadx-gui 就能夠直接運行。運行以後,會啓動一個 terminal ,在這裏你能夠看到你全部操做的輸出,錯誤日誌也會輸出在這裏。
打開以後,你能夠選擇一個 apk、dex、jar、zip、class、aar 文件,能夠看到 jadx 支持的格式仍是挺多的,基本上編譯成 Java 虛擬機能識別的字節碼,它均可以進行反編譯。除了選擇一個文件,還能夠直接將 apk 文件,拖拽進去,這一點很是好用。
我隨便找了一個手邊的 Apk ,丟進去,看看反編譯後的效果。
這裏面就是反編譯後的代碼了,對於 apk 而言,一些 xml 的資源,也一併被反編譯還原回來了,很是的方便。
jadx 使用起來很是的方便,而提供的 gui 程序,也很好用。下面開始介紹 jadx-gui 程序的一些好用的技巧。
jadx 提供的搜索功能,很是強大,並且搜索速度也不慢。
你能夠點擊 Navigation -> Text Search 或者 Navigation -> Class Search 激活它,更方便的仍是快捷鍵,我本機的快捷鍵是 control + shift + f
,這個就因人而異了。
jadx 的搜索,支持四種維度,Class、Method、Field、Code,咱們能夠根據咱們搜索的內容進行勾選,範圍最大的就是 Code ,基本上就是文本匹配搜索。這裏反編譯的 Apk 集成了支付寶支付,因此能搜到 alipay 的內容。
有時候找到關鍵代碼了,還想看看在哪些地方調用或者引用了它。
jadx 也提供了這方面的支持,找到咱們須要查看的類或者方法,選中點擊右鍵,選擇 Find Usage。
以後,它就會幫你搜索出,在這個項目中,哪些地方引用了它。
點擊就能夠直接跳轉過去,很是的方便。
通常 Apk 在發佈出去以前,都是會被混淆的,這基本上國內 App 的標配。這樣一個類,最終會被混淆成 a.b.c ,方法也會變成 a.b.c.a() ,這樣其實很是不利於咱們閱讀。咱們很難看到一個 a.java 的文件,就肯定它是哪個,還須要根據包名來區分。
而 deobfusation 功能,能夠爲它們其一個特殊的名字,這樣它在這個項目中,名字就惟一了,方便咱們識別和搜索。
這個功能能夠在 Tools -> deobfusation 中激活。
接下來來看看它的效果。
開啓 deobfusation 以後的效果以下:
能夠看到,a 變成了 p003a。不知道這樣看你以爲有方便一些嗎?
雖然,jadx-gui 能夠直接閱讀代碼,仍是很方便的。可是畢竟沒有咱們常見的編輯器來的方便。而正好 jadx 還支持將反編譯後的項目,直接導出成一個 Gradle 編譯的工程。
能夠經過 File -> Save as gradle project 來激活這個功能。
最終輸出的目錄,是能夠直接經過 Android Studio 打開的。
不過雖然 AS 能夠直接打開它,可是大多數狀況下你是編譯不起來的。可是這樣的功能,主要是爲了藉助 AS 強大的 IDE 功能,例如方法跳轉、引用搜索等等,讓咱們閱讀起來更方便。
jadx 在使用過程當中,也會有一些錯誤狀況,這裏總結一些比較常見的錯誤。
有時候有代碼,反編譯的不完整,你會看到 JADX WARNING : inconsistent code 標誌的錯誤。
這一段代碼,就已經不是 Java 的代碼了,不利於咱們的閱讀。而 jadx 爲了應對這樣的狀況,能夠嘗試開啓 Show inconsistent code 開關。你能夠在 File -> Preferences 中找到它。
開啓 inconsistent code 以後,咱們再來看看這段代碼,就感受親切了。
這樣處理的代碼,大部分爲僞代碼,可能會有錯誤的地方,具體問題具體分析吧。
Preferences 中,還有不少開關,有興趣的能夠自行摸索一下。
jadx 反編譯一些小的 Apk,一點壓力都沒有,可是對於一些比較重的 Apk,通常 Apk 大於 50MB 的,你均可能遇到使用 jadx 反編譯的時候卡死的問題。
若是你看了 terminal 中 Log 輸出,你應該能夠發現,實際上它是由於 OOM 引發的。
官方對於這樣由於內存不足引起的問題,也提供了一些解決方案。
一、減小處理的線程數。
jadx 爲了加快編譯的效率,因此是使用多線程處理的,而多個線程會耗費跟多的內存。因此減少反編譯時候的線程數,是一個有效的方法。
若是使用命令行的話,可使用 -j 1
參數,配置線程數爲 1,不配置的話,默認線程數爲 4。
而使用 jadx-gui 的話,能夠在 Preferences 中,經過配置 Processing threads count 來配置線程數。
二、修改 jadx 腳本
直接編輯 ./bin 目錄下的 jadx 腳本,配置找到 DEFAULT_JVM_OPTS ,將它設置爲 DEFAULT_JVM_OPTS="-Xmx2500M"
,就能夠配置當前使用的內存大小。
若是是 Windows 系統,你須要編輯 jadx.bat 文件。
三、使用命令行命令
若是以上方式都很差用,在沒有更好的辦法的狀況下,你能夠直接使用命令行,經過 jadx 的命令進行放編譯。並將線程數配置爲 1 ,這樣雖然慢一些,可是多數狀況下,是能夠正常輸出反編譯後的代碼的。
舉個例子:
jadx -d out -j 1 classes.dex
更過命令,能夠經過 jadx -h
命令進行查看。
仔細看看 jadx 命令配置的參數,基本上均可以在 Preferences 中,找到對應的配置項,相互對照理解一下,應該不難發現它的使用方式。
jadx 確實很是的好用,到這裏基本上已經把它的使用,都講解清楚了。
你在反編譯的過程當中,使用 jadx 有沒有碰到什麼問題?還有什麼更好的工具推薦,能夠在留言區給我留言,咱們一塊兒討論一下。
今天在承香墨影公衆號的後臺,回覆『成長』。我會送你一些我整理的學習資料,包含:Android反編譯、算法、設計模式、kotlin、虛擬機、Linux、Web項目源碼。
推薦閱讀: