Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
cookpadTV マルチモジュール化について/Multi modularization in cookpadTV
Naoya Shibahara
February 18, 2019
1
5.8k
cookpadTV マルチモジュール化について/Multi modularization in cookpadTV
Cookpad.apk #2
Naoya Shibahara
February 18, 2019
Tweet
Share
More Decks by Naoya Shibahara
See All by Naoya Shibahara
WorkManager のすすめ / Recommendation of WorkManager
nshiba
0
190
storeLive をスーパーで 動かし続けるためにやったこと/What we did to keep storeLive running at supermarkets
nshiba
0
400
FireTVことはじめ
nshiba
2
4.5k
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
226
15k
Rebuilding a faster, lazier Slack
samanthasiow
62
7.3k
Become a Pro
speakerdeck
PRO
3
900
VelocityConf: Rendering Performance Case Studies
addyosmani
316
22k
YesSQL, Process and Tooling at Scale
rocio
157
12k
Debugging Ruby Performance
tmm1
65
10k
Making the Leap to Tech Lead
cromwellryan
113
7.4k
Code Reviewing Like a Champion
maltzj
506
37k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
316
19k
The Invisible Side of Design
smashingmag
290
48k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
21
1.4k
Testing 201, or: Great Expectations
jmmastey
21
5.5k
Transcript
cookpadTV マルチモジュール化について Cookpad.apk #2 2019-02-18 1
自己紹介 柴原直也 (Twitter: @nshiba310) メディアプロダクト開発部 cookpadTV の SmartTV(FireTV/AndroidTV) 向けアプリを担当 2
話すこと • マルチモジュールとは • なぜマルチモジュール化したかったのか • cookpadTV におけるマルチモジュール化 • まとめ
3
cookpadTV 4
cookpadTV - 有名人や料理家の人たちの料理LIVE配信をみながら、一緒に料理をするLIVE 配信アプリ - Android, iOS, FireTV, AndroidTV でリリースしている
5
なぜマルチモジュール化したのか 6
FireTV の開発を加速させたかったから 7
FireTV 8
FireTV - Amazon から発売している TV 向け端末 - Apple TVなどが類似品 -
現在は第3世代まで出ている - https://www.amazon.co.jp/gp/product/B01ETRGGYI/ - 中身の OS はほぼ Android - 第1, 2世代は Android 5.1 (Lollipop、APIレベル22) - 第3世代は Android 7.1 (Nougat、APIレベル25)
FireTV - FireTV 向けアプリを作るにはだいたい2種類ある - 公式フレームワークの Fire App Builder を使う
- https://developer.amazon.com/ja/docs/fire-app-builder/overview.html - https://github.com/amzn/fire-app-builder - Leanback Library を用いて普通に Android TV 開発 - https://developer.android.com/training/tv/ - https://github.com/googlesamples/androidtv-leanback
FireTV - FireTV 向けアプリを作るにはだいたい2種類ある - 公式フレームワークの Fire App Builder を使う
- https://developer.amazon.com/ja/docs/fire-app-builder/overview.html - https://github.com/amzn/fire-app-builder - Leanback Library を用いて普通に Android TV 開発 - https://developer.android.com/training/tv/ - https://github.com/googlesamples/androidtv-leanback
Fire App Builder - Amazon 公式が配布してる FireTV 向けアプリを簡単につくれるフレームワーク - config
ファイル(json)をいじるだけである程度カスタマイズできる - Fire App Builder 発表資料 12
なぜ FireTV の開発を加速させたかったのか 13
Fire App Builder を用いた開発が 辛かったから 14
[当時] FireTV プロジェクトの課題 • FireTV版 の開発には Fire App Builder というフレームワークを採用していたの
で、完全な別プロジェクト(repository も別)になっていた ◦ アプリ版と全く同じ実装を FireTV で全て再実装が必要 ◦ 例: 認証や通信 ◦ そもそも fire-app-builder が辛い 15
[当時] FireTV プロジェクトの課題 • Fire App Builder が辛い ◦ framework
側でクラッシュすることがまぁまぁあり、そのたびに framework のソースコードを読 み修正するのがつらい ◦ メンテナンスがあまりされなく将来的に不安 ▪ ライブラリのアップデートがされていない ▪ issue を見る感じあんま活発に開発はされてなさそう ◦ config いじるだけである程度カスタマイズできる仕様のため reflection 等を用いている。 そのため、プロジェクトの見通しが悪く、実装箇所も多いので機能拡張するのが大変 16
課題を解決するためにどうしたかったのか - Android版とFireTV版で共通して使えそうな部分を共通化したい - FireTV プロジェクトを Fire App Builder をやめて
Leanback Library で作り直し たい 17
課題を解決するためにどうしたかったのか - Android版とFireTV版で共通して使えそうな部分を共通化したい - FireTV プロジェクトを Fire App Builder をやめて
Leanback Library で作り直し たい → Multi Module 化することで解決できそう 18
過去の構成 :firetv :app 19
過去の構成 • :app ◦ モノリシックプロジェクト ◦ VIPER アーキテクチャ • :firetv
◦ fire-app-builder を採用 ▪ マルチモジュール 20
最初にやったこと - 共通モジュールとして common モジュールを作成 - 必要な物のみ common モジュールに移動 -
認証 - API関連 - Preference - etc 21
最初の構成 :firetv :app 22 :common
どうしてこうしたか - :app と :firetv ではUIが全く違うため、API関連と認証以外はあまり共有してもメ リットが薄かったため - repository 層も共有しようと思えば共有できたが、上記の通り
UIが違うので無理に共有すると repository に実装が引きづられてしまってよくないのでやらなかった 23
その後 - 新しく実装するものは基本的に :common にはいれない - 欲しくなったら :common に移動、という方針 -
大きい機能の単位で共通化できるのものは別 module として新しく分離 - exoplayer - appsync 24
現在の構成 :app :smarttv :core :exoplayer :appsync 25 :androidtv :firetv
現在の構成 :app :smarttv :core :exoplayer :appsync 26 :androidtv :firetv Application
Module Library Module
:common 27
:common の名前が悪い問題 - 開発を進めるにつれて common という名前があまり良くないと感じてきた - 新しく実装するときに、これは他でも使えそうだから common に入れておこう、みたいな雑な気
持ちで新規機能を入れたい気持ちになる - なんとなく気持ち悪い 28
:common -> :core - 名前を :common から :core に変更 -
やっかいな点として module 名を変えると import が爆発する - 置換とかをうまく使って一つ一つ変えていく必要があった - AndroidStudio おまかせだとぜんぜんうまくいかなかった - また他のPRなどがマージされて conflict が発生するとなおすのがとてもつらい - 一度にガッとやる必要がある - 地味に辛い 29
:smarttv 30
現在の構成 :app :smarttv :core :exoplayer :appsync 31 :androidtv :firetv
:smarttv - cookpadTV は AndroidTV でもリリースしている - AndroidTV の話がでたのは repository
統一の構想段階あたりで、FireTV版と 一緒のUIという話だった - そのため、ログとかをDIしたり、 application id を変える等のためにapplication module を分けておいて、実態は :smarttv module に実装という形にした 32
まとめ - 当初の目標の FireTV の開発は加速させることができた - しかしまだ、マルチモジュール化によるビルド高速化などの効果はきちんと把握 できていない / 取り組んでいないので次はその辺もやっていきたい
- 今後は feature 単位くらいでモジュールを分けていけると良いかな、と考えてい る - Dynamic Feature Module は検討中(まだあまり考えてない) 33