Android 28対応でAndroid Xに移行してみた話

アプリをフルリファクタリングしました。

play.google.com

このアプリって?

1回目の無職期間に、Androidアプリの練習をしようと思って作ったものです。
やりたかったことは「毎日 or 曜日ごとに繰り返すTODOの管理」になります。そのため、下記2点ほどを実現することとしています。

  1. TODOにDBに保存
  2. 登録した時間になったら繰り返し実行
旧バージョンでの実現方法

作成したのが2017年1月ごろだったので、基礎の基礎から組み上げてやろうと考えてました。

  1. TODOをDBに保存
    • SQLiteHelperクラスの実装により、直にSQLiteを操作することに
    • RealmとOrmaの利用を検討したが、そもそもSQLがよくわかってなかったの組んでみることに
  2. 登録した時間になったら繰り返し実行
    • Android 5.0以上を対象としたため、JobSchedulerによる実現をしてみることに
    • 実現のため、LocalDate型の導入のためにThreeTenABPに頼ることに

そのほかはDataBindingとか、Snackbarを入れてみるとか程度のことをしていました。

新バージョンでの実現方法

9月から転職したので、その直前の有給期間からAndroidX(当時はalpha版)を利用してフルリファクタしてみようと考えていました。 前職ではAndroid Architecture Componentsを導入してMVVMな感じにアプリをリファクタしたこともあったので、「じゃあ今一番新しいものを使って書くとしたらどうなるんだろう」ってな感じで興味が湧いたためです。

  1. TODOをDBに保存
    • AAC Roomを利用し、VM層でやり取りをすることに
    • 操作スレッドはKotlin Coroutinesにより、asyncとlaunchを切り替えてコストを低く
    • 基本的には取り出したデータをLiveDataでView層へ送信
  2. 登録した時間になったら繰り返し実行
    • AlarmManagerを選択
      • 結局、一度もAlarmManagerを触ることなくAndroidエンジニア4年目に入ってしまったで、ここで触らないと触る機会なさそうだなと感じたのが一番の理由
      • JobSchedulerやWorkManagerを利用することも検討し、バージョンアップで置き換えてみれば置き換えの経験も積めそうだなーというのが目論見に

8月中はがっつりと、9月以降は土日とか平日の夜とか使って書いてました。途中、AndroidStudio3.2系から3.3へのアップデートが発生したり、Dagger + ViewModelの関係でビルドが通らなくなったりといったトラブルに巻き込まれたので、期間としては2ヶ月ほどかかってしまいましたね。もうちょっとコンパクトにできればなーと思いますが。

AndroidX対応

どうせならtargetSDKを28にしてしまえということで、androidxを入れました。感想です。

  • よかったこと
    • Material Design 2がのテキストフィールド、SnackBarの動作が良い
    • 複数の選択をさせたい時のChipの使い勝手が非常に良い、革新的
  • 大変だったこと
    • PreferenceFragmentCompatを利用していたのですが、Preferenceクラスの実装がリファクタされていたのに気づくのが遅れ、大幅に実装し直すことに
      • 実装はライブラリ化し、v1系からv2系への更新で対応したので、気になる方は差分を見ていただければ
      • 一部のバグ(ボタンのデザインが崩れる、Android Lintで警告が出る)のが残っているので、早めに対応したいところです
      • リファクタリングの意図としては、これまでPreferenceDialogクラスが「リストの表示 + ダイアログの表示」になっていたので、後半をPreferenceDialogFragmentとして切り離しています
    • SupportLibraryのクラスを追加する時、それがandroidxでどのパッケージに入っているか自分で調べるのが(少し)難しい
    • (alphaだからだけど)ビルドエラーが頻発する

対応タイミングとしては、製品なら年明けぐらいがいいのかなーと思っています。早くBrowserのバグ直ってほしい。

今後

DailyToDoをiOSでも動かしたいので、Flutterで改めて実装してみようかなーと。 新しい技術、触っていきたいですね。