Error:Execution failed for task ':app:dexDebug'. > finished with non-zero exit value 2
この"Error:Execution failed for task ':app:dexDebug'"というエラーはホントによく見る。
だが、これだけでググるといろいろな原因があることが分かって、なかなかこれという原因に行き当たりにくい。
なので、この記事も、あくまでも「今回」「私が」経験した原因に過ぎないので、まあ備忘録程度に記しておく。
1 エラー詳細を見る
AndroidStudioの環境設定に設定を追加する。
File | Settings | Build, Execution, Deployment | Compiler
のCommand-line Optionsに以下を追加。
--debug
「OK」のクリックを忘れないように。
2 実行ボタンを押し、デバッグログを見る。
今回は、以下のように出ていた。
com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/analytics/internal/Command$1;
GoogleAnalytics関連でクラスが重複しているか何か起きている模様。
3 build.gradleを確認
上記でググると、GoogleAnalyticsのV3が弾かれるようになったため?という記述をいくつか見つける。
そこで、build.gradleを確認する。
dependencies {
compile project(':myUtility')
compile project(':libJava')
compile 'com.google.android.gms:play-services-analytics:+'
}
※myUtilityは全社で入れるよう要求されている社内共通ライブラリ(Androidライブラリプロジェクト)。
※libJavaはpure javaなライブラリ。
GAはV4が使用されているはずだ。
さんざん悩んで、myUtilityに着目。myUtilityのbuild.gradleを見てみる。
dependencies {
compile files('libs/myutility.jar')
}
myUtilityのlibsフォルダを見てみるが、myutility.jar以外にはない。
4 libs/jarの中身を見てみる
このjarの中にまさかGAのV3のコードがありやしないか・・・ということで、jarファイルを展開してみてみる。
と、思いっきりGAのクラスを発見!
このAndroidライブラリプロジェクトが配布されたときのプロジェクト(eclipse用)を見てみる。
すると、libsフォルダには以下のようになっていた。
libs
+ myutility.jar
+ gcm.jar
+ libGoogleAnalyticsServices_3_0_1.jar
犯人はこいつらだ!
しかし、AndroidStudio用のlibsフォルダには、myutility.jarしかない。
まさかと思って、この配布状態のプロジェクト内にあるmyutility.jarをまた展開して見てみる。
こちらには、GA/GCMのクラスは含まれていなかった。
ということは、このAndroidライブラリプロジェクトをAndroidStudioにインポートする際に、jarがすべてひとまとめに固められてしまったのではないか?という予測が立つ。
5 jarファイルをオリジナルに置き換える
GA/GCMのクラスを含まない、オリジナルのmyutility.jarを、AndroidStudioプロジェクト内にコピーして置き換えたところ、一応実行できるようになった。
myutility.jar内のGA関連のコードは、アプリからは呼んでいないので、今のところ問題が無いが、もしライブラリ内から自分で呼んでいたら、アウト。
ひとまず、ライブラリの開発チームに、GAのV3はもう使えないよと伝えた。
GCMはどうだろう。こちらも併せて最新版に合わせてもらいたいものだ。
というかAndroidStudioに対応してくれ。
(かくいう自分もAndroidStudioに移行してまだ2ヶ月だが。)
6(疑問) もしライブラリプロジェクトのビルドにもGooglePlayService関連が必要な場合
myUtilityのビルドにGAが必要な場合、build.gradleを以下のように書くことになるだろう。
dependencies {
compile files('libs/myutility.jar')
compile 'com.google.android.gms:play-services-analytics:+'
}
んで、本体もcompile 'com.google.android.gms:play-services-analytics:+'
があるだろう。
これはこれで、Multiple dex files define
エラーにならないのかな?
重複参照だけどこれはうまいことgradleが解決してくれるんかな?