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

  • 16
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

導入

自分のアプリに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回くらったのでもう覚えます。