"AndroidX" 移行の際につまずいた点

AndroidX移行を行なった際につまずいた点を残しておきます。

AndroidXとは直接関係ないところでつまずいているのですが、流れで自分と同じ問題にぶつかった人の助けになればと思います。

環境

- 移行前 移行後
Android Studio version 3.0 3.3 Canary 10
Gradle version 4.1 4.10
Plugin version 3.0.1 3.3.0-alphp10
Kotlin version 1.2.30 1.2.70

Android Studio 3.0 -> 3.1

Android Studio 3.0 -> 3.1のマイグレーションの際は、こちらの記事を参考にさせていただきました。

この記事では載せられていなかったのですが、3.1 Canary 8から、

kapt "com.android.databinding:compiler:$version"

を書かなくてもよくなりました。

Databindingのkaptの有無 ( + annotationProccessorにするかどうか)によって、エラーが発生するということはありませんでした。

kapt -> annotationProccessorにしようとした

※AndroidX移行とは無関係

gradle fileのimplementationやらannotationProccessorやら、kapの違いがイマイチよく分かっていなかったため、compile -> implementationにする際に、kapt->annotationProccessorとしてしまいました。

結果、DaggerでよくあるDaggerAppComponentが生成されず頭を抱えることになりました。

Kotlin使ってるならkaptでしょ...

どうして生成されないかは、JavaとKotlinのコンパイルの順番に関係しているようで、それは以下の記事を読むとよくわかります。

終わらないMigrate to AndroidX

Android Studio 3.3 Canary 10 特有のバグかわかりませんが、Migrate to AndroidXを行なったらUpdate indecies - Refresh java project dataと出て、そこから進まないっといったことが起きました。(Android Studio 3.2では起きませんでした。)

File -> Invalidate Caches /Restart...

を行なってから、またMigrate to AndroidXを行うと完了できます。

Dagger versionを上げることによってのエラー

Gradle Plugin versionを上げた際に、「Daggerも同じくversionを上げてください。」という警告が出たので、2.11 -> 2.17に上げてしまいました。(2.15で十分だったが、この際に最新にあげようと思って)

その後ビルドできたので、いざMigrate to AndroidX...したら、

Cannot find symbol databindingComponent
e: [kapt] An exception occurred: java.util.NoSuchElementExceptione: [kapt] An exception occurred: java.util.NoSuchElementException

2種類のエラーが発生しました。

初めはDatabinding周りのエラーだと思っていましたが、後者が原因だったようです。

二つ目のエラーはDagger 2.17に起こるバグのようで、issueが立っていました。

Daggerのversionを2.16にすることによって、両方のエラーが解決できました。

最後に

AndroidX移行はそこそこ最近のことで、それぞれの環境に依存するということもあり、情報があまりありません。

もし自分の記事によって、エラーが解決出来たなら幸いです。