こんにちは、Androidエンジニアのあいばです。
じめじめと嫌な天気が続いていますが、いかがお過ごしでしょうか。
今回はAndroidX移行について書きたいと思います。
今年のGoogle I/Oのネタじゃないのかよというご意見もありそうですが、今回はちょっと大目に見ていただきたいと思います!
AndroidXについて
AndroidX の概要 | Android Developers
今やAndroidアプリ開発において必要不可欠な存在のSupport Libraryですが、その成長によって複雑で分かりづらくなってしまったのを整理しパワーアップさせたのがAndroidXのようです。
今回のゴール
AndroidX移行したプロジェクトをCircleCIでビルド&配信できること
早速やってみる
Auto migration
まずはこちらを参考にauto migrationを実行しました。
Migrating to AndroidX | Android Developers
Android Studioのメニューバーから [Refactor] > [Migrate to AndroidX] を実行するとgradle.properties
に次の2つのフラグが追加され、Android Studio のビルドシステムにより依存関係も自動的に移行されます。
android.useAndroidX=true
android.enableJetifier=true
追加で必要だった対応
build.gradle
- DataBindingについて次のエラーが発生
ERROR: Data Binding annotation processor version needs to match the Android Gradle Plugin version. You can remove the kapt dependency androidx.databinding:databinding-compiler:1.0.0 and Android Gradle Plugin will inject the right version.
次の行を削除する事で解決しました。
kapt 'androidx.databinding:databinding-compiler:1.0.0'
Android Studio Canary8から不要になっていたそうです。
DataBindingのkaptを書かなくても良くなった - Kenji Abe - Medium
- 次のように
exclude
などでサポートライブラリを指定している箇所は自動で移行されないため必要に応じて削除、修正が必要です。
implementation("com.squareup.picasso:picasso:$picassoVersion") { exclude group: "com.android.support", module: "exifinterface" }
- 自動で移行されたライブラリはバージョン
1.0.0
と指定されているのでその時の最新バージョンに更新します。
src
- importは正しく修正されていますが、コード内でも完全修飾で参照してしまっているので修正します。
RecyclerView.ItemDecoration.onDraw(Canvas, RecyclerView, RecyclerView.State)
など引数がNonNullに変更されたoverrideメソッドでエラーになるので修正が必要です。
テスト
ここまでの作業を終えてテストを実行したところ…
見ての通り撃沈です。
Robolectricを利用しているテストが初期化で失敗していました。 Robolectricのバージョンが3.xと古かったため最新にして再びテスト実行します。
結果
今度は OutOfMemoryError
となったので build.gradle
に次の設定を追加します。
android {
testOptions {
unitTests.all {
maxHeapSize = "1g"
}
}
}
成功です!
CircleCIでビルド
満を持してCircleCIでビルドします!
失敗です!
テスト実行時に先ほど倒したはずのOutOfMemoryError
が発生してます。
どうやらCircleCI 上のコンテナで使用できるメモリが不足しているようだったので、CircleCIのプランを見直しresource_class
オプションを利用することにしました。
Configuring CircleCI - CircleCI
今度こそ成功です!