1. 程式人生 > 其它 >dex2jar 報錯 com.googlecode.d2j.DexException: not support version

dex2jar 報錯 com.googlecode.d2j.DexException: not support version

技術標籤:Android進階android

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包

dex2jar正常結果.png

  • Step 3 : 使用JD-GUI工具盡情學習就行了。

3. 問題發現:

​ 使用dex2jar工具反編的時候,一輸入指令,結果報com.googlecode.d2j.DexException: not support version錯誤(如下圖)

異常情況.png

4.1 調查原因:

谷歌對dex檔案的介紹:常量陣列/字串 DEX_FILE_MAGIC

是位元組列表,這類位元組必須出現在 .dex 檔案的開頭,以便系統將其原樣識別。該值會特意包含一個換行符("\n"0x0a)和空位元組("\0"0x00),以便協助檢測某些形式的損壞問題。該值還可以將格式版本號編碼為 3 個十進位制數字;隨著格式的演變,預計該值會單調遞增。

注意:Android 9.0 版本中新增了對 039 版格式的支援,其中引入了兩個新位元組碼 const-method-handleconst-method-type。(位元組碼集合的總結表中介紹了這些位元組碼。)在 Android 10 中,版本 039 擴充套件了 DEX 檔案格式,以包含僅適用於啟動類路徑上的 DEX 檔案的隱藏 API 資訊。

注意:Android 8.0 版本中新增了對 038 版格式的支援。038 版本中添加了新位元組碼(invoke-polymorphicinvoke-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
        ......
    }

編譯出來的dex檔案.png

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 反編即可成功。

修改dex版本資訊後.png

正常獲得jar包.png

6.參考文件:

谷歌對dex檔案的介紹

反編譯工具下載傳送門