Android Studio 3.0 で Unable to merge dex ビルドエラーの対処法

すでにこちらに投稿したものですが、こちらにも転載です。

Android Studio 3.0 へ移行するための動作確認を行って際に結構ハマったので情報共有します。

エラー内容

上記などを参考に移行の作業を行い、最後に実機での確認を行った際に下記エラーが発生。

原因

Gradleに登録しているライブラリが依存しているライブラリ(日本語難しいですね)が、重複していたため
例えば、AというライブラリはBライブラリを使用していて、CライブラリもBライブラリを使用していた、など。

対処法

まずは、コンパイルオプションに--stacktrace を付けてビルドし、何が重複したのかを特定します。
コンパイルオプションは、Preference > Build, Execution, Development > Compiler > Command-line Optionsで帰れます。今回の問題のみならず、何かコンパイルでエラーが発生したときはこれを使えばだいたい何が悪いのかわかります。

今回こちらの環境では下記が問題になっていました。

org.objectwebとかasmというのが問題のようです。

続いて、どのライブラリが上記使っているのかを探します。

コマンドラインで下記コマンドを入力します。Windowsの人は適宜読み替えてください。

./gradlew app:dependencies

すると、下記のように使用しているライブラリの依存ツリーが表示されるので、どのライブラリが使っているのかを特定します。

json-pathが、net.minidev:asm:1.0.2を使っているのがわかりました。
そこで、このライブラリに対してexcludeコマンドをつかって除外してやります。

これで終わりです。

あとは、念のために、プロジェクト直下の./gradle,buildapp/buildを削除して、Clean -> Rebuildします。
私はこの方法で解消できました。

その他のアプローチ

いろいろ調べていく中で他の方法でも、上手く行った人がいるようなのでご紹介します。試してみると良いかもしれません。

  • ただ単に、Clean -> Rebuild
  • app/build.gradlemultiDexEnabled true を追加
  • compileSdkVersion, compileSdkVersion, supportLibVersion を全て同じバージョンに揃える
  • プロジェクト直下の./gradle,buildapp/buildを削除して、Clean -> Rebuild
  • Google Play Services を最新バージョンにアップデート
  • app/build.gradledexOptionjumboMode true を追加する
  • complie を implementationに、 testCompiple を testImplementationに、 testImplementation を androidTestImplementationに置き換える

参考

スポンサーリンク
レクタングル(大)