はじめに
こんにちは。with で Android エンジニアをしている 石田(@maxfie1d) です。
本記事では 最近導入して機能開発が爆速になった Playground 環境について紹介します。
Playground 環境とは
アプリ全体ではなく、アプリの一部の機能のみをサポートしたアプリのことを with では Playground 環境と呼んでいます。ミニアプリやデモアプリと呼ばれることもあるようです。
アプリが大規模化していくにつれ、アプリ全体をビルドしたり、実際に触って動かしてみたりといったことが徐々にツラくなってきます。
記事執筆時点で with はサービス提供開始より 7 年が経過しており、with Android 版の LOC は 20 万行を越えそこそこの規模のコードベースになりつつあります。フルビルドをしてアプリが起動した上に何回も画面をタップしてやっと動作確認をしたい画面にたどり着く...。これを 1 日に何度も繰り返すのは大変です。
この課題に対応するために 先日 with の Android 版 (以下、with-android) では Playground 環境の導入を行いました。
Playground 環境の実現方法
ログインが必要な「ある機能 X」 の Playground 環境を作る場合を想定し、Playground 環境をどのように実現するかを説明します。
マルチモジュール化
Playground 環境を作成するにはマルチモジュール化が必須です。公式ガイドに沿ってマルチモジュール化していれば問題ありません。with-android は以前は図の左側で示されているようなシンプルなモジュール構成でしたが、2022年にマルチモジュール化に着手しました。
現在のモジュール構成の例を図の右側に示します。app
モジュールが feature-X
の他に feature-Y
feature-Z
等のすべての機能のモジュールに依存している一方で、playground-X
は feature-X
にのみ依存している点がポイントです。
playground-X モジュールの作成
Playground 環境で試したい機能とログイン機能への導線を含む Actiivty を作成します。
with-android の Playground 環境は以下のような画面になっています。非常にシンプルな作りとなっていて、「いいね!」や「もらったスペシャルいいね!」等のアイテムをタップすることで各機能にアクセスすることができます。右上の「歯車のボタン」をタップするとログイン画面へ遷移します。
いいね!の Playground 環境 | Playground 環境用のログイン画面 |
---|---|
例えば以下のようにして「いいね!」のボトムシートの挙動を確認することができます。
依存していないモジュールの画面への遷移をどうするか
さてここで 1 つ問題です。Playground 環境において依存していないモジュールの画面への遷移はどうすればよいでしょうか。with-android では Fake の画面へ遷移するようにしています。マルチモジュール化をした際に画面遷移は interface
を介して行うようにしており、これにより Playground 環境 でビルドした時は Fake に遷移し、app
でビルドした時は実画面に遷移するという制御を DI で行うことが可能となっています。
Playground 環境を導入して変わったこと
Playground 環境を導入して感じたメリットを簡単にまとめると以下のようになります。
- ビルド時間が 1/3〜1/10 程度になり、作業に集中しやすくスピーディーに開発を完了できる
- 目的の画面にすぐに辿り着けるので、動作確認を素早く行える
- アプリに入るかどうか分からない実験的な機能やプロトタイプを Playground 環境上に作って、プランナーやデザイナーと気軽に共有できる
直近の課題
Playground 環境を導入してみて感じた直近の課題です。
CI でビルドできるようにしたい
CI 上でも Playground 環境をビルドできるようにしたいと思っています。実現のアイデアとしては GitHub の Label もしくは Pull Request のコメントを使って好きな Playground 環境をビルドできるようにしたいと思っています。
Fake 画面の作成を効率化したい
現状 Fake 画面は手動で作っているため効率が悪いので、コード生成等を使って半自動的に作成できるようにしたいと思っています。
まとめ
with-android ではアプリの一部の機能のみをサポートしたアプリであるPlayground 環境を導入しました。マルチモジュール化ができているプロジェクトであれば、app
モジュールと別に playground
モジュールを作るだけで比較的簡単に導入することができます。Playground 環境を導入することで、ビルド時間が大幅に短縮されたりプロトタイプがしやすくなったりと複数の効果を得ることができました。今後さらに Playground 環境を充実させていきたいと思っています。