小さな Android アプリを AndroidX に置き換えてみる

# 概要
[Android-KTX の正式版(1.0.0以降)が AndroidX に依存している](https://github.com/android/android-ktx/blob/1.0.0-alpha1/build.gradle#L62-L63)と知り、いずれは移行しないと厳しいかと思って、小さいアプリで AndroidX への置き換えを試してみました。

## 置き換え対象のアプリ
ごく小さい機能を持つアプリです。

- Activity 1つ
- Fragment 3つ
- Data Binding なし
- Android Architechture Components なし
- SQLite 不使用
- ほか Annotation Processing なし

## 環境
これらの情報は Android Studio の Help -> About で参照したものです。

| Key | Value
|:---|:---
| Android Studio | 3.2.1
| Build | #AI-181.5540.7.32.5056338, built on October 9, 2018
| JRE: | 1.8.0_152-release-1136-b06 amd64
| JVM: | OpenJDK 64-Bit Server VM by JetBrains s.r.o
| Windows 10 | 10.0

----
# 依存の書き換え

## 準備
Android Studio の機能である程度は自動的に変換をしてくれるのですが、それを利用するためにはビルド環境をある程度更新しておかないといけませんでした。

### build.gradle
Compile SDK Version を 28 に、Gralde Plugin を 3.2.0に更新します。

```groovy:build.gradle
 android {
-    compileSdkVersion 27
+    compileSdkVersion 28
     defaultConfig {

//...

     dependencies {
-        classpath 'com.android.tools.build:gradle:3.1.3'
+        classpath 'com.android.tools.build:gradle:3.2.0'
```

### Migrate to AndroidX を実行
Find Action (Windows なら Ctrl + Shift + A) で ```androidx``` と入力すればメニューが出てくるので、それを実行します。

![ss_androidx.png](https://qiita-image-store.s3.amazonaws.com/0/102004/788c4920-d46b-cfa1-09d4-d61da9578d0d.png)

実行前に現時点のプロジェクトを .zip でバックアップするか聞いてくるので、一応しておきましょう。
(まあ、何かあっても git 操作で回復できるとは思いますが……)

### 手直し
いろいろ変換されているのですが、このままだとビルドが通らないので手直しをしていきます。

```groovy:app/build.gradle
dependencies {
     def supportLibVersion = '27.1.1'
-    implementation "com.android.support:appcompat-v7:28.0.0"
-    implementation "com.android.support:cardview-v7:28.0.0"
+    implementation "androidx.appcompat:appcompat-v7:28.0.0"
+    implementation "androidx.cardview:cardview-v7:28.0.0"
```

自動変換でレイアウトファイルのFCDN指定も自動で直してくれるのかと思ったら、そのFCDN指定が間違っているので、結局自分で書き直す必要があります。

----
# どこを直すか？

## Support Library
大体は ```com.android.support``` -> ```androidx``` でいけそうです。また、v4やv7の指定は不要になっています。

```groovy:app/build.gradle
-    implementation "com.android.support:appcompat-v7:28.0.0"
-    implementation "com.android.support:cardview-v7:28.0.0"
-    implementation "com.android.support:customtabs:28.0.0"
-    implementation "com.android.support:design:28.0.0"
-    implementation "com.android.support:support-v4:28.0.0"

+    implementation "androidx.appcompat:appcompat:1.0.0"
+    implementation "androidx.cardview:cardview:1.0.0"
+    implementation "androidx.browser:browser:1.0.0"
+    implementation "com.android.support:design:28.0.0"
+    implementation "androidx.core:core:1.0.0"
```

```com.android.support:customtabs``` が ```androidx.browser:browser``` に変わったり、
```com.android.support:design``` が ```com.android.support:design``` になっていたりします。

## Test
Test の方はバージョン ```1.0.0``` がなく、 ```1.1.0``` を指定しないと依存解決ができない点に注意します。

```diff
-    androidTestImplementation 'com.android.support.test:runner:1.0.2'
-    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
+    androidTestImplementation 'androidx.test:runner:1.1.0'
+    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
```

それと、testInstrumentationRunner の方も直しておきます（上の Migration メニューで実行した場合は自動で直っています）。

```diff
-        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
```

## Import と Layout の修正
ソースコードやレイアウトファイルの指定は自分で直す必要があるようでした。
FCDN が変わっただけで、インターフェイスの変更はないので、Import をし直すだけで大丈夫です。クラスやレイアウトのファイル数が多くなると煩雑な作業になるかもしれないです。

あと、Migration すると自動でレイアウトファイルの FCDN が一部書き換わっていますが、そのままだとコンパイルできないので、自分で直します。

## 修正全体
そこそこ長いので gist に置きました。

https://gist.github.com/toastkidjp/225c5b76cb14d272c7d2e5d02019100d

----

# おわりに
Annotation Processing とかを使っていない、ごく簡単なアプリであれば、特に問題もなく1時間かからずに移行ができました。
これが業務で開発するような巨大なアプリだと、より時間はかかると思いますので、早めに計画をしておくと慌てずに済むと思います。

## 参考

- [Hello World, AndroidX](https://android-developers.googleblog.com/2018/05/hello-world-androidx.html)
- [androidx メモ](https://medium.com/@star_zero/androidx-%E3%83%A1%E3%83%A2-805a4269d1b2)
- [既存のプロジェクトの Support Library を AndroidX に移行する](https://rakuishi.com/archives/migration-to-androidx/)