multidex
読み:まるち-でっくす
外語:multidex

 Androidにおいて、dexの制限を回避するためにdexを複数に分割するための技術。
目次

概要
 dexファイルに含められるメソッドは無符号16ビットの番号で管理されており、つまり216=65,536個が上限となる。
 この上限を超えた場合はビルドエラーが発生しビルドできないため、対策が必要である。その方法がmultidexである。

特徴

65536
 dexには、アプリ自体のメソッドだけでなく、使われているライブラリーなどのメソッドも含まれる。
 つまり、androidxに関する各種、material、billing、gsonといったものや、kotlin-stdlib-jdk7やkotlinx関係など、アプリ開発にはほぼ必須と言えるものをimplementationに追加するだけで、65,536個の上限は簡単に超えていく。
 従って様々なライブラリーを組み込んだ多機能なアプリでは比較的簡単に上限を突破するため、多機能なアプリにおけるmultidex対応への対策はいずれ訪れる問題である。

dexの分割
 この問題を回避するには、dexを複数に分割する必要がある。これ自体はビルダーが自動的に実施してくれるが、そのための方法は二種類があり、プログラマーが選択をする必要がある。
 具体的には、Android 5.0(APIレベル 21)以上では仮想マシンARTの正式採用とともに標準でmultidexに対応しており、ビルドの際にも自動的に処理されるため、プログラマーは何も考える必要はない。
 対してAndroid 5.0よりも前の環境では、別途multidexライブラリーを導入することで制限の回避が可能である。

対策

Android 5.0以上専用にする
 Android 5.0(APIレベル 21)以上では標準サポートされているため、そのように設定すればAndroid Studioは自動的に適切にビルドを実施する。
 つまり、minSdkVersionを21以上にすれば良い。
defaultConfig {
    ...
    minSdkVersion 21
    ...
}
 defaultConfig {}の行を書き換えてGradleファイルとプロジェクトを同期するか、またはAndroid Studioで最小SDKバージョンを21以上にした上でリビルドをすれば良い。
 これで、Android 4.4以前およりKitKat Wearとはお別れである。

multidexライブラリーの使用
 Android 4.4以前にも対応を続けたいという場合は、multidexライブラリーを用いて問題を回避するという選択肢となる。
 app/build.gradleの二箇所に次の記述を追加し、Gradleファイルとプロジェクトを同期したあとでリビルドが必要である。
 defaultConfig {}の最後に次を追加する。
 multiDexEnabled true
 AndroidXを利用中の場合は、dependencies {} の任意の場所に次を追加する。
 implementation 'androidx.multidex:multidex:2.0.1'
 AndroidXを使っていない場合は、dependencies {} の任意の場所に次を追加するが、この方法は既にサポートが終了している。
 implementation 'com.android.support:multidex:1.0.3'

再検索