LoginSignup
17
16

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-11
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が解決してくれるんかな?

17
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
16