ユニファ開発者ブログ

ユニファ株式会社システム開発部メンバーによるブログです。

AndroidXに移行してみた

こんにちは、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メソッドでエラーになるので修正が必要です。

テスト

ここまでの作業を終えてテストを実行したところ…

f:id:unifa_tech:20190705120453p:plain

見ての通り撃沈です。
Robolectricを利用しているテストが初期化で失敗していました。 Robolectricのバージョンが3.xと古かったため最新にして再びテスト実行します。

結果 f:id:unifa_tech:20190705132902p:plain

今度は OutOfMemoryError となったので build.gradleに次の設定を追加します。

android {
    testOptions {
        unitTests.all {
           maxHeapSize = "1g"
        }
    }
}

成功です!

f:id:unifa_tech:20190705134010p:plain

CircleCIでビルド

満を持してCircleCIでビルドします!

失敗です! f:id:unifa_tech:20190705141658p:plain

テスト実行時に先ほど倒したはずのOutOfMemoryErrorが発生してます。
どうやらCircleCI 上のコンテナで使用できるメモリが不足しているようだったので、CircleCIのプランを見直しresource_classオプションを利用することにしました。

Configuring CircleCI - CircleCI

今度こそ成功です! f:id:unifa_tech:20190705142458p:plain