失敗しないAndroidX対応

AndroidXとは

Googleは5月に既存のSupport LibraryからAndroidXへの移行を発表しました。以下のような理由が挙げられています。

つまり、このライブラリの成長が混乱をもたらしているということです。現在、サポートされる最小 SDK レベルは 14 ですが、「v7」という名前が付いたコンポーネントやパッケージが引き続き存在しています。どれがプラットフォームにバンドルされている API で、どれが Android のさまざまなバージョンで動作するアプリ デベロッパー用静的ライブラリなのかを明確に区別できるようにしたいと考えています。

現在のSupport Libraryは28.0.0を最後にサポートが終了され、その後のアップデートはAndroidXにのみ適用されます。すぐに移行しなければならない訳ではないですが、継続的な開発がされている既存のアプリに関しては新しい機能を取り込んでいくために移行が必要になると思います。


どうやって移行するか

AndroidXに移行するにあたって、以下の二点が問題になります。

・人力ではプロジェクトの中にあるSupport Libraryに依存したコードを安全に移行できない、もしくは時間がかかる。

・利用しているライブラリの中でSupport Libraryに依存したものが使えなくなってしまう。

以上の二点に対して、Googleがそれぞれ解決策を用意してくれています。それが、Migrate to AndroidXツールとJetifierです。

Migrate to AndroidX

Android Studio Canary 14移行で利用できる機能で、プロジェクト内のJava/Kotlinファイル、XML、GradleファイルのSupport Libraryに依存する部分をAndroidXを利用するように書き換えてくれます。Android StudioのRefactor > Migrate to AndroidXをクリックするだけで利用できます。

Jetifier

Jetifierはライブラリのマイグレーションツールで、Support Libraryに依存したライブラリを、コンパイル時にAndroidXに依存するように変換してくれるツールです。内部的にはASMフレームワークを利用しており、リコンパイルされたファイルは ~/.gradle/cache/transfroms-{}/files-{}/以下に展開されます。

gradle.propertiesandroid.enableJetifier=trueを指定することで有効になります。Migrate to AndroidXツールを使った場合はデフォルトでこの設定がされるはずなので、特に何もしなくても有効になります。


Migrate to AndroidXをした後にビルドが通らなくなったときの対処方法

大抵はMigrate to AndroidXを実行するだけで移行が完了して問題なくビルドできるようになりますが、使っているライブラリや環境によってはうまく動作しないことがあります。その場合は以下の方法を試してみてください。

バグを引き起こしているライブラリを特定する

ライブラリによってはJetifierがうまくいかないことがあるようです。

代表的なところでは、以下のようなライブラリはアップデートが必要でした。

・Glide → ver 4.8.0以上にアップデートが必要

・Dagger Android → ver 2.16以上にアップデートが必要

Android Studioのキャッシュを削除する

コンパイルエラーは出ていないのにAndroid Studioのエラー表示が消えないことがあります。

このエラー表示に惑わされて不必要なソースコードの変更をしてしまうと、その変更がコンパイルエラーを引き起こして泥沼にはまってしまうので、Migrate to AndroidXを実行した後は何よりもはじめにキャッシュを削除した方がいいです。

Gradleのキャッシュだけを消してもAndroid Studioに残ったキャッシュがエラー表示の原因になってしまうようなので、File > Invalidate Caches / Restartを実行してAndroid Studioを再起動しましょう。

自分のケースではGroupieと拡張関数のライブラリがこのケースでエラーとして表示されていたので、同じようなライブラリを使っている人はぜひ試してみてください。


自分は以上の方法でAndroidXに対応できました。他に「こんな方法がうまくいったよ」という意見がありましたら追記しますのでぜひ@itometeamまでご連絡ください。