Edited at

ビルドは通るのに実行しようとするとエラーになったときに取った対処法(Error:Execution failed for task ':app:dexDebug')

More than 3 years have passed since last update.

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を確認する。


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を見てみる。


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を以下のように書くことになるだろう。


myUtilityの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が解決してくれるんかな?