AndroidでKotlin Coroutinesを導入する際の注意点


導入方法

AndroidでCoroutinesを導入する際は、app/build.gradleに以下のように記載します。
バージョンは特に理由がなければ最新版を指定するのが望ましいでしょう。

build.gradle
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7'

注意点

以下に導入する際に起きたトラブルおよび原因、解決方法を記載します。

VerifyErrorによるアプリクラッシュ

Kotlin 1.3系(私の環境では1.3.41)を使用している場合に、Coroutinesのバージョンを1.3.7にすると、コルーチンの処理を呼び出したときにVerifyErrorが発生してアプリがクラッシュしました。

java.lang.VerifyError: Verifier rejected class com.volcast.data.VolcastRepositoryImpl: java.lang.Object com.volcast.data.VolcastRepositoryImpl.refresh(kotlin.coroutines.Continuation) failed to verify: java.lang.Object com.volcast.data.VolcastRepositoryImpl.refresh(kotlin.coroutines.Continuation): [0x12F] register v3 has type Reference: java.lang.Exception but expected Precise Reference: kotlin.jvm.internal.Ref$ObjectRef (declaration of 'com.volcast.data.VolcastRepositoryImpl' appears in /data/app/com.volcast.temp-6UrzwdYgEJRIKC9aa-RzVQ==/base.apk!classes2.dex)
        at com.volcast.di.DataModuleKt$dataModule$1$12.invoke(DataModule.kt:58)
        at com.volcast.di.DataModuleKt$dataModule$1$12.invoke(Unknown Source:4)
        at org.koin.core.instance.InstanceFactory.create(InstanceFactory.kt:50)
        at org.koin.core.instance.FactoryInstanceFactory.get(FactoryInstanceFactory.kt:36)
        at org.koin.core.registry.InstanceRegistry.resolveInstance$koin_core(InstanceRegistry.kt:87)
        at org.koin.core.scope.Scope.resolveInstance(Scope.kt:214)
        at org.koin.core.scope.Scope.get(Scope.kt:181)
        at com.volcast.di.ViewModelModuleKt$viewModelModule$1$7.invoke(ViewModelModule.kt:72)
        at com.volcast.di.ViewModelModuleKt$viewModelModule$1$7.invoke(Unknown Source:4)

原因

原因としては、どうやらコンパイラのバグのようです。
https://github.com/Kotlin/kotlinx.coroutines/issues/2049#issuecomment-638120448
(こちらではどうすることもできないやつですね。。)

解決策

解決策として、Kotlinを1.4以降にアップデートするか、Coroutinesのバージョンを1.3.6にダウングレードすることで解消できます。

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.6'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.6'

ちなみに2020年8月18日時点でCoroutinesの1.3.9がリリースされているものの、当問題が解決しているかはリリースノートを見る限り不明です。
(もし1.3.9にしたら動いた!という方がいましたら教えていただけると大変喜びます)
Releases · Kotlin/kotlinx.coroutines · GitHub

Kotlinをアップデートできるのなら、最新版を使えるという点でアップデートしたほうが良いかもしれません。
(とはいえプロジェクトの関係でいきなりバージョンアップできないことが多いかと思いますので、その時は大人しく1.3.6にしましょう)