目次
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 では、バージョンは039
DEX ファイル形式を拡張して、起動クラスパス上の DEX ファイルにのみ適用される隠し API 情報を含めます。注
038
:この形式のサポートはAndroid 8.0 リリースで追加されました。038
新しいバイトコード (invoke-polymorphic
およびinvoke-custom
) とメソッド ハンドルのデータがバージョンに追加されました。注
037
:この形式のサポートはAndroid 7.0 リリースで追加されました。以前のバージョンの Android のほとんどのバージョンでは、バージョン形式037
が使用されていました。バージョンとバージョンの唯一の違いは、デフォルトのメソッドが追加されるかどうか、およびそれらが調整されるかどうかです。035
035
037
invoke
簡単に言うと、これは 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