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から確認できます。
##2. Error:No such property: GROUP for class: org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer
インポートしたローカルプロジェクトの中のbuild.gradleファイルの、mvn-push
という部分の記述が原因です。
mvn-push
とは何かというと、gradleプロジェクトのAARsをMavenCentralにpushするためのものみたいです。詳しくは作者がブログで説明しているので読んでみましょう。
とりあえず対処方法のみ言うと、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
ファイルに書けばよいそうで。以下の記述を追加すれば直ります。
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オプションを有効にして直りました。
こちらの記事を参考にどうぞ。
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を超えた時の対処方法を参考にどうぞ。