dex
読み:でっくす
外語:dex: Dalvik Executable
Android
における
実行ファイル
の一つ。
目次
概要
特徴
apkやaab
oat
補足
ファイルヘッダー
メソッド数の上限とmultidex
概要
Android SDKにあるdxというツールで
jar
から
apk
を作るが、このとき、jar内にあるclassファイルがdexファイルに変換される。
Androidの仮想マシン
Dalvik
は
JVM
とは異なるため、このようにして変換し、専用の実行形式である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のバージョンで、次のようなものが既知である
"009" ‐ レガシーな形式。Android プラットフォームのM3リリース(2007(平成19)年11月〜12月)で使用された
"013" ‐ レガシーな形式。Android プラットフォームのM5リリース(2008(平成20)年2月〜3月)で使用された
"035" ‐ 一般的な形式。Android の殆どのバージョンで使用されている
"037" ‐ Android 7.0から対応した形式。035とは、デフォルト メソッドの追加と invokeの調整が行なわれている点が異なる
"038" ‐ Android 8.0から対応した形式。新しいバイトコード(invoke-polymorphic、invoke-custom)とメソッド ハンドル用データが追加された
"039" ‐ Android 9.0から対応した形式。新しいバイトコード(const-method-handle、const-method-type)が導入された。またAndroid 10以降ではブート クラスパス上のDEXファイルにのみ適用される非表示APIの情報も含むよう拡張されている
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ライブラリーを導入することで制限の回避が可能である。
再検索