EclipseからAndroid Studioのせかえ時のgradle対応でハマったエラーまとめ

Eclipse+ADTプラグインで作って開発していたプロジェクトをAndroid Studioにのせかえました。結構めんどくさくて大変でした。

ハマったエラーごとにまとめて、今後誰かが同じ思いをしないようにしておこうと思います。

#1. gradle sync時

##1. Project with path 'com.google.android.gms:play-services' could not be found in project
Android SDKに必要なライブラリを落としていないのが原因です。`Android SDK Manager`を開いて、`Google Repository`がインストールされているか確認して、インストールされていなければしましょう。

インストールしたら問題なくなるはずですが、もしそれでも変わらなかったらAndroid StudioのSDKの場所を確認した方がよいかもしれません。`File > Project Structure`を開いて、左メニューのSDK Locationから確認できます。

![googleplaylib2.png](https://qiita-image-store.s3.amazonaws.com/0/15267/fa78c6a3-c5da-73a3-262d-55fac0bc923e.png "googleplaylib2.png")


##2. Error:No such property: GROUP for class: org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer
インポートしたローカルプロジェクトの中のbuild.gradleファイルの、`mvn-push`という部分の記述が原因です。

![mvn_push1.png](https://qiita-image-store.s3.amazonaws.com/0/15267/2fe244dd-c674-b70b-a055-796a81c51b61.png "mvn_push1.png")

`mvn-push`とは何かというと、gradleプロジェクトのAARsをMavenCentralにpushするためのものみたいです。詳しくは作者が[ブログ](https://chris.banes.me/2013/08/27/pushing-aars-to-maven-central/)で説明しているので読んでみましょう。

とりあえず対処方法のみ言うと、build.gradleの中の以下の記述をコメントアウトすれば解決するはずです。

```build.gradle
apply from: ‘https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle’
```

##3. Project with path ':libraries:pulltorefresh' could not be found in project ':app'
ローカルプロジェクトをインポートして利用しようとした`pulltorefresh`がうまく読み込めていません。`settings.gradle`ファイルの記述が足りないのが原因です。

[こちら](http://qiita.com/konifar/items/c9f66482ebdca404f8fa#3settingsgradle%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%ABinclude%E3%82%92%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8B)の手順で解消するはずです。



#2. ビルド時
##1. Error:Execution failed for task ':app:packageDebug'. > Duplicate files copied in APK META-INF/LICENSE.txt
こんなエラー。

```
Error:Execution failed for task ':app:packageDebug'.
> Duplicate files copied in APK META-INF/LICENSE.txt
 File 1: /Users/konifar/Work/AppName/app/build/intermediates/exploded-aar/net.danlew/android.joda/2.3/libs/joda-convert-1.5.jar
 File 2: /Users/konifar/Work/AppName/app/build/intermediates/exploded-aar/net.danlew/android.joda/2.3/libs/joda-convert-1.5.jar
```

なんか`joda-convert-1.5.jar`を2つ書き込もうとしてる？とか言われてます。[StackOverFlow](http://stackoverflow.com/questions/20827885/android-studio-0-4-duplicate-files-copied-in-apk-meta-inf-license-txt)とか調べてみると、どうやらこのエラーを無視する記述を`build.gradle`ファイルに書けばよいそうで。以下の記述を追加すれば直ります。

```build.gradle
android {
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
    }
}
```

##2. 書き込み権限（エラーログなし）
ログにも情報が何も出ていないけど、なんか失敗するケース。build.gradleファイルなんかは正しそうだったので、こういう時はおそらくファイルの書き込み権限だろう、ということで、projectと.gradleディレクトリの中身の権限を変更したら解消しました。

```shell
sudo chmod -R 777 /Users/konifar/Work/Project/
sudo chmod -R 777 /Users/konifar/.gradle/
```

##3. Error:Could not copy MANIFEST.MF to '/Users/konifar/Work/Project/libraries/pulltorefresh/build/tmp/packageReleaseJar/MANIFEST.MF'.
こんなエラー。MANIFEST.MFをコピーできないと言っています。原因はわからないですが、とりあえずコピー先にすでにあるMANIFEST.MFを削除すれば解消しました。

```
Error:Could not copy MANIFEST.MF to '/Users/konifar/Work/Project/libraries/pulltorefresh/build/tmp/packageReleaseJar/MANIFEST.MF'.
> Could not set UNIX mode on /Users/konifar/Work/Project/libraries/pulltorefresh/build/tmp/packageReleaseJar/MANIFEST.MF: could not chmod file (errno 1)
```

##4. com.android.dex.DexException: Cannot merge new index 65576 into a non-jumbo instruction!
こんなエラー。

```
Error:Execution failed for task ':app:dexDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
 /Users/konifar/AndroidSDK/sdk/build-tools/19.1.0/dx --dex --num-threads=4 --output /Users/konifar/Work/Project/app/build/intermediates/dex/debug Error Code:
 2
（略）
 Output:
 UNEXPECTED TOP-LEVEL EXCEPTION:
 com.android.dex.DexException: Cannot merge new index 65576 into a non-jumbo instruction!
 at com.android.dx.merge.InstructionTransformer.jumboCheck(InstructionTransformer.java:108)
 at com.android.dx.merge.InstructionTransformer.access$800(InstructionTransformer.java:25)
 at com.android.dx.merge.InstructionTransformer$StringVisitor.visit(InstructionTransformer.java:71)
 at com.android.dx.io.CodeReader.callVisit(CodeReader.java:114)
 at com.android.dx.io.CodeReader.visitAll(CodeReader.java:89)
 at com.android.dx.merge.InstructionTransformer.transform(InstructionTransformer.java:48)
 at com.android.dx.merge.DexMerger.transformCode(DexMerger.java:840)
 at com.android.dx.merge.DexMerger.transformMethods(DexMerger.java:811)
 at com.android.dx.merge.DexMerger.transformClassData(DexMerger.java:783)
 at com.android.dx.merge.DexMerger.transformClassDef(DexMerger.java:680)
 at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:540)
 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)
```

build.gradleのjumboModeオプションを有効にして直りました。
[こちらの記事](http://qiita.com/konifar/items/d98c78facbaae63badca#1-gradle%E3%81%A7jumbomode%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B)を参考にどうぞ。

```build.gradle
android {
    dexOptions {
       jumboMode true
    }
}
```

##5. java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536
一番めんどくさいエラー。結局対処法としては、Proguardを使ってビルドしたりライブラリを減らしたりするしかないみたいです。

[Androidでメソッド数が65536を超えた時の対処方法](http://qiita.com/konifar/items/d98c78facbaae63badca)を参考にどうぞ。

#3. Proguardビルド後
##1. java.lang.RuntimeException: Missing type parameter. at com.google.gson.reflect.TypeToken.getSuperclassTypeParameter(SourceFile:84)

proguardを使ってビルドした後、gsonの部分でエラーが発生しました。

```
java.lang.RuntimeException: Missing type parameter.
 at com.google.gson.reflect.TypeToken.getSuperclassTypeParameter(SourceFile:84) at com.google.gson.reflect.TypeToken.(SourceFile:62)
```

gsonを使っている場合は下記の記述をproguardファイルに書かなければいけないようです。

```proguard
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.-keepattributes Signature
 
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
 
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
```

#4. インストール時
##1. Failure [INSTALL_FAILED_DEXOPT]
Android2でインストールするときだけインストールできないことがあります。

```
pkg: /data/local/tmp/com.konifar
Failure [INSTALL_FAILED_DEXOPT]
```

対処方法は[Androidでメソッド数が65536を超えた時の対処方法](http://qiita.com/konifar/items/d98c78facbaae63badca#2-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%99%82%E3%81%AB%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B%E5%A0%B4%E5%90%88)を参考にどうぞ。