マイクロアプリを利用した開発術After Party DroidKaigi 2021
View Slide
自己紹介● 加藤 恭平● モバイル基盤部所属● Android アプリの開発効率化、基盤技術開発
マルチモジュールとは● 複数の Gradle モジュールから構成されるプロジェクト● 機能や実装レイヤーに沿ってモジュールを分割○ 分離の境界はプロジェクトによって様々● 分離により多くの恩恵を受けられるhttps://developer.android.com/training/dependency-injection/dagger-multi-module
マルチモジュール構成の利点(一部)● Gradle ではタスクベースでキャッシュシステムが存在● 変更差分がない場合 (*)キャッシュを利用した差分ビルドによりビルド時間が短縮可能● 依存関係が分離しているモジュール同士は並列ビルドも可能→ プロジェクトに合わせて適切にモジュール分割すれば差分 /並列ビルドで爆速なビルドを実現 💨
クックパッドアプリのマルチモジュール構成
クックパッドアプリの概要● VIPER アーキテクチャ○ https://techlife.cookpad.com/entry/2020/11/17/110000● モノリスモジュールを legacy と名付けて徐々にモジュールを分割● モジュールレイヤー○ app■ 用途ごとに存在するアプリモジュール○ feature■ 機能実装モジュール○ library■ UI, DataStore, Navigation 等の共通実装モジュール
モジュール構成
✌終✌
開発時の課題● モジュール分割後も開発中のビルド時間が長い○ モジュール分割しても動作確認をする際はアプリをビルドする必要がある○ 開発に関係ない機能も含めてすべてビルドする必要がある○ 下位モジュールを変更すると依存するモジュールがリビルドされてしまう● 課題はビルド時間以外にも …○ 開発時はアプリの特定の開発中の機能だけ触れれば良いが辿り着くのが面倒○ 特定の状態を再現したいが実装を書き換えたくない■ 誤ってそのままコミットしてしまったり …
マイクロアプリの導入
必要な機能だけ検証できるアプリ● 開発中の機能だけ検証できるアプリ● 必要最低限の箇所だけビルド● 開発中の機能に素早くたどり着ける● プロダクションコードを変更せずに特定の状態を試したい大規模なiOSアプリの画面開発を効率化するために動作確認用ミニアプリを構築する
マイクロアプリ(デモアプリ)● feature モジュールと1対1で作成するアプリ○ feature モジュール内の任意の機能 (Activity/Fragment)を指定してアプリとしてビルド● 開発中の feature モジュールをビルドするだけで OK○ 関係のない feature モジュールをビルドする必要なし○ → 通常アプリの差分ビルドで数十秒かかるところを数秒でビルド可能に● 機能に直接遷移可能な仕組みを用意○ → アプリ起動後すぐに開発中の機能に辿り着くことが可能に● 検証用のアプリ内で依存を書き換えることが可能○ → プロダクションコードに変更を加えずに状態の再現が可能に
マイクロアプリの裏側● 対象の feature モジュールを参照する app モジュールを作成● 検証したい機能(Activity/Fragment)を登録● DataStore にスタブを差し込み特定の状態を再現○ エラーや特殊なデータを再現
マイクロアプリの運用● 主に開発者が開発中に機能を検証する際に利用○ Compose Preview の活躍があり少し需要が落ちていそう○ UI だけでなく包括的な検証には便利● コードレビューはほぼしない● 開発時以外では使用しない○ PR レビュー時や QA のタイミングでは本物のアプリを使用● PR CI でマイクロアプリを生成可能○ 大規模開発で細かい検証を必要としていない場合など
今後の課題● スタブを大量に用意する必要があって辛い○ feature モジュールが依存する DataStore をすべて Hilt 上に定義する必要がある○ 本物の DataStore を一部置き換えることができず大量のスタブ定義が …● マイクロアプリの恩恵を受けられているのはまだ一部○ 古くから存在する機能の多くは legacy モジュールに残されたまま