はじめに
with Androidチームでは、Jetpack Compose化 と、モジュール分割 の二つの大きなリファクタリングを進めており、自分はモジュール分割を主に担当しています。
マルチモジュール構成でアプリを実装することの大きなメリットとしては、「モジュール間の依存制限による、誤った依存の防止」や「ビルド速度の向上」などがよく挙げられますが、効果のほどはわからず進めていました。
ということで、自分のリファクタリングがどんな影響を及ぼしているのかを知るために、モジュール分割によってビルド時間がどれくらい変化しているかを調査してみました。
前提
with-androidは、ざっくり下記のような構成でできています。
.
├── app
├── data
├── domain
├── playground
├── presentation
│ ├── atomicdesign
│ ├── atomicdesigncatalog
│ ├── auth
│ ├── common
│ ├── dialog
│ ├── feature
│ └── presentation
└── shared
今回はこのうち、:presentation:presentationモジュール
に存在するファイルを、機能単位でモジュール分割してfeatureに入れていきます。
:presentation:presentationモジュール
には、presentationレイヤーで使用するファイルが丸ごと入っていました。機能追加に伴い、リソースファイルやコードが増えていったことで、このモジュールが占めるビルド時間が一番多くなっていたため、モジュール化を通してビルド時間を改善していきたいという意図があります。
また、調査は下記の方法で実施してみます。
-
モジュール分割前に、
:presentation:presentationモジュール
配下のファイルAを変更した際のビルド時間を調査する。
→元のビルド時間を調査するのが目的 -
モジュール化後に、
:presentation:presentationモジュール
配下のファイルBを変更した際のビルド時間を調査する。
→モジュール分割によって、:presentation:presentationモジュール
のサイズが小さくなったことの影響を調査するのが目的 -
モジュール分割後に、
:presentation:feature:hogeモジュール
配下のファイルA'を変更した際のビルド時間を調査する。
→モジュール分割によって、:presentation:feature:hogeモジュール
に存在するファイルのみが差分ビルドされるようになったことの影響を調査するのが目的
ビルド時間は、Android StudioのBuild Analyzerを使用して調査します。
1.モジュール分割前に、:presentation:presentationモジュール
配下のファイルAを変更した際のビルド時間を調査する。
まずは現在のビルド時間を調査します。
結果はこちら。
2.モジュール化後に、:presentation:presentationモジュール
配下のファイルBを変更した際のビルド時間を調査する。
次に、変更によるサイズ減少の影響を調査します。
結果はこちら。
分割前と分割後で比較すると、ほんのちょっとだけ速くなっています。
長い目で見た時や、リソースファイルのサイズが大きい機能をモジュール分割した場合は影響が大きいのかもしれませんが、今回の修正でのビルド時間に対するインパクトは小さいことがわかりました。
3.モジュール分割後に、:presentation:feature:hogeモジュール
配下のファイルA'を変更した際のビルド時間を調査する。
最後に、分割による差分ビルドの影響を調査します。
結果はこちら。
1→2と比較すると、結構速くなっているのがわかります。
差分ビルドによって、:presentation:presentationモジュール
に存在する無関係のファイルがビルドに含まれないことの影響が大きいということがわかりました。
結果
- モジュール分割をすることで、ビルドするモジュールのサイズが小さくなることの影響は小さい。
- モジュール分割をすることで、分割されたモジュールのみがビルドされるようになることの影響は大きい。
- ということは、今後分割したモジュールのみを修正する際は、ビルド速度向上の恩恵を受けることができる。
- 関係があるファイルを適切にモジュール分けするのも大事
おわりに
今回の調査では1つのファイルしか修正しなかったので、もしかしたら複数ファイルを修正したり、リソースを追加したりすると結果が変わる可能性もあるかなと思っています。
とはいえ、「状況によってはモジュール化リファクタリングをすることでメリットがある」という事実を知ること、実感を得ることができました。
おかげで今後もモチベーション高く進めていくことができそうです。
おわり。