Gradleを使いたての自分がGoogle Play Serviceを入れてはまった件

More than 3 years have passed since last update.


導入

自分のアプリにGoogle Play Serviceを導入してみた。

Setting Up Google Play Services

apply plugin: 'android'

...

dependencies {
compile 'com.android.support:appcompat-v7:20.+'
compile 'com.google.android.gms:play-services:5.+'
}


だがここで問題が

だけどうまく行かない。

ビルドすると、下記のエラーが出る。Cleanビルドしてからのリビルドでも同じ。

    UNEXPECTED TOP-LEVEL EXCEPTION:

com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/common/data/Freezable;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
at com.android.dx.command.dexer.Main.run(Main.java:230)
at com.android.dx.command.dexer.Main.main(Main.java:199)
at com.android.dx.command.Main.main(Main.java:103)


魅力的な解決策を見つけるが。。

いろいろ調べたところ、下記のページを見つけた。

Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat

導入しているライブラリは違うがログは同じ。

そこではbuild.gradleファイルのandroidブロックに下記を追加すればいいよ、とある。

dexOptions {

preDexLibraries = false
}

コメントには「This has saved my life!!! :D」とまである。

これはきっとうまくいくと思った。

だけど、、、これってだめなんじゃ。。。?

名前から察するに事前ビルドをしないことにするんだろうけど、結局だめなのでは?と思った。

どう考えて負けな気がする。そのため一旦スルー。


そして解決策にたどりつく

解決策は調べて見つけた訳じゃなく、ふと思いついたというか、正直「com.android.support:support-v4」を入れたときも同じログだったような。。

結局はライブラリプロジェクトのbuild.gradleに問題があった。

dependencies {

compile 'com.android.support:support-v4:20+'
compile files('libs/google-play-services.jar') ← これ
}

ライブラリプロジェクトが自前で持っていたplay serviceのjarファイルを直接参照していた。

そのため、そこを自前のプロジェクトのbuild.gradle同様下記のようにする事で解決した。

dependencies {

compile 'com.android.support:appcompat-v7:20.+'
compile 'com.google.android.gms:play-services:5.+'
}

結構よくはまりそうな感じだけど、さすがに2回くらったのでもう覚えます。