この記事について
Androidアプリをgradleプロジェクトとして開発している場合に、
java.util.zip.ZipException: duplicate entry: android/support/multidex/MultiDex$V14.class
のような、ビルドエラーが出た時に解決に繋がったことを紹介します。
結論
この記事の結論は、以下の2点です。
Cmd + O
で、duplicateとされているクラスを検索する。- ローカルに置いているjarライブラリと外部リポジトリから取得したライブラリの重複を疑う。
説明
エラーの意味
「duplicate」は「重複」と訳すことができます。つまり、
java.util.zip.ZipException: duplicate entry: android/support/multidex/MultiDex$V14.class
とは、「MultiDex
クラスが重複している」というビルドエラーです。
Cmd + O
で、duplicateとされているクラスを検索
Android Studio でのクラス検索コマンド(Macの場合はCmd + O
、Windowsはわかりません)を利用して、重複しているクラスを検索します。今回の場合は、MultiDex
で検索をしました。すると、私の場合は以下のような選択肢が出ました。
クラス検索をかけたことで、実際に重複しているクラスを特定することができました。
ローカルのライブラリと外部取得したライブラリの重複を疑う
私の場合、クラスの重複が起きた理由は、
compile fileTree(dir: 'libs', include: ['*.jar'])
によって、ライブラリとして認識されていたapp/lib
ディレクトリ内のandroid-support-multidex.jar
が、build tool version のアップグレードでデフォルトで入るようになったmultidexのサポートライブラリと重複していたことが原因でした。
私の場合はbuild tool がデフォルトでいれたライブラリと重複しているという意味で、少し特殊な状況でしたが、ローカルに置いているjarライブラリとbuild.gradle
で外部リポジトリからの取得を設定しているライブラリでクラスが重複していることを疑うのは一般的に通用する方法だと考えています。
おわりに
EclipseからAndroid Studioに移行したプロジェクトやAndroid Studio黎明期に始まったプロジェクトなどでは、ローカルにjarを置いている場合があるかと思います。duplicate entry エラーがでたら、何が重複しているかの特定を試みたり、jarとの重複を疑ったりしてみてください。