クックパッドアプリのマルチモジュール化への取り組み

 クックパッドアプリのマルチモジュール化への取り組み

2018-08-21 Cookpad.apk #1
Chihiro Koyama

B61a8b5e5ce71ea4796afaea614bbb19?s=128

こやまカニ大好き

August 21, 2018
Tweet

Transcript

  1. クックパッドアプリの マルチモジュール化への取り組み こやまカニ大好き

  2. 自己紹介 こやまカニ大好き(@nein37) • 技術部 モバイル基盤G • Android テックリード • クックパッドアプリの技術選定

    • 社内の全Androidプロジェクトの技術的なサポート
  3. 今日話す内容 • マルチモジュール化とは • なぜマルチモジュール化するのか • クックパッドアプリにおけるマルチモジュール化 • 現在のクックパッドアプリの状況

  4. マルチモジュール化とは

  5. こういうやつ :app :feature_1 :feature_2 :feature_3

  6. クックパッドアプリでいうと… :app :検索 :編集 :料理きろく ※実際のモジュール構成とは異なります

  7. なぜマルチモジュール化するのか

  8. 時代の流れ • 新機能の開発にモジュール化が必須/推奨されている ◦ Instant App ◦ Dynamic Feature(Dynamic Delivery)

    ◦ Wear OS / Android TV / Android Things • ビルドシステムのサポートも進んでいる ◦ Android Plugin for Gradle v3 から高速化 ◦ モジュールの並行ビルドにも対応
  9. InstantApp • Instant App では base + feature の合計サイズに 4MB

    制 限が適用されるため、アプリとコードを共有するためには feature のモジュール化がほぼ必須
  10. DynamicFeature • Dynamic Feature を実装するためには専用の設定が入っ たモジュールが必須

  11. その他

  12. クックパッドアプリの(旧)構成 • ファイル数およそ 2,800 • 総行数およそ 280,000 • 完全なモノリシックアプリ •

    2013年から引き継がれてきた秘伝のソース • ほとんどの箇所でレイヤーアーキテクチャ未導入
  13. クックパッドアプリのビルド遅い問題 • クリーンビルド 5〜8分 • 差分ビルド 2〜3分 • InstantRun がうまく動作していない

  14. クックパッドアプリのビルド遅い問題 • なぜマルチモジュールでビルドが高速化するのか ◦ 変更がないモジュールの成果物をキャッシュしてくれる ◦ モジュールビルドの並列実行もできる ◦ Android Developersにもライブラリモジュール作れと書いてある

  15. 理由まとめ • モノリシックではできないことが増えていく • 自分のプロダクトで最新技術が試せないのは悔しい • ビルドがとにかく遅い遅すぎる →マルチモジュール化やっていくぞ!

  16. クックパッドアプリにおけるマルチモジュール化

  17. 最初の一歩として考えていたこと • 新しい library モジュールを作成し、一部の機能を移す • app モジュールに library モジュールを参照させる

    • これを繰り返せばマルチモジュール化できるぞ • 簡単なところからコツコツ切り出していこう!
  18. つまりこう :app :app :feature_1 :feature_2

  19. 実際にやったこと • まずは library モジュール(※)を作成し、全ての機能を移 す • app モジュールに library

    モジュールを参照させる ※ legacy モジュールと呼んでいる
  20. つまりこう :app :legacy :app

  21. 実際に出来上がったもの • 4日間かけて巨大なPRを生成(初回は失敗) ◦ File Changed 3,820 ◦ +100,025 ◦

    -99,572
  22. なぜそんなことをしたのか • アプリモジュールが大きいままだと細かく機能を切り出すモ チベーションが生まれない • 巨大なライブラリモジュールを作ることで上層、下層両方を モジュールに切り出しやすくなると考えた ◦ legacy モジュールに依存させておけば上層のモジュールも切り出しやすく

    なるのでは?
  23. こうしていきたい :legacy :app :legacy :app :feature_1 :feature_2 :ui :common

  24. マルチモジュール化爆発ポイント • DataBinding が爆発 ◦ AGP 3.2 beta にして解決(v2 でも良さそう)

    ◦ ライブラリモジュールの application ID は必ず別のものにする • アプリバージョンや BuildConfig への参照が爆発 ◦ app module 側の定義は legacy から参照できない ◦ legacy 側で Interface を定義して app 側で実装を注入 ◦ BuildConfig への依存は減らしていったほうが良い • test / androidTest が爆発 ◦ 上記のアプリパラメータ Interface を Mock したりいろいろ • Fabric など一部のライブラリが爆発 ◦ CustomApplication クラスや application ID に強く紐付いた処理は app 側に持ったほうが良い
  25. 成果 • 差分ビルドが爆速化 ◦ 差分ビルド時間が 3分 → 30秒 ◦ InstantRun

    もまともに動作するようになった ◦ マルチモジュール化の前に行った flavor / buildType 整理の効果もある
  26. 現在の状況(マルチモジュール化からおよそ1ヶ月)

  27. 現在は ui モジュールも分割済み • 現在は ui モジュールも分割済み ◦ ui ->

    library -> app という構成 ◦ アプリ全体のデザインリソースを整理しつ つ移動 ◦ 汎用 CustomView も移動 • 画面毎のデザインリソースは ui に は含めない ◦ module のビルドキャッシュが有効になる 範囲で考える :legacy :app :ui
  28. 依存定義を buildSrc + Kotlin で記述 • buildSrc ディレクトリにソースを置くと自動的にコンパイル して build.gradle

    で読めるようにしてくれる • buildSrc の中身は Kotlin で書ける
  29. 依存定義を buildSrc + Kotlin で記述 • dependencies で利用するときに補完してくれる • 参考記事

  30. legacy からの切り出しはまだまだ進行中 • InstantApp や DynamicFeature 導入はまだまだ遠い • 現在は認証・通信周りを切り出す作業中 •

    各機能へのレイヤーアーキテクチャ(VIPER)導入も進行 中
  31. ビルド周りの最適化も進行中 • まだ並列ビルドがうまく動いていない • AppBundle によるリリースなどもこれから • ビルド周りだけでも改善できるところはいっぱいありそう

  32. まとめ

  33. まとめ • クックパッドアプリはまだマルチモジュール化の最初の一歩 を踏み出した段階 ◦ 最初の一歩は大きく踏み出したほうが楽しい • ビルド時間は本当に高速化したので良かった • これからもどんどんモジュール切り出し&ビルド高速化して

    いくぞ!