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

  • 37
    Like
  • 0
    Comment
More than 1 year has passed since last update.

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

2. Error:No such property: GROUP for class: org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer

インポートしたローカルプロジェクトの中のbuild.gradleファイルの、mvn-pushという部分の記述が原因です。

mvn_push1.png

mvn-pushとは何かというと、gradleプロジェクトのAARsをMavenCentralにpushするためのものみたいです。詳しくは作者がブログで説明しているので読んでみましょう。

とりあえず対処方法のみ言うと、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ファイルの記述が足りないのが原因です。

こちらの手順で解消するはずです。

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とか調べてみると、どうやらこのエラーを無視する記述をbuild.gradleファイルに書けばよいそうで。以下の記述を追加すれば直ります。

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

2. 書き込み権限(エラーログなし)

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

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オプションを有効にして直りました。
こちらの記事を参考にどうぞ。

build.gradle
android {
    dexOptions {
       jumboMode true
    }
}

5. java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536

一番めんどくさいエラー。結局対処法としては、Proguardを使ってビルドしたりライブラリを減らしたりするしかないみたいです。

Androidでメソッド数が65536を超えた時の対処方法を参考にどうぞ。

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ファイルに書かなければいけないようです。

# 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を超えた時の対処方法を参考にどうぞ。