Help us understand the problem. What is going on with this article?

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

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

le_skamba
Android/iPhoneアプリ開発者。その前はゲームプログラマをしてました。Windowsアプリも幾つか作りました。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away