Gunosy Tech Blog

Gunosy Tech Blogは株式会社Gunosyのエンジニアが知見を共有する技術ブログです。

Androidのマルチモジュール化対応とその効果

こんにちは。Android アプリ開発担当の nagayama(@nagayan_dev)です。
今回私が担当している「auサービスToday」で マルチモジュール化対応 を行ったので、その対応内容とその結果についてお話しできたらと思います。

背景

「auサービスToday」ではマルチモジュール化を行っておらず、1 つのモジュールでアプリ開発を行っていました。以前 Jetpack Compose の導入 を行いましたが、開発を進めていると レイアウトプレビューの時間が膨大にかかる ことに気がつきました。

引き続き調査を行ったところ、Compose ファイルを別モジュールにするとプレビューが早くなる。という噂を聞きつけました。試しに Compose モジュールを作成してみたところ、本当にプレビューがすぐに表示されるようになりました。

こちらを受け「どうせやるならアプリ全体をマルチモジュール化してしまおう。」という方針となり、今回「auサービスToday」のマルチモジュール化を進めることとなりました。

マルチモジュールの設計

過去に弊社で行った他アプリでの マルチモジュール化対応 や、社内外のアプリのソースコードを参考に下記のような設計をしました。

  • feature / domain / data の大枠構成で分割
  • 共通で参照できる common 、 entity モジュールを配置
  • アプリのベースとなる base 、 app モジュールは他のモジュールを参照できる

となっています。

過去の対応からの改善点

過去の対応 にて、

画面追加時の追加ファイルが多い

という欠点がありました。
実際に新規画面を作成する際は、

  • レイアウト構成ファイル(Fragment / ViewModel 等)
  • AndroidManifest.xml を作成
  • build.gradle を作成
  • res / drawable 等 のパッケージを追加

等を行う必要があります。

そこで「auサービスToday」では基本的に画面のモジュールは screen 1 つにまとめました。これにより共通ファイル・フォルダを使用するため、新規画面作成時は

  • レイアウト構成ファイル(Fragment / ViewModel 等)

のみになり、手間を大幅に減らすことができました。

マルチモジュール化の効果

対応前後によるビルド速度

マルチモジュール化を行うとビルドが早くなると言われているが、本当にそうなったかを確認しました。対応前後でのそれぞれのビルドパターンで、ビルド時間を測定して平均値を算出しました。

ビルドパターン 対応前 対応後 差分
全ビルド( clean + run した場合) 1m 56s 2m 29s + 33s
差分ビルド(一部コードを修正 + sync + run した場合) 1m 48s 47s - 1m 1s
  • アプリを 1 からビルドする場合の「全ビルド」では 約 30 秒遅くなってしまった。
  • 一方、アプリの開発で実行するような「差分ビルド」では 1 分ほど早くなりました。

アプリ開発での確認の実行は格段に早くなったため、開発がスムーズに進められるようになりました。が、「全ビルド」時には遅くなってしまったため、今後の要確認箇所になります。screen モジュール 1 つではなく個々のモジュールにすればかなり解消されるかもしれませんが・・今後の運用次第で判断したいと思います。

良かった点

今回のマルチモジュール化対応を行って良かった点は下記になります。

  • 開発ビルドが早くなった
    • 「差分ビルド」でのアプリ実行が早くなったので、開発がスムーズになりました。
  • Compose の Preview がすぐに映る
    • 元々達成したかった問題が解消できました。
  • 役割分担が整備された
    • 参照関係が明確になるため、追加実装があってもどこにどう実装すれば良いかが分かりやすくなりました。
  • 散見されていた data クラス / enum クラス を整理することができた
    • いろんなクラスに定義されていた data クラス / enum クラス を entity モジュールに全て移動させたことで整備することができました。

改善点 / もっとこうしたかった点

改善点やもっとこうしたかった点は下記になります。

  • ビルドはもっと早くなるかも?
    • 「全ビルド」が遅くなったのは、今後の検討材料です。
  • 画面追加時の作成ファイル数が他のマルチモジュールの場合より少ないとはいうものの、それでも作成するファイルは多い
    • Jetpack Compose の開発となると、複数モジュールで開発せざるを得ないです。
    • テンプレートでまとめて作れるような仕組みを作ってみたいです。

まとめ

今回は「auサービスToday」での マルチモジュール化対応 の対応内容とその結果について書きました。改善点はまだまだあるものの、開発の効率化に対しては大きな貢献ができた対応であったのではないかと思います。