MultidexとJumbo Mode
Androidで規模の大きいアプリを作っていると直面する64K問題。これに対処するための仕組みがMultidexとJumbo Modeです。両者は別モノなんですが日本語のブログだと混同してるものが散見されたので改めて整理してみます。
Multidex
Multidexはメソッド総数上限の制約を乗り越えるための仕組みです。
メソッド総数上限については64K を超えるメソッドを使用するアプリの設定 | Android Studioに書いてあります。
Dalvik Executable の仕様により、単一の DEX ファイル内で参照できるメソッドの総数が 65,536 に制限されます。 (中略) 65,536 は 64 X 1024 に等しいため、この制限は「64K 参照制限」と呼ばれます。
Multidexではアプリを複数のdexファイルに分割します。1つのdexファイルに64kしかメソッドが持てないなら複数のdexに分けてしまえばOKでしょ、って発想ですね。
設定の仕方は先ほどと同じく64K を超えるメソッドを使用するアプリの設定 | Android Studioに詳しく書いてあるので省略。
Multidexはbuildにかかる時間が長くなるなどのデメリットがあるので、ライブラリ構成を見直すなどしてなんとか回避したいところです。
jumboMode
jumboModeは参照できる文字列総数上限の制約を乗り越えるための仕組みです。
標準では16ビット幅の整数を使って文字列へのインデックスが生成されます。16ビット幅なので文字列参照の上限は2^16(=65,536)になります。
jumboModeを有効にすると32ビット幅でインデックスを生成するようになります。これによって上限は2^32になります。十分に大きな数なので実質無制限ですね。
設定はbuild.gradleに
android {
dexOptions {
jumboMode = true
}
}
を追加すればOK。
Multidexのようにインパクトの大きなデメリットはなさそうです。build時間は多少延びるのかな?
参考URL
- Backstage Blog - “Congratulations, you have a lot of code!” Remedying Android’s method limit - Part 1 - SoundCloud Developers
- Backstage Blog - “Congratulations, you have a lot of code!” Remedying Android’s method limit - Part 2 - SoundCloud Developers
- java - Android: Jumbo Mode vs Multidex - Stack Overflow
- android - What is the purpose of jumboMode in dexOptions for a Gradle build? - Stack Overflow
関連(するかもしれない)記事
おススメ