minne 事業部でモバイルアプリエンジニアをしている @kyu です。
2024年も1ヶ月半が経ち、心機一転新たな気持ちで頑張っていきたいところですが、2023年度は最近のminne Androidの開発環境について紹介できていなかったので、紹介しようと思います。
開発体制
現在、minne Androidはエンジニア2名が基本体制ですが、加えてiOSエンジニアでありながらAndroid開発もできるパートナーがいるため、状況に応じて3名体制で作業を進めています。
開発言語
主にKotlinを使用して開発を行っています。minneは10年の歴史を持つアプリなので、一部のコードはJavaで記述されていますが、必要がない限りJavaの実装は避けるようにしています。2024年2月時点での言語比率は以下の通りです。 前回の報告と比較してKotlinの比率が増加しており、Javaの比率を7.2%減少させました。今年も積極的にKotlinへの移行を進め、来年にはJavaの比率を10%以下にできるよう頑張ります。
SdkVersion
minSdkVersion | 24 |
targetSdkVersion | 34 |
compileSdkVersion | 34 |
compileSdkVersionは常に最新のAPIレベルに追従し、最新のAPIレベルのコンポーネントに触れる必要が生じた場合、素早く対応できるようにしています。 minSdkVersion を 25 に引き上げると前回の記事で記載していたのですが、minne AndroidではDynamicFeatureModule (DFM) のバグのため、minSdkVersionを更新することが難しい状況です。 ただし、現在 DFM の使用を廃止しようとしており、今年中に minSdkVersion を更新する予定です。
フレームワーク・ライブラリ
Jetpack Compose
前回の記事から引き続き Jetpack Compose を使用しています。 minne Android 内でも知見が溜まってきており、新規追加画面では基本的には Jetpack Compose で実装を進めるようにしています。また、既存画面も順次 Jetpack Compose に移行しています。2023年内において、いくつかの画面を Jetpack Compose で書き換えたため、その成果について別の機会でご紹介させていただきます。
Kotlin Coroutines
Kotlin内での非同期処理にはCoroutinesを利用しています。Coroutinesはシンプルであり、Jetpackライブラリとの親和性も高いため、機能実装のコストが低くなります。JavaコードではRxJavaを使用しています。
Dagger Hilt
前回から引き続きDIライブラリには Hilt を使用しています。 Hilt のおかげで、簡単に依存性の注入を扱うことができるようになりました。モジュール間でのDIでHiltがよしなに行ってくれるので、マルチモジュール化に重宝しています。
HTTPリクエスト
minneのWeb API は今後 GraphQL で実装する予定です。そのため、Android で GraphQL のHTTPリクエストを実現するために Apollo Kotlin を利用しています。既存のREST API では Retrofit2 を使用しています。
画像表示のリクエストにおいて Jetpack Compose では Coil を使用し、それ以外では Glide を使用しています。
Paging 3
ページネーションの実現にはPaging 3を導入しています。詳細な実装方法についてはこちらのテックブログを参照してください。
Mockito
モックライブラリとして Mockito を使用しています。ユニットテストで使用するオブジェクトのモック化が容易で、モック化されたオブジェクトの振る舞いも簡単に記述できるので、テストが簡潔に記述できます。
アーキテクチャ
アーキテクチャにおいては前回の記事から引き続き、Jetpackライブラリの親和性が高いため、AACのViewModelを採用し、MVVMアーキテクチャを採用しています。 また、マルチモジュールの採用を積極的に進めていますが、minneは大規模なアプリであるため、実装には時間がかかっています。
CI/CD
GitHub Actions
GitHub Enterprise Serverを使用しており、追加料金なしでGitHub Actionsを利用してCIを実行しています。
fastlane、 Danger
Rubyが動作すればプラットフォームに依存せずCIを実行できるため、基本的にfastlaneを使用しています。また、PRのコードチェックにはDangerを利用しています。
DeployGate
PRやリリースの検証時にアプリをテスターに配布するために DeployGate を使用しています。個人のサイドローディングが許可されていないため、Firebase App Distribution の代替手段として DeployGate を利用しています。
Dependabot
minneでは Version Catalog を利用してライブラリを管理しており、その管理されているライブラリのアップデートを検知して自動で Pull Request を生成するために Dependabot を使用しています。 以前の記事では Renovate を使用していましたが、ペパボでは Dependabot を推奨しているのと、 Dependabot が Version Catalog に新たに対応したため、現在は Dependabot に完全移行しました。
まとめ
2024年2月時点の minne の Android アプリ開発の現状を紹介しました。 前回記事からの差分は技術の変化はあまりありませんが、引き続き Jetpack Compose を中心に新しい技術を取り入れ、レガシーコードのリファクタリングやユーザー体験の向上に努めています。
私たちの目標は、常にユーザーにとって価値のあるアプリを提供し続けることです。そのために、新しい技術やベストプラクティスを積極的に取り入れ、チームと共に成長し続けています。
minne の Android アプリ開発に興味がある方、一緒にスキルアップしていきたい方はぜひご応募ください!私たちと一緒に成長し、素晴らしいアプリを作りましょう!