Androidメソッド数が制限を超えた問題(multiDex,jumboMode)

3130 ワード

Androidプロジェクトの開発では、プロジェクトのコード量が多すぎるか、jarを多く導入することでコード量が急激に増加し、エラーが発生します.
 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があった.
解決方法:
  • 不要なメソッドを削除し、使用しないjarを削除します.
  • パケットdefaultConfigにmultiDexEnabledを設定してパケットモードをオンにすることで、パケット後のDexは制限数を下回って正常なパケット化を保証します.
  • 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:
  • When you compile standard java code : the compiler produce *.class file. A *.class file contains standard java bytecode that can be executed on a standard JVM.

  • In the Android world:
  • It is different. You use the java language to write your code, but the compiler don't produce *.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 :
  • targetAPILevel
  • force-jumbo mode (when enabled it allows a larger number of strings in the dex files)


  • 標準Javaの世界でjavaコードがコンパイルされると、コンパイラは.classファイルを生成します..classファイルにはjavaのバイトコードが含まれています.これらのバイトコードはJVMで実行されます.
    アンドロイドの世界では違います.
  • はjava音声でアンドロイドのコードを書きますが、コンパイラが生成したのは.dexファイルで、.javaファイルではありません..dexファイルには、JVMではなくAndroid仮想マシンで実行可能なバイトコードが含まれています.だから.dexファイルの役割と標準Javaの中の.classファイルの差は多くありません.dexoptionsはjavaコードからの方向を設定するgradleオブジェクトである.dexファイル変換中のいくつかの構成オプション.その一つがforce-jumbo modeです.force-jumbo modeでは、より大きな.dexファイルを作成できます.

  • 参考資料:
  • 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