下記のようなAndroidプロジェクトでクリーンビルド以外でいつもビルドエラーで困っていたのを対策したのでメモ。
環境
- kotlin v1.1.0
- gradle v2.3.0
- Android Studio 3.0.1
- moduleが8個
出てくるビルドエラー
クリーンビルドでは発生せず、その後のビルドで
java.lang.IllegalStateException: Service is dying
at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Dying.get(CompileService.kt:55)
at org.jetbrains.kotlin.daemon.common.CompileService$CallResult$Dying.get(CompileService.kt:54)
at org.jetbrains.kotlin.compilerRunner.KotlinCompilerRunner$newDaemonConnection$connection$1.invoke(KotlinCompilerRunner.kt:70)
at org.jetbrains.kotlin.compilerRunner.KotlinCompilerRunner$newDaemonConnection$connection$1.invoke(KotlinCompilerRunner.kt:47)
at org.jetbrains.kotlin.daemon.common.DummyProfiler.withMeasure(PerfUtils.kt:137)
at org.jetbrains.kotlin.compilerRunner.KotlinCompilerRunner.newDaemonConnection(KotlinCompilerRunner.kt:68)
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner.getDaemonConnection(GradleKotlinCompilerRunner.kt:239)
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner.getDaemonConnection(GradleKotlinCompilerRunner.kt:46)
at org.jetbrains.kotlin.compilerRunner.KotlinCompilerRunner.withDaemon(KotlinCompilerRunner.kt:178)
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner.performIncrementalCompilationWithDaemon(GradleKotlinCompilerRunner.kt:160)
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner.compileWithDaemon(GradleKotlinCompilerRunner.kt:140)
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner.doRunCompiler(GradleKotlinCompilerRunner.kt:119)
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner.doRunCompiler(GradleKotlinCompilerRunner.kt:46)
at org.jetbrains.kotlin.compilerRunner.KotlinCompilerRunner.runCompiler(KotlinCompilerRunner.kt:121)
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunner.runJvmCompiler(GradleKotlinCompilerRunner.kt:85)
at org.jetbrains.kotlin.gradle.tasks.KotlinCompile.callCompiler$kotlin_gradle_plugin(Tasks.kt:214)
at org.jetbrains.kotlin.gradle.tasks.KotlinCompile.callCompiler$kotlin_gradle_plugin(Tasks.kt:125)
at org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile.execute(Tasks.kt:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
対策
androidProject/gradle.propertiesを下記のように修正してAndroid Studioを再起動。
org.gradle.parallel=true
org.gradle.parallel=false
stackoverflowやyoutrack.jetbrains.com内の識者によるとこれはjetbrainsに上がっているissue/KT-15562の問題らしく、具体的にはkotlin 1.0~1.2辺りでgradleを並列ビルドにした場合に発生するらしい。
なので、上記のようにgradle.propertiesにorg.gradle.parallel=falseを記載してからAndroid Studioを再起動で対策できた。gradleデーモン動いていたらターミナルで$ ./gradlew --stopした方がよさそう。
kotlin.incremental=trueでもこの問題が発生するようなことが書いてありますが、自分の環境ではkotlin.incremental=trueを入れても大丈夫でした。上記だけではビルドエラーが解決しない場合はkotlin.incremental=falseもgradle.propertiesに追記して見ても良いかもしれないです。特にkotlin 1.1.1以降利用の場合は(kotlin 1.1.1以降はデフォルトでkotlinのインクリメンタルビルドが有効らしいので)。
この問題はチーム内では自分の環境だけで発生しているようだったので、実際はユーザー/.gradle/gradle.propertiesに上記修正後の内容を追記しました。
参考
https://stackoverflow.com/questions/44429723/kotlin-compiler-in-android-application-connection-refused-to-host-127-0-0-1
https://youtrack.jetbrains.com/issue/KT-15562
https://kotlinlang.org/docs/reference/using-gradle.html