minne 事業部で Android アプリエンジニアをしている @tick-taku です。
2022年も終わりに近づきつつあるということで最近の minne の Android アプリの開発状況を紹介しようと思います。
開発体制
Android アプリエンジニア2名で開発しています。リモートワークを採用したりペパボ内で様々な変化があったのでメンバーの増減もあり、前回の執筆からメンバーは変わっていますが人数的には変わっていません。
開発言語
基本は Kotlin で開発しています。minne は長い歴史のあるアプリなので一部 Java で記述されたコードも混在していますが、必然性のない限り Java の実装を追加することは非推奨となっています。言語比率は 2022/11 現在以下のようになっています。
SdkVersion
minSdkVersion | 24 |
targetSdkVersion | 31 |
compileSdkVersion | 33 |
minSdkVersion は年明けに 25 に引き上げる予定です。流通額などの観点からサービスへのアクセスが5%以下となった API レベルはサポートを終了することを検討する運用をしています。Android は毎年新しいバージョンがリリースされますが、サポートするOSが多くなると考慮する事項が増加し開発効率が低下することが理由です。
compileSdkVersion は常に最新の API レベルに追従するようにしています。最新の API レベルのコンポーネントに触れなければいけないケースが出てきた場合に素早く対応できるようにするためです。
フレームワーク・ライブラリ
Jetpack Compose
おそらく現在 Android 界で一番ホットなフレームワークだと思います。DroidKaigi 2022 でも多くの Jetpack Compose に関する登壇が見られました。
従来の XMLは View とコード間の通信に DataBinding などの機構が必要でしたが、宣言的 UI である Compose ではその必要がなく Kotlin のメリットであるシンプルかつモダンな記述でレイアウトを表現でき、差分更新などにより XML よりパフォーマンスの向上が見込めるため minne でも導入しています。
現在は新規追加画面は Jetpack Compose を採用していますが、既存画面も Jetpack Compose にリプレイスしていく予定です。
Kotlin Coroutines
Kotlin 内での非同期処理には Coroutines を用いています。Java コードでは RxJava を利用していますが膨大かつ複雑なオペレータ群とは異なり、シンプルで Jetpack ライブラリとの親和性も高いため機能実装のコストが下がります。
Dagger Hilt
前回の記事で記載していたように Hilt が stable になったため導入しました。Hilt のおかげでラーニングコストの高い Dagger をより簡単に扱えるようになっています。
HTTP リクエスト
minne の Web API は今後 GraphQL で実装することを開発方針としています。そのため Android で GraphQL の HTTP リクエストを実現するために Apollo Kotlin を利用しています。既存の REST API では Retrofit2 を利用しています。
画像表示のリクエストでは Glide を用いています。Compose では Coil を用いています。
Paging 3
ページネーションの実現のために Paging 3 を導入しています。実装方法についてはこちらのテックブログをご覧ください。
アーキテクチャ
Jetpack ライブラリの親和性が高いため AAC の ViewModel を採用しているので MVVM を採用しています。昨年のイベントで説明しているため、詳しくはこちらをご覧ください 。
合わせてマルチモジュールを採用し積極的に移行していますが、minne は大きいアプリなので一筋縄ではいかずなかなか対応しきれていない状況です。
CI / CD
GitHub Actions
GitHub Enterprise Server を利用しているため追加料金がかからず GitHub のさまざまなアクションをフックして CI を走らせることができる GitHub Actions を利用しています。
fastlane, Danger
GitHub Actions 以前は Bitrise や Drone などを利用していたこともあり、Ruby が動けばプラットフォームにとらわれずとりあえず CI は動くと言う観点で基本的に fastlane によせています。また、PR のコードチェックに Danger を利用しています。
DeployGate
PR やリリースの動作検証時にテスターにアプリを配布するために DeployGate を利用しています。ペパボでは Google Workspace を利用してパートナーのアカウントを管理していますが個人のサイドローディングを許可していないため Firebase App Distribution での配布が難しくなっているため DeployGate を利用しています。(サイドローディングが唯一許可されている検証機用アカウントが存在しているため検証機ではそのアカウントを利用しています。)
外部サービスのアカウント管理により作業コストなどの負担が発生しているためよりよい配布方法を現在検討中です。
Renovate
Renovate でライブラリのアップデートを検知して自動で Pull Request を出すようにしています。ペパボとしては Dependabot を推奨していますが、minne では Version Catalog を用いて TOML ファイルでライブラリを管理しているおり、導入時点では Dependabot が未対応だったため Renovate を利用しています。
まとめ
minne の Android アプリ開発での現状を紹介しました。
最近の Android アプリ開発は Google が Jetpack ライブラリの準備やガイドラインを整備してくれていてかなり学習・実装コストが下がってきている気がします。minne もなるべくその流れに沿って柔軟に開発し迅速にユーザーへ価値提供できるようにと考えています。
その中で新しい技術を取り入れることによりレガシーとなってしまったコード達のリファクタリングなど、まだまだやらなければいけないことがあります。新しい技術を取り入れてユーザー体験や開発体験がよくなっていってることを実感したい・成長していきたいという方を募集中です!ぜひ一緒にスキルアップしていきましょう!