Android MultiDexとは何ですか?


111

MultiDexに関する投稿はたくさんあります。私は、build.gradleのセクションを含め、時々解決さmultiDexEnabled trueれたエラーを経験しましたdefaultConfig

しかし、この機能は正確には何ですか?それを使用するシナリオは何ですか?

回答:


166

ドキュメントの引用:

Androidアプリケーション(APK)ファイルには、Dalvik Executable(DEX)ファイルの形式で実行可能なバイトコードファイルが含まれています。このファイルには、アプリの実行に使用されるコンパイル済みコードが含まれています。Dalvik実行可能ファイルの仕様では、Androidフレームワークメソッド、ライブラリメソッド、独自のコード内のメソッドなど、1つのDEXファイル内で参照できるメソッドの総数を65,536に制限しています。この制限を超えるには、アプリのビルドプロセスを構成して、multidex構成と呼ばれる複数のDEXファイルを生成する必要があります。

したがって、機能は次のとおりです。これにより、複雑なアプリをコンパイルできます。これを使用するシナリオは、64K DEXメソッドの参照制限に達したためにアプリがコンパイルに失敗した場合です。これは、次のようなビルドエラーとして表示されます。

Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

2
これがコードベースのサイズ(LOC、または大まかな画面数)になるとしたら、どんな考えですか?シンプルな5〜6画面のアプリでこの制限に
達するの

20
@Marchy:通常、ライブラリの追加が多すぎることが原因です。ライブラリのないプロジェクトがこの制限に達するのは困難です。
CommonsWare 2016

3
私は、約5つのGoogleサポートライブラリ、Fabric.io、および2つまたは3つの他のサードパーティライブラリを使用する小さなアプリを使用しており、multi-dexを使用する必要があります。
c.dunlap 2017

1
multidexを有効にすることの欠点はありますか?なぜそれをデフォルトとして真実にしないのですか?
ラファエルリマ

1
@RafaelLima:Android 5.0以前のデバイスのmultidexの準バックポートにはセキュリティの問題があります。IIRC、まだロードされていないDEXファイルにあるクラスを使用しようとしている場合、アプリで問題が発生する可能性もあります。
CommonsWare

43

これはとても簡単です

1つの.dexファイルに65,536のメソッド(参照)を含めることができるため、参照の数が65,536を超える場合はmultidexを使用します。

詳細説明!

Androidアプリケーションプログラムは.dexファイルにコンパイルされ、次に1つの.apkファイルに圧縮されます。
DVM(ダルビック仮想マシン)は、.dexファイルを使用してバイトコードを実行します。

参照の数が65,536の制限を超える原因は何ですか?
あなたが作成したメソッド+ Androidフレームワークメソッド+サードパーティライブラリ(Volley、Retrofit、Facebook SDKなど)のメソッド。
「どこか」で読んだ
App Compat 24.2.1には16.5kのメソッドが含まれている
Google Play Services GCM 9.6.1には16.7kのメソッドが含まれている
ので、App Compat 24.2.1を持つ単純なHello worldアプリケーションを作成した場合は、すでに1/4方法単一DEX方法の限界を横断します


7

AndroidのMultiDexとは何ですか?

DexはDalvik Executableの略で、Googleの仮想マシンプロセッサ(Dalvik)がAndroidアプリケーションを処理するために使用します。Androidは小さくてシンプルなアプリを念頭に置いて構築されており、単一のDalvik実行可能ファイルに対する制約により、65,536のメソッドでコード参照の屋根が固定されました。この問題とDalvikマシンがコード実行を処理する方法が原因で、Monkey PatchまたはMultiDexの統合まで、コンパイルと呼び出しの問題がいくつかありました。Android StudioのMultiDex統合により、Android開発者は65,536を超えるメソッドを使用してコードベースをコンパイルおよび実行できます。


1

どんどんAndroid開発者公式サイト。

If your minSdkVersion is set to 21 or higher, multidex is enabled by default and you do not need the multidex support library.

1
答えてくれてありがとう。これは2015年からの質問なので、それ以来多くのことが変更されました。
Roberto Tellez Ibarra

-2

また、Google(および他の人)がコードの一部にDRMを適用することもできます。たとえば、開発者以外のほとんどの人に問題を引き起こすコードの一部です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.