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
11k
クックパッドアプリのマルチモジュール化への取り組み
2018-08-21 Cookpad.apk #1
Chihiro Koyama
こやまカニ大好き
August 21, 2018
Tweet
Share
More Decks by こやまカニ大好き
See All by こやまカニ大好き
Androidアプリの One Experience リリース
nein37
0
5.3k
マルチモジュールアプリの画面遷移処理実装
nein37
0
6.5k
クックパッド Android アプリのマルチモジュール化とデモアプリの活用
nein37
1
6.9k
2020年代の WebView 実装 / saikou_no_webview_2021
nein37
2
11k
Androidアプリをいつまでも楽しく開発し続けるための取り組み
nein37
5
2.6k
minSdkVersion=21にしてから1年経った話
nein37
8
2.3k
Androidアプリエンジニアの基礎知識
nein37
16
11k
Android のセキュリティよくなってきた話
nein37
3
2.5k
Androidアプリのデザイン整理への取り組み
nein37
1
1.1k
Other Decks in Programming
See All in Programming
AIでLINEスタンプを作ってみた
eycjur
1
230
Platformに“ちょうどいい”責務ってどこ? 関心の熱さにあわせて考える、責務分担のプラクティス
estie
1
230
Navigating Dependency Injection with Metro
zacsweers
3
4.2k
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
190
アセットのコンパイルについて
ojun9
0
130
アルテニア コンサル/ITエンジニア向け 採用ピッチ資料
altenir
0
110
Kiroで始めるAI-DLC
kaonash
2
630
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
430
ぬるぬる動かせ! Riveでアニメーション実装🐾
kno3a87
1
230
testingを眺める
matumoto
1
140
Tool Catalog Agent for Bedrock AgentCore Gateway
licux
7
2.6k
今だからこそ入門する Server-Sent Events (SSE)
nearme_tech
PRO
3
260
Featured
See All Featured
Navigating Team Friction
lara
189
15k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.7k
Thoughts on Productivity
jonyablonski
70
4.8k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Statistics for Hackers
jakevdp
799
220k
Building Applications with DynamoDB
mza
96
6.6k
The Art of Programming - Codeland 2020
erikaheidi
56
13k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.7k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
How to train your dragon (web standard)
notwaldorf
96
6.2k
The Language of Interfaces
destraynor
161
25k
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 によるリリースなどもこれから • ビルド周りだけでも改善できるところはいっぱいありそう
まとめ
まとめ • クックパッドアプリはまだマルチモジュール化の最初の一歩 を踏み出した段階 ◦ 最初の一歩は大きく踏み出したほうが楽しい • ビルド時間は本当に高速化したので良かった • これからもどんどんモジュール切り出し&ビルド高速化して
いくぞ!