dex
読み:でっくす
外語:dex: Dalvik Executable

 Androidにおける実行ファイルの一つ。
目次

概要
 Android SDKにあるdxというツールでjarからapkを作るが、このとき、jar内にあるclassファイルがdexファイルに変換される。
 Androidの仮想マシンDalvikJVMとは異なるため、このようにして変換し、専用の実行形式であるdex(Dalvik Executable)を作成して用いている。

特徴

apkやaab
 Androidアプリの配布形式であるapkや、Playストアにアップロードする形式であるaab(Android App Bundle)の中にも含まれている。
 従って、中を覗けばclasses.dexなどのファイルがあることが確認できる。

oat
 Android 5.0以降では新仮想マシンARTが正式採用されており、このためdexはそのままでは使われていない。
 アプリインストールの際に事前コンパイラー(Ahead-Of-Timeコンパイラー、AOTコンパイラー)によって.oatファイルへと変換(コンパイル)され、それが用いられる。

補足

ファイルヘッダー
 dexファイルは、8バイト形式のシグネチャ(マジックナンバー)が存在する。
 例えば、"dex" 0x0a "039" 0x00 = { 0x64 0x65 0x78 0x0a 0x30 0x33 0x39 0x00 } のような形式となっている。
"dex"
このファイルがdexであることを表わす文字列。
0x0a
UNIX形式の改行コード。通信経路(UNIX→DOS)でコード変換が行なわれていないことを確認する。
"039"
dexのバージョンで、次のようなものが既知である
0x00
NUL末端
 アプリをビルドするときのminSdkVersionの違いによって、出力されるdexファイルも変化するものと思われる。

メソッド数の上限とmultidex
 dexファイルに含められるメソッドは無符号16ビットの番号で管理されており、つまり65,536個が上限となる。
 これはアプリ自体のメソッドだけでなく、使われているライブラリーなどのメソッドも含めた総計である。つまり、androidxに関する各種、material、billing、gsonといったものや、kotlin-stdlib-jdk7やkotlinx関係など、アプリ開発にはほぼ必須と言えるものをimplementationに追加するだけで、65,536個の上限は簡単に超えていく。従って様々なライブラリーを組み込んだ多機能なアプリでは、比較的簡単に上限を突破する。
 この解決方法はdexファイルを複数に分割するmultidexである。Android 5.0(APIレベル 21)以上では仮想マシンARTの正式採用とともに標準でmultidexに対応しており、ビルドの際にも自動的に処理されるため、プログラマーも利用者も何も考える必要はない。
 Android 5.0よりも前の環境では、別途multidexライブラリーを導入することで制限の回避が可能である。

再検索