AndroidXへの移行

Androidアプリケーションレイアウトを司るライブラリは、現在AndroidXになっています。しかし、昔は古いライブラリを使用していました。私が初期に作成した「さっぽろ周辺マップ」も、古いライブラリのまま使ってきました。

そして「さっぽろ周辺マップ ライト2」をリリースするにあたり、内部テストをしていたのですが、実機やエミュレーターでは問題なく動いていたのですが、リリース前レポートで以下のエラーが発生していました。

at android.support.v7.widget.c$d.setFrame(Unknown Source:60)

どうやら、古いライブラリを使うと3機種ほどのスマートフォンで問題が起こるようです。ここは一気にAndroidXに移行してしまうのが得策と考え、修正しました。

1.build.gradleの修正

build.gradleを修正します。バージョン番号は適度に修正してください。

古いライブラリを削除

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'

新しいライブラリを追加

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

2.レイアウトの修正

constraintlayoutに変更します。

古いレイアウトを削除

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
・・・・

</RelativeLayout>

※RelativeLayout以外も使っていました

新しいレイアウトを追加

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
・・・・

</androidx.constraintlayout.widget.ConstraintLayout>

3.Activityの変更

古いライブラリを削除

import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;

新しいライブラリを追加

import androidx.appcompat.app.AppCompatActivity;

4.gradle.properties

以下の2行を加えます。

android.useAndroidX=true
android.enableJetifier=true

5.動作結果

ここに載せた修正以外にも、プロジェクトによっては修正が必要になるでしょう。

やってみると、ビルドが通って、外見上は特に変更がない状態で起動もできました。内部テストのエラーも消えました。面倒な作業でしたが、もしかしたらRefactorで変更できるのかもしれません。東京周辺マップの時は、何か自動でやった記憶があったのですが、思い出せませんでした(結局はトラブルだらけだったのですが)。