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
クックパッドアプリのマルチモジュール化への取り組み
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.6k
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
TSKaigi2026-静的解析への投資がAI時代のコード品質を支える ── カスタムESLintルールの設計と運用
hayatokudou
7
1.3k
Swiftのレキシカルスコープ管理
kntkymt
0
210
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
250
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
11k
ビジネスモデルから紐解く、AI+型駆動開発
hirokiomote
2
4.8k
柔軟なPDFレイアウトエディタを支える型システム設計 — Discriminated UnionとConditional Typeの実践
minako__ph
4
1.2k
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
2.4k
AIチームを指揮するOSS「TAKT」活用術 / How to Use “TAKT,” an OSS Tool for Orchestrating AI Teams
nrslib
6
760
運用エージェントは "作る" から "育てる" へ - 記憶と自己進化の3層設計パターン / self-evolving-agents-three-layer-agent-design
gawa
12
3.3k
GitHub Copilot CLIのいいところ
htkym
2
1.2k
新規プロダクトを高速で生み出すハーネスエンジニアリング
seanchas116
18
7.6k
Stage 3 Decorators でできること / できないこと / TSKaigi 2026
susisu
1
1.4k
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
200
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Building Adaptive Systems
keathley
44
3k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
130
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Marketing to machines
jonoalderson
1
5.3k
Optimizing for Happiness
mojombo
378
71k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
570
The Mindset for Success: Future Career Progression
greggifford
PRO
0
350
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
230
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
130
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 によるリリースなどもこれから • ビルド周りだけでも改善できるところはいっぱいありそう
まとめ
まとめ • クックパッドアプリはまだマルチモジュール化の最初の一歩 を踏み出した段階 ◦ 最初の一歩は大きく踏み出したほうが楽しい • ビルド時間は本当に高速化したので良かった • これからもどんどんモジュール切り出し&ビルド高速化して
いくぞ!