マルチモジュール環境での、dummyモジュール導入によるビルドの高速化

最初にまとめ

各モジュール間の結合度(publicなクラス、インターフェース)を低く保ち、settings.gradleを工夫することで、最小限のコードでdummyモジュールを導入できる。dummyモジュールのコード量は限りなく少ないので、ビルド時間の短縮につながる。

サンプルは https://github.com/satoshun-android-example/GradleDummyProject にあります。少し本記事とモジュール名などが異なります。

本題

プロジェクトの規模が大きくなると、ビルド時間は増加する傾向にあります。マルチモジュールによるアプローチは、差分ビルドを効率良く動作させることが出来ます。本記事では、マルチモジュールプロジェクトに、dummyモジュールを差し込むことでビルド時間の改善をする方法を紹介します。

また、この記事では触れませんが、機能(画面)ごとにappモジュールを作るアプローチも良いと思います。

dummyモジュールとは

例えば、注文を行うorderモジュールがあるとします。今回の開発では、その注文画面は使う必要がないとします。使う必要がないので、orderモジュールは一時的に削除しても良いことになります。しかし、単純にモジュールを削除してしまうと、何かしらの参照エラーになってしまうので、order-dummyモジュールを作り、参照エラーになるクラスを実装します。具体的には、orderモジュールで定義されているpublicなクラス、インターフェースです。

今回、orderモジュールには唯一Orderクラスのみがpublicとして定義されているとすると、次のように書きます。

class Order {
  fun canOrder(): Boolean { ... }
  fun order() { ... }
}
class Order {
  fun canOrder(): Boolean { TODO("dummy") }
  fun order() { TODO("dummy") }
}

必要に応じて、orderモジュール、order-dummyモジュールを切り替えることでビルド時間を短縮することが出来ます。

どのようにモジュールを切り替えるか?

settings.gradleとGradleプロパティを用います。

まず、settings.gradleは次のようになります。

if (properties["dummyorder"]) {
  include "order"
  project(':order').projectDir = file('dummyorder')
} else {
  include ':order'
}

dummyorderプロパティに、何かしらの値がセットされていたら、dummyorderモジュールを使う設定になります。

dummyorderプロパティの設定はコマンドラインからは -P、Android StudioからはCommand-Line Optionsから指定します。

これで完了です。普段使わないモジュールをdummyに差し替えるテクニックでした。各モジュール間の結合度が低いなら、コード量少なくお手軽に導入することが出来ます。

雑談

まだ、この機能をプロダクションに導入していないので、もし導入したら、どれくらいの効果があったかを追記します。効果がない可能性も微レ存です。

Written by
あんどろいどでぃべろっぱぁー🍎