chocoZAPを支えるAndroidアプリ開発技術とチーム
▼RIZAPが協賛した「DroidKaigi」の様子はこちらでご紹介しています!
技術スタックについて
まずは技術スタックの紹介 1ページ目です。
chocoZAPアプリは、2023年12月にFlutterアプリ1本からAndroid/iOSのネイティブアプリ2本へと生まれ変わってリリースされました。新しく作られたアプリであることから、全面的にKotlinとJetpack Composeを採用しての開発に振り切っています。
今では様々な技術資料がこれらを用いて記載されているため、新しいことを取り入れやすい土台があります。また、JavaとViewは使っていないため共存させるための考慮が少なくて済む点も良い環境です。
ちなみにKotlinのバージョンについて、 DroidKaigi 2024開催当時に使用していたバージョンは 1.9.23 でしたが、現在は 2.0.20 を使用しています。
通信はOkHttpとRetrofitというよく見るライブラリたちですが、シリアライズはMoshiとKotlin Serializationが同居しています。もともとはMoshiだけでしたが、最近はKotlin Serializationも導入しており、移行している途中です。
続いて技術スタックの紹介 2ページ目です。
残念ながらテストについてはあまり書けていない状態ですが、後述のアーキテクチャの紹介で登場するUseCaseについてはある程度テストを書けています。将来的にはスクリーンショットテストもやっていきたいと考えており、DroidKaigi 2024で仕入れた情報を参考に着手していきたいです。
chocoZAPアプリでは外部デバイス連携として、chocoZAPに入会された方へ配布しているスターターキット(※1)からデータ取得する機能があります。その際にBluetooth通信を使用しているのですが、アプリでは生データを扱うのではなく、ベンダーから提供されたSDKを介してデータ取得しています。
アプリの構成としてはMulti Moduleで組まれており、Convention Pluginsで独自のGradle Pluginを作成して設定を共通化しています。chocoZAPアプリはModuleが30以上あるため、Gradleの記述を楽にするために導入しました。
他に特徴的な点としてはGoogle MapやGoogle Fitの利用があります。Google Mapは店舗を検索する際の地図表示として使用しています。Google Fitは連携することで、現在は歩数のみですがアプリに表示することができます。
アーキテクチャについて
ここからはchocoZAPアプリのアーキテクチャの紹介となり、まずは1ページ目です。 まずこちらは簡略的なModule構成です。実際は完全にこの通りに分類して運用できてはいないですが、細かいModuleを分類していくとこの範囲に収まる、といったものです。
基本はAndroid Developersにて紹介されている アプリ アーキテクチャ ガイド(※2) を踏襲しています。 補足が必要と思われるModuleを説明しますと、featureが各機能たち、uiが共通のComposableを配置しているなどのUI向け共通処理です。
serviceは外部デバイス連携に関する処理や、一部ライブラリのwrapperなどをModuleにしたものが配置されています。 commonにはアプリ全体向けの共通処理が置かれ、configは定数のみが集まっています。 repositoryは依存性逆転の原則を意識して作成しています。
DroidKaigi 2024のブースでみなさんとお話しした際に、多くの方から「ウチもこんな感じです」といった反応をいただきました。 そのため、Android Developersのアプリ アーキテクチャ ガイドを押さえておけば、多くの場所で通用するという印象を受けました。
次はアーキテクチャの紹介 2ページ目として、呼び出しの流れを示した図です。
厳密にはApplicationからActivityへの明示的な呼び出しはしていませんが、立ち上がる順番的に、流れを補助するものとして矢印を伸ばしています。
chocoZAPアプリは単一のActivityのみを使っており、そこでScreenと命名された各画面を表すComposable関数を呼び出しています。ActivityやComposable関数からはViewModel、UseCase、Repositoryと呼び出していきますが、ViewModelからRepositoryを呼び出している箇所もあります。
開発組織・働き方について
最後はチームの体制と業務のフローについての紹介です。
chocoZAPは企画部署と開発部署に分かれており、開発としてはPM(Project Manager)/デザイナー/エンジニア/QAがひとまとまりとなっています。エンジニア目線では、PMとタスクや仕様の調整、デザイナーとはデザインの調整、QAとは動作確認のやりとりを行っています。
補足として、弊社は各職ともフルリモートでの作業ですが、Android/iOS含めたモバイルアプリのエンジニアメンバーは「オフィスアワー」と銘打ったSlackのHuddle集会を毎朝行っています。
そこで作業の相談、モブプロ、雑談などをしており、コミュニケーションが滞ることなく開発を進めることができています。チーム間で行う定期的なMTGとしては、モバイルチームで日々PMと進捗確認や相談を行い、週次で次回リリースの確認会を行っています。
また、弊社はAndroidの技術顧問として あんざいゆきさん(※3)にご協力をいただいており、週次であんざいさんと弊社Androidエンジニアでお話をする場を設けています。先に述べたConvention Pluginsなど、この場であんざいさんから様々な技術情報をアドバイスいただいています。
以上がDroidKaigi 2024で展示していた資料の説明です。
chocoZAPに興味を持たれたり、資料を見ていただいて「これなら担当できそうだ」と思われた方は、ぜひ一緒に開発を楽しみましょう。
[注釈]
※1 スターターキット
chocoZAPでは入会された方に「スターターキット」を配布しています。このキットにはヘルスウォッチと体組成計が同梱されており、どちらもBluetoothを用いてchocoZAPアプリと接続する機能を持っています。
chocoZAPアプリではこれらのデバイス開発元のベンダーから提供されているSDKを用いて、様々なデータを取得し記録することができます。
ユーザには記録されたデータをグラフなどの見やすい形で提供し、簡単に日々の成果を実感いただけるようになっています。
※2 Android Developersにて紹介されている アプリ アーキテクチャ ガイド
※3 Androidの技術顧問 あんざいゆき さん