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
6.1k
クックパッド Android アプリのマルチモジュール化とデモアプリの活用
nein37
1
6.6k
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.4k
Androidアプリのデザイン整理への取り組み
nein37
1
960
Androidアプリのタブレット向けレイアウト
nein37
4
1.1k
Other Decks in Programming
See All in Programming
2024/11/8 関西Kaggler会 2024 #3 / Kaggle Kernel で Gemma 2 × vLLM を動かす。
kohecchi
4
780
Content Security Policy入門 セキュリティ設定と 違反レポートのはじめ方 / Introduction to Content Security Policy Getting Started with Security Configuration and Violation Reporting
uskey512
1
490
광고 소재 심사 과정에 AI를 도입하여 광고 서비스 생산성 향상시키기
kakao
PRO
0
170
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
110
Webの技術スタックで マルチプラットフォームアプリ開発を可能にするElixirDesktopの紹介
thehaigo
2
1k
Contemporary Test Cases
maaretp
0
110
CSC509 Lecture 09
javiergs
PRO
0
140
Realtime API 入門
riofujimon
0
140
CSC509 Lecture 11
javiergs
PRO
0
180
Tauriでネイティブアプリを作りたい
tsucchinoko
0
360
Importmapを使ったJavaScriptの 読み込みとブラウザアドオンの影響
swamp09
4
1.3k
タクシーアプリ『GO』のリアルタイムデータ分析基盤における機械学習サービスの活用
mot_techtalk
4
760
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
33
2.9k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
The Power of CSS Pseudo Elements
geoffreycrofte
73
5.3k
What's new in Ruby 2.0
geeforr
343
31k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
Facilitating Awesome Meetings
lara
50
6.1k
Scaling GitHub
holman
458
140k
Into the Great Unknown - MozCon
thekraken
32
1.5k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
How to Think Like a Performance Engineer
csswizardry
20
1.1k
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 によるリリースなどもこれから • ビルド周りだけでも改善できるところはいっぱいありそう
まとめ
まとめ • クックパッドアプリはまだマルチモジュール化の最初の一歩 を踏み出した段階 ◦ 最初の一歩は大きく踏み出したほうが楽しい • ビルド時間は本当に高速化したので良かった • これからもどんどんモジュール切り出し&ビルド高速化して
いくぞ!