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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
こやまカニ大好き
August 21, 2018
Programming
11k
11
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
クックパッドアプリのマルチモジュール化への取り組み
2018-08-21 Cookpad.apk #1
Chihiro Koyama
こやまカニ大好き
August 21, 2018
More Decks by こやまカニ大好き
See All by こやまカニ大好き
Androidアプリの One Experience リリース
nein37
0
5.5k
マルチモジュールアプリの画面遷移処理実装
nein37
0
6.7k
クックパッド Android アプリのマルチモジュール化とデモアプリの活用
nein37
1
7k
2020年代の WebView 実装 / saikou_no_webview_2021
nein37
2
12k
Androidアプリをいつまでも楽しく開発し続けるための取り組み
nein37
5
2.7k
minSdkVersion=21にしてから1年経った話
nein37
8
2.4k
Androidアプリエンジニアの基礎知識
nein37
16
11k
Android のセキュリティよくなってきた話
nein37
3
2.5k
Androidアプリのデザイン整理への取り組み
nein37
1
1.1k
Other Decks in Programming
See All in Programming
技術記事、 専門家としてのプログラマ、 言語化
mizchi
13
6.2k
The NotImplementedError Problem in Ruby
koic
1
840
Snowflake Summitでの新機能 CoCo / CoWork / snowflake-summit-2026-overall-what-new-coco
tatsuhiro
1
150
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.1k
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
6.9k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
400
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
790
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
210
DynamoDBには集計系のクエリがないけどなんとかしたい
musan
1
180
Performance Engineering for Everyone
elenatanasoiu
0
180
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
350
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
660
Featured
See All Featured
Done Done
chrislema
186
16k
The browser strikes back
jonoalderson
0
1.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
250
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
460
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
490
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
220
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
140
Deep Space Network (abreviated)
tonyrice
0
210
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
260
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
340
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 によるリリースなどもこれから • ビルド周りだけでも改善できるところはいっぱいありそう
まとめ
まとめ • クックパッドアプリはまだマルチモジュール化の最初の一歩 を踏み出した段階 ◦ 最初の一歩は大きく踏み出したほうが楽しい • ビルド時間は本当に高速化したので良かった • これからもどんどんモジュール切り出し&ビルド高速化して
いくぞ!