dex2jar エラー com.googlecode.d2j.DexException: サポートされていないバージョン

目次

1. 問題の発見

2. 調査理由:

3. 根本原因の調査:

4. 問題を解決する


1. 問題の発見

dex2jar ツールを使用して逆コンパイルすると、コマンドが入力されるとすぐに、結果で com.googlecode.d2j.DexException: not support version エラーが報告されます (以下に示すように)。

                                                                 異常事態.png

2. 調査理由:

Google の dex ファイルの紹介: 定数配列/文字列DEX_FILE_MAGICはバイトのリストであり、.dexシステムがファイルをそのまま認識するには、そのようなバイトがファイルの先頭に現れる必要があります。特定の形式の破損を検出しやすくするために、値には意図的に改行 ("\n"または0x0a) とヌル バイト ("\0"または) が含まれています。0x00この値は、フォーマットのバージョン番号を 3 桁の 10 進数としてエンコードすることもできます。この値は、フォーマットが進化するにつれて単調に増加すると予想されます。

: この形式のサポートは Android 9.0 で追加され039、2 つの新しいバイトコードconst-method-handleとが導入されましたconst-method-type(これらのバイトコードは、バイトコード コレクションの概要テーブルで説明されています。) Android 10 では、バージョンは039DEX ファイル形式を拡張して、起動クラスパス上の DEX ファイルにのみ適用される隠し API 情報を含めます。

038:この形式のサポートはAndroid 8.0 リリースで追加されました。038新しいバイトコード (invoke-polymorphicおよびinvoke-custom) とメソッド ハンドルのデータがバージョンに追加されました。

037:この形式のサポートはAndroid 7.0 リリースで追加されました。以前のバージョンの Android のほとんどのバージョンでは、バージョン形式037が使用されていました。バージョンとバージョンの唯一の違いは、デフォルトのメソッドが追加されるかどうか、およびそれらが調整されるかどうかです035035037invoke

簡単に言うと、これは Android Studio で設定された minSdkVersion パラメータに対応するシステム バージョンであり、dex ファイルのヘッダーは次のようになります。

例: minSdkVersion は 24 (7.0 システムに対応) に構成され、コンパイルされた dex ヘッダーはバージョン 037 です(notepad++ で dex ファイルを開くと確認できます)

android {
    ......
    defaultConfig {
        ......
        minSdkVersion 24
        ......
    }

 

                                                        コンパイルされた dex ファイル.png

3. 根本原因の調査:

実際、3 回目の調査を読んだ後、dex ファイル内のバージョン情報を変更する計画がすでにあります。しかし、根本的な原因は分からず、和解できていないので、引き続き調査を続けています。

エラーメッセージによると: com.googlecode.d2j.reader.DexFileReader.<init>(DexFileReader.java:151)

reader.DexFileReader構築メソッドで報告されたエラーだと考えて、dex2jar-2.0\lib ディレクトリを開き、それを jd-gui ツールにスローdex-reader-2.0.jarまたはドロップして、次のようにソース コードを確認します。dex-reader-api-2.0.jar

// 构造方法中找到报错点
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 プロ​​トコルのみをサポートすることを意味します。

4. 問題を解決する

notepad++ ファイル参照ツール (メモ帳などのファイルを開くことができるツール) を使用して dex ファイルを開き、バージョン情報 037 を 036 または 035 に変更してからファイルを保存し、逆コンパイル コマンドを使用します。 : d2j-dex2jar.batclasses.dex は正常に元に戻すことができます。

                                                        dexバージョン情報.pngを修正後

 

                                                通常通りjarパッケージを取得します。png


 

おすすめ

転載: blog.csdn.net/s_nshine/article/details/130932209