Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
クックパッドアプリのマルチモジュール化への取り組み
Search
こやまカニ大好き
August 21, 2018
Programming
11
10k
クックパッドアプリのマルチモジュール化への取り組み
2018-08-21 Cookpad.apk #1
Chihiro Koyama
こやまカニ大好き
August 21, 2018
Tweet
Share
More Decks by こやまカニ大好き
See All by こやまカニ大好き
マルチモジュールアプリの画面遷移処理実装
nein37
0
5.9k
クックパッド Android アプリのマルチモジュール化とデモアプリの活用
nein37
1
6.5k
2020年代の WebView 実装 / saikou_no_webview_2021
nein37
2
11k
Androidアプリをいつまでも楽しく開発し続けるための取り組み
nein37
5
2.4k
minSdkVersion=21にしてから1年経った話
nein37
8
2.2k
Androidアプリエンジニアの基礎知識
nein37
16
11k
Android のセキュリティよくなってきた話
nein37
3
2.3k
Androidアプリのデザイン整理への取り組み
nein37
1
920
Androidアプリのタブレット向けレイアウト
nein37
4
1.1k
Other Decks in Programming
See All in Programming
The rollercoaster of releasing an Android, iOS, and macOS app with Kotlin Multiplatform | droidcon Berlin
prof18
0
110
CSC307 Lecture 10
javiergs
PRO
0
310
ぼっちを避けて楽しむためのアノテコノテ / Various Tips and Tricks to Avoid Loneliness and Have Fun
nrslib
3
1.7k
君たちはどうコードをレビューする (される) か / 大吉祥寺.pm
utgwkk
15
8.5k
生成AIをkintoneに連携してみた
hideg
0
230
Xcode 16のPreviewModifierと@Previewableを活用した効率的なプレビュー方法の考察
ojun9
2
160
Prompt FlowによるLLMアプリケーション開発
yuto2000
1
1k
Rust.Nagoya #1
codemountains
0
170
【Go言語】ジェネリクス
tomo1227
0
170
DDDを志して3年経ったら「DDDの皮を被ったクリーンアーキテクチャ」になった話【デブサミ2024夏】
texmeijin
1
620
Jetpack for KMP
fornewid
1
290
さきがけから振り返るアーキテクチャ刷新 / Reflecting on the Architectural Renewal from the Vanguard
nrslib
2
770
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
18
1.2k
Thoughts on Productivity
jonyablonski
64
4.1k
Designing Experiences People Love
moore
136
23k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
129
32k
Adopting Sorbet at Scale
ufuk
71
8.8k
Become a Pro
speakerdeck
PRO
15
4.8k
Designing the Hi-DPI Web
ddemaree
276
34k
Web development in the modern age
philhawksworth
203
10k
Building Adaptive Systems
keathley
34
2k
Ruby is Unlike a Banana
tanoku
96
10k
Design by the Numbers
sachag
277
18k
Imperfection Machines: The Place of Print at Facebook
scottboms
262
13k
Transcript
クックパッドアプリの マルチモジュール化への取り組み こやまカニ大好き
自己紹介 こやまカニ大好き(@nein37) • 技術部 モバイル基盤G • Android テックリード • クックパッドアプリの技術選定
• 社内の全Androidプロジェクトの技術的なサポート
今日話す内容 • マルチモジュール化とは • なぜマルチモジュール化するのか • クックパッドアプリにおけるマルチモジュール化 • 現在のクックパッドアプリの状況
マルチモジュール化とは
こういうやつ :app :feature_1 :feature_2 :feature_3
クックパッドアプリでいうと… :app :検索 :編集 :料理きろく ※実際のモジュール構成とは異なります
なぜマルチモジュール化するのか
時代の流れ • 新機能の開発にモジュール化が必須/推奨されている ◦ Instant App ◦ Dynamic Feature(Dynamic Delivery)
◦ Wear OS / Android TV / Android Things • ビルドシステムのサポートも進んでいる ◦ Android Plugin for Gradle v3 から高速化 ◦ モジュールの並行ビルドにも対応
InstantApp • Instant App では base + feature の合計サイズに 4MB
制 限が適用されるため、アプリとコードを共有するためには feature のモジュール化がほぼ必須
DynamicFeature • Dynamic Feature を実装するためには専用の設定が入っ たモジュールが必須
その他
クックパッドアプリの(旧)構成 • ファイル数およそ 2,800 • 総行数およそ 280,000 • 完全なモノリシックアプリ •
2013年から引き継がれてきた秘伝のソース • ほとんどの箇所でレイヤーアーキテクチャ未導入
クックパッドアプリのビルド遅い問題 • クリーンビルド 5〜8分 • 差分ビルド 2〜3分 • InstantRun がうまく動作していない
クックパッドアプリのビルド遅い問題 • なぜマルチモジュールでビルドが高速化するのか ◦ 変更がないモジュールの成果物をキャッシュしてくれる ◦ モジュールビルドの並列実行もできる ◦ Android Developersにもライブラリモジュール作れと書いてある
理由まとめ • モノリシックではできないことが増えていく • 自分のプロダクトで最新技術が試せないのは悔しい • ビルドがとにかく遅い遅すぎる →マルチモジュール化やっていくぞ!
クックパッドアプリにおけるマルチモジュール化
最初の一歩として考えていたこと • 新しい library モジュールを作成し、一部の機能を移す • app モジュールに library モジュールを参照させる
• これを繰り返せばマルチモジュール化できるぞ • 簡単なところからコツコツ切り出していこう!
つまりこう :app :app :feature_1 :feature_2
実際にやったこと • まずは library モジュール(※)を作成し、全ての機能を移 す • app モジュールに library
モジュールを参照させる ※ legacy モジュールと呼んでいる
つまりこう :app :legacy :app
実際に出来上がったもの • 4日間かけて巨大なPRを生成(初回は失敗) ◦ File Changed 3,820 ◦ +100,025 ◦
-99,572
なぜそんなことをしたのか • アプリモジュールが大きいままだと細かく機能を切り出すモ チベーションが生まれない • 巨大なライブラリモジュールを作ることで上層、下層両方を モジュールに切り出しやすくなると考えた ◦ legacy モジュールに依存させておけば上層のモジュールも切り出しやすく
なるのでは?
こうしていきたい :legacy :app :legacy :app :feature_1 :feature_2 :ui :common
マルチモジュール化爆発ポイント • 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 側に持ったほうが良い
成果 • 差分ビルドが爆速化 ◦ 差分ビルド時間が 3分 → 30秒 ◦ InstantRun
もまともに動作するようになった ◦ マルチモジュール化の前に行った flavor / buildType 整理の効果もある
現在の状況(マルチモジュール化からおよそ1ヶ月)
現在は ui モジュールも分割済み • 現在は ui モジュールも分割済み ◦ ui ->
library -> app という構成 ◦ アプリ全体のデザインリソースを整理しつ つ移動 ◦ 汎用 CustomView も移動 • 画面毎のデザインリソースは ui に は含めない ◦ module のビルドキャッシュが有効になる 範囲で考える :legacy :app :ui
依存定義を buildSrc + Kotlin で記述 • buildSrc ディレクトリにソースを置くと自動的にコンパイル して build.gradle
で読めるようにしてくれる • buildSrc の中身は Kotlin で書ける
依存定義を buildSrc + Kotlin で記述 • dependencies で利用するときに補完してくれる • 参考記事
legacy からの切り出しはまだまだ進行中 • InstantApp や DynamicFeature 導入はまだまだ遠い • 現在は認証・通信周りを切り出す作業中 •
各機能へのレイヤーアーキテクチャ(VIPER)導入も進行 中
ビルド周りの最適化も進行中 • まだ並列ビルドがうまく動いていない • AppBundle によるリリースなどもこれから • ビルド周りだけでも改善できるところはいっぱいありそう
まとめ
まとめ • クックパッドアプリはまだマルチモジュール化の最初の一歩 を踏み出した段階 ◦ 最初の一歩は大きく踏み出したほうが楽しい • ビルド時間は本当に高速化したので良かった • これからもどんどんモジュール切り出し&ビルド高速化して
いくぞ!