KonifarPod

Android Studioでビルド時にCannot merge new index xxxx into a non-jumbo instruction!

   

Pocket

Android Studioで大きめのプロジェクトをビルドしようとしたら、『com.android.dex.DexException: Cannot merge new index 65576 into a non-jumbo instruction!』というエラーが出ました。あと一息というところでとても悲しかったので、対処方法を残しておきます。

こんなエラー。

Error:Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
 /Users/konifar/AndroidSDK/sdk/build-tools/19.1.0/dx --dex --num-threads=4 --output /Users/konifar/Work/Project/app/build/intermediates/dex/debug Error Code:
 2
(略)
 Output:
 UNEXPECTED TOP-LEVEL EXCEPTION:
 com.android.dex.DexException: Cannot merge new index 65576 into a non-jumbo instruction!
 at com.android.dx.merge.InstructionTransformer.jumboCheck(InstructionTransformer.java:108)
 at com.android.dx.merge.InstructionTransformer.access$800(InstructionTransformer.java:25)
 at com.android.dx.merge.InstructionTransformer$StringVisitor.visit(InstructionTransformer.java:71)
 at com.android.dx.io.CodeReader.callVisit(CodeReader.java:114)
 at com.android.dx.io.CodeReader.visitAll(CodeReader.java:89)
 at com.android.dx.merge.InstructionTransformer.transform(InstructionTransformer.java:48)
 at com.android.dx.merge.DexMerger.transformCode(DexMerger.java:840)
 at com.android.dx.merge.DexMerger.transformMethods(DexMerger.java:811)
 at com.android.dx.merge.DexMerger.transformClassData(DexMerger.java:783)
 at com.android.dx.merge.DexMerger.transformClassDef(DexMerger.java:680)
 at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:540)
 at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
 at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
 at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
 at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
 at com.android.dx.command.dexer.Main.run(Main.java:230)
 at com.android.dx.command.dexer.Main.main(Main.java:199)
 at com.android.dx.command.Main.main(Main.java:103)

 

StackOverFlowに原因が書いてありました。

どうやら、ビルドできるプロジェクト内のメソッド数には上限があるらしく、使用しているライブラリも含めて全体のメソッド数が多すぎる場合はエラーになるようです。

対処方法は3つです。

① コードを整理する

不要なコードを消したり、使ってないライブラリを除去したり、要はリファクタリングです。

② ProGuardを使ってビルドする

ProGuardを使ってビルドすることで、必要ないコードは除いてビルドしてくれます。

③ gradleでjumboModeオプションを有効にする

 non-jumboとエラーで言われている通り、jumboModeを有効にすると解消できます。

 

①はイバラの道すぎるし、②は設定が少し面倒なので、③で対応しました。

appディレクトリ以下のbuild.gradleファイルに、以下のオプションを指定します。

android {
    dexOptions {
       jumboMode true
    }
}

終わった後、Build > Rebuild Project で必ずビルドするようにしましょう。そうしないと何度やってもエラーが解消せずハマるので注意です。

そもそも①の方法でリファクタリングするのが理想っぽいですが、取り急ぎ対処したいという方は参考にどうぞ。

 

Pocket

 - Develop