DEX ファイル形式とは?
.dex ファイルは Dalvik Executable であり、Android システム環境で実行するために設計されたコンパイル済みのバイトコードコンテナです。Android 上で実行可能なコンパイル済みコードを保持しており、元々は Dalvik 仮想マシンによって解釈されていました。Android 5.0 (Lollipop) 以降、現代の ART (Android Runtime) は .dex バイトコードを解釈するのではなく、事前にコンパイル (AOT) しますが、フォーマット自体は標準の Android 実行形式として維持されています。
APK パッケージ内の DEX ファイル
.dex ファイルは通常、Android に新しいソフトウェアをインストールするために使用される APK パッケージ の内部に含まれています。歴史的に、各 APK にはアプリケーションで使用されるすべてのクラスとメソッドを格納する単一の classes.dex ファイルが含まれていました。現在、大規模なアプリでは「マルチデックス (multidex)」が使用されており、単一ファイルの制限である 65,536 メソッドを超えるために、コードを classes.dex、classes2.dex、classes3.dex などに分割しています。
DEX ファイルの生成と検査
.dex ファイルは、Android のビルドプロセスの一部として自動的に生成されるか、手動で生成されます。現代のツールチェーンでは、d8 コンパイラ (Android SDK build-tools の一部) を使用して、Java または Kotlin のバイトコードを .dex 形式に変換します。各ファイルはマジックシグネチャ dex\n で始まり、その後に 3 桁のフォーマットバージョン番号 (「035」、「037」、「038」、「039」など) とヌルバイトが続きます。インストール中、ART はさらに .dex をネイティブコードにコンパイルし、デバイス上に保存される .odex または .vdex ファイルを生成します。
セキュリティと安全性
リスク: MEDIUM.dex 自体は PC 上で実行されないため、単に保持しているだけではリスクは低いです。実際の文脈は Android マルウェア分析にあります。悪意のあるアプリは DEX 内にロジックを隠し (実行時に動的にロードされることもあります)、信頼できない APK から抽出した .dex には有害なコードが含まれている可能性があります。そのようなファイルは、親 APK をインストールするのではなく、必ず安全な環境 (デコンパイラやサンドボックス) で検査してください。怪しい «dex to exe / dex opener» ダウンロードサイトには注意してください。これらは正当な機能を持たず、アドウェアを同梱していることがよくあります。
形式の詳細
概要DEX ファイルを開くプログラム
技術的詳細
詳細仕様| VM アーキテクチャ | レジスタベース (スタックベースの JVM とは異なり、各 DEX 命令はレジスタオペランドを明示的に指定するため、総命令数が削減されます) |
| マジックバイト | ファイルオフセット 0 の 8 バイト: ASCII «dex»、改行 (0x0A)、3 桁のフォーマットバージョン (例: 035, 037, 038, 039)、ヌルバイト (0x00) |
| フォーマットバージョン | 035 (Android 2.2)、037 (Android 7.0)、038 (Android 8.0)、039 (Android 9+)。バージョン番号はマジックヘッダーに埋め込まれています |
| メソッドインデックス制限 | .dex ファイルあたり 65,536 メソッド (16ビットのメソッド参照インデックス)。これを超えるアプリは、コードを classes2.dex、classes3.dex などに分割します |
| 整合性フィールド | ヘッダーには Adler-32 チェックサムと 20 バイトの SHA-1 署名が含まれており、これらでファイルの残りの部分をカバーします |
| 文字列プール | すべての文字列リテラルは、重複排除された共有文字列プールに一度だけ格納されます。バイトコードは整数インデックスによって文字列を参照します |
| バイト順序 | デフォルトでリトルエンディアン。ヘッダーにはエンディアン定数 0x12345678 が埋め込まれており、逆のバイト順序を検出できます |
| ソース言語 | Java および Kotlin (および JVM をターゲットとする任意の言語)。d8 コンパイラが .class バイトコードまたは .jar アーカイブを DEX に変換します |
| ビルド時コンパイラ | d8 (Android SDK build-tools 28.0.1+) が従来の dx ツールに代わりました。JVM の .class ファイルまたは .jar アーカイブを入力として受け取ります |
| ART 事前コンパイル | インストール時に ART の dex2oat が .dex をネイティブマシンコードに変換し、結果を .odex / .oat ファイルとして /data/dalvik-cache に保存します |
| MIME タイプ | application/octet-stream (DEX フォーマット専用の登録済み MIME タイプは存在しません) |
| 実行の歴史 | JIT を備えた Dalvik VM によって解釈 (Android 1.0-4.4)。ART による事前コンパイル + プロファイルガイド付き JIT コンパイル (Android 5.0+) |
| 逆アセンブルとデコンパイル | baksmali は .dex を Smali アセンブリに逆アセンブルします。jadx や同様のツールは .dex を読み取り可能な Java ソースコードにデコンパイルします |
| APK 内の場所 | APK ZIP アーカイブ内に非圧縮で格納されます。プライントリは常に classes.dex という名前で、マルチデックスアプリの場合は classes2.dex 以降が続きます |
| リリース日 | 2008 (Android 1.0; Dalvik VM, executed by ART since Android 5.0) |
| オープンスタンダード | はい · ロイヤリティフリー |
| 仕様書 | source.android.com |
DEX の変換
コミュニティ Q&A
ユーザーからの質問まだ質問はありません。DEX ファイルについて最初の質問をしてみましょう。