dex2jar 報錯 com.googlecode.d2j.DexException: not support version
1. 前言
在日常開發中,有時候想做一點羞羞的事情(ps: 學習一下別人的程式碼),但是一用dex2jar工具反編就報com.googlecode.d2j.DexException: not support version異常,在我高漲的學習熱情上直接澆了一盆冷水。(後面有工具下載地址)
2. 反編手順:
反編其實很簡單,先簡單敘述一下:
-
Step 1:將apk用任意解壓工具直接解壓(我用的zip)得到classes.dex,你可能會得到很多dex,不要緊,一個一個反編就行。
-
Step 2 : 使用dex2jar工具將每一個dex檔案反編成jar包
- 將dex2jar工具解壓到任意目錄(我暫時解壓到桌面)
- 進入解壓目錄並且按(shift+右鍵,選擇在此處開啟命令列視窗)進入cmd命令列
- 將classes.dex拷貝到dex2jar工具目錄,使用指令:d2j-dex2jar.bat classes.dex 即可得到反編後的jar包
- Step 3 : 使用JD-GUI工具盡情學習就行了。
3. 問題發現:
使用dex2jar工具反編的時候,一輸入指令,結果報com.googlecode.d2j.DexException: not support version錯誤(如下圖)
4.1 調查原因:
谷歌對dex檔案的介紹:常量陣列/字串
DEX_FILE_MAGIC
是位元組列表,這類位元組必須出現在.dex
檔案的開頭,以便系統將其原樣識別。該值會特意包含一個換行符("\n"
或0x0a
)和空位元組("\0"
或0x00
),以便協助檢測某些形式的損壞問題。該值還可以將格式版本號編碼為 3 個十進位制數字;隨著格式的演變,預計該值會單調遞增。注意:Android 9.0 版本中新增了對
039
版格式的支援,其中引入了兩個新位元組碼const-method-handle
和const-method-type
。(位元組碼集合的總結表中介紹了這些位元組碼。)在 Android 10 中,版本039
擴充套件了 DEX 檔案格式,以包含僅適用於啟動類路徑上的 DEX 檔案的隱藏 API 資訊。注意:Android 8.0 版本中新增了對
038
版格式的支援。038
版本中添加了新位元組碼(invoke-polymorphic
和invoke-custom
)和用於方法控制代碼的資料。注意:Android 7.0 版本中新增了對
037
版格式的支援。在037
版本之前,大多數 Android 版本都使用過035
版格式。035
版與037
版之間的唯一區別是,是否新增預設方法以及是否調整invoke
。
**簡單地說:**就是Android Studio中配置的minSdkVersion引數對應的系統版本是多少,dex檔案頭就會是多少
例如:minSdkVersion配置成24(對應7.0的系統),編譯出來的dex頭為037版本(使用notepad++開啟dex檔案就可以看到)
android {
......
defaultConfig {
......
minSdkVersion 24
......
}
4.2 根本原因調查:
其實看了調查4.1就已經有方案了,就是修改dex檔案中的版本資訊就可以。但是不知道根本原因心裡不甘心,繼續調查。
根據報錯資訊看:com.googlecode.d2j.reader.DexFileReader.(DexFileReader.java:151)
猜測是reader.DexFileReader
的構造方法中報出來的錯誤,開啟dex2jar-2.0\lib目錄,將**dex-reader-2.0.jar
或者dex-reader-api-2.0.jar
**丟進jd-gui工具中看看原始碼如下:
// 構造方法中找到報錯點
public DexFileReader(ByteBuffer in){
......
int version = in.getInt() & 0xFFFFFF;
if ((version != 3486512) && (version != 3552048)) {
throw new DexException("not support version.");
}
skip(in, 32);
......
}
.....
}
// 支援的版本定義
private static final int MAGIC_035 = 3486512;
private static final int MAGIC_036 = 3552048;
意味著dex2jar-2.0工具只支援035和036版本協議!!!
5.解決問題
使用notepad++檔案瀏覽工具(任何能開啟檔案的工具都可以,例如記事本…)開啟dex檔案,修改版本資訊037為036或者035,然後儲存檔案即可,再使用反編指令:d2j-dex2jar.bat classes.dex 反編即可成功。
6.參考文件:
反編譯工具下載傳送門