Androidメソッド数が制限を超えた問題(multiDex,jumboMode)
3130 ワード
Androidプロジェクトの開発では、プロジェクトのコード量が多すぎるか、jarを多く導入することでコード量が急激に増加し、エラーが発生します.
エラーが発生する原因はAndroidが設定方法数が65536個(DEX 64 K problem)であり、この方法数を超えるとdexが生成できなくなり、APKが生成できなくなる.
制限要因:初期のDalvik VM内部でshortタイプ変数を使用してメソッドのidを識別すると,最大メソッド数の制限65536があった.
解決方法:不要なメソッドを削除し、使用しないjarを削除します. パケットdefaultConfigにmultiDexEnabledを設定してパケットモードをオンにすることで、パケット後のDexは制限数を下回って正常なパケット化を保証します. メソッド数制限を無視するチェック
dexOptionsを設定し、メソッド数制限のチェックをしないと、apkが低バージョンのデバイスにインストールできず、エラーが発生するという欠点があります.
In the standard java world: When you compile standard java code : the compiler produce
In the Android world: It is different. You use the java language to write your code, but the compiler don't produce targetAPILevel force-jumbo mode (when enabled it allows a larger number of strings in the dex files)
標準Javaの世界でjavaコードがコンパイルされると、コンパイラは
アンドロイドの世界では違います.はjava音声でアンドロイドのコードを書きますが、コンパイラが生成したのは
参考資料: https://segmentfault.com/a/1190000004187484 https://stackoverflow.com/questions/24224186/what-is-dex-in-gradle/24224385#24224385 http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.DexOptions.html
android.dex.DexIndexOverflowException: Cannot merge new index xxxx into a non-jumbo instruction!
エラーが発生する原因はAndroidが設定方法数が65536個(DEX 64 K problem)であり、この方法数を超えるとdexが生成できなくなり、APKが生成できなくなる.
制限要因:初期のDalvik VM内部でshortタイプ変数を使用してメソッドのidを識別すると,最大メソッド数の制限65536があった.
解決方法:
1 defaultConfig {
2 multiDexEnabled=true
3 }
1 android.dexOptions {
2 jumboMode = true
3 }
dexOptionsを設定し、メソッド数制限のチェックをしないと、apkが低バージョンのデバイスにインストールできず、エラーが発生するという欠点があります.
INSTALL_FAILED_DEXOPT
dexoptions
およびjumboMode
についてstackoverflowに説明する.In the standard java world:
*.class
file. A *.class
file contains standard java bytecode that can be executed on a standard JVM. In the Android world:
*.class
files, it produce *.dex
file. A *.dex
file contains bytecode that can be executed on the Android Virtual Machine (dalvik) and this is not a standard Java Virtual Machine. To be clear: a dex file in android is the equivalent of class in standard java. So dexoptions
is a gradle object where some options to configure this java-code-to-android-bytecode transformation are defined. The options configured via this object are : 標準Javaの世界でjavaコードがコンパイルされると、コンパイラは
.class
ファイルを生成します..class
ファイルにはjavaのバイトコードが含まれています.これらのバイトコードはJVMで実行されます.アンドロイドの世界では違います.
.dex
ファイルで、.java
ファイルではありません..dex
ファイルには、JVMではなくAndroid仮想マシンで実行可能なバイトコードが含まれています.だから.dex
ファイルの役割と標準Javaの中の.classファイルの差は多くありません.dexoptions
はjavaコードからの方向を設定するgradleオブジェクトである.dexファイル変換中のいくつかの構成オプション.その一つがforce-jumbo modeです.force-jumbo modeでは、より大きな.dex
ファイルを作成できます.参考資料: