cookpadTV マルチモジュール化について/Multi modularization in cookpadTV
by
Naoya Shibahara
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
cookpadTV マルチモジュール化について Cookpad.apk #2 2019-02-18 1
Slide 2
Slide 2 text
自己紹介 柴原直也 (Twitter: @nshiba310) メディアプロダクト開発部 cookpadTV の SmartTV(FireTV/AndroidTV) 向けアプリを担当 2
Slide 3
Slide 3 text
話すこと ● マルチモジュールとは ● なぜマルチモジュール化したかったのか ● cookpadTV におけるマルチモジュール化 ● まとめ 3
Slide 4
Slide 4 text
cookpadTV 4
Slide 5
Slide 5 text
cookpadTV - 有名人や料理家の人たちの料理LIVE配信をみながら、一緒に料理をするLIVE 配信アプリ - Android, iOS, FireTV, AndroidTV でリリースしている 5
Slide 6
Slide 6 text
なぜマルチモジュール化したのか 6
Slide 7
Slide 7 text
FireTV の開発を加速させたかったから 7
Slide 8
Slide 8 text
FireTV 8
Slide 9
Slide 9 text
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)
Slide 10
Slide 10 text
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
Slide 11
Slide 11 text
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
Slide 12
Slide 12 text
Fire App Builder - Amazon 公式が配布してる FireTV 向けアプリを簡単につくれるフレームワーク - config ファイル(json)をいじるだけである程度カスタマイズできる - Fire App Builder 発表資料 12
Slide 13
Slide 13 text
なぜ FireTV の開発を加速させたかったのか 13
Slide 14
Slide 14 text
Fire App Builder を用いた開発が 辛かったから 14
Slide 15
Slide 15 text
[当時] FireTV プロジェクトの課題 ● FireTV版 の開発には Fire App Builder というフレームワークを採用していたの で、完全な別プロジェクト(repository も別)になっていた ○ アプリ版と全く同じ実装を FireTV で全て再実装が必要 ○ 例: 認証や通信 ○ そもそも fire-app-builder が辛い 15
Slide 16
Slide 16 text
[当時] FireTV プロジェクトの課題 ● Fire App Builder が辛い ○ framework 側でクラッシュすることがまぁまぁあり、そのたびに framework のソースコードを読 み修正するのがつらい ○ メンテナンスがあまりされなく将来的に不安 ■ ライブラリのアップデートがされていない ■ issue を見る感じあんま活発に開発はされてなさそう ○ config いじるだけである程度カスタマイズできる仕様のため reflection 等を用いている。 そのため、プロジェクトの見通しが悪く、実装箇所も多いので機能拡張するのが大変 16
Slide 17
Slide 17 text
課題を解決するためにどうしたかったのか - Android版とFireTV版で共通して使えそうな部分を共通化したい - FireTV プロジェクトを Fire App Builder をやめて Leanback Library で作り直し たい 17
Slide 18
Slide 18 text
課題を解決するためにどうしたかったのか - Android版とFireTV版で共通して使えそうな部分を共通化したい - FireTV プロジェクトを Fire App Builder をやめて Leanback Library で作り直し たい → Multi Module 化することで解決できそう 18
Slide 19
Slide 19 text
過去の構成 :firetv :app 19
Slide 20
Slide 20 text
過去の構成 ● :app ○ モノリシックプロジェクト ○ VIPER アーキテクチャ ● :firetv ○ fire-app-builder を採用 ■ マルチモジュール 20
Slide 21
Slide 21 text
最初にやったこと - 共通モジュールとして common モジュールを作成 - 必要な物のみ common モジュールに移動 - 認証 - API関連 - Preference - etc 21
Slide 22
Slide 22 text
最初の構成 :firetv :app 22 :common
Slide 23
Slide 23 text
どうしてこうしたか - :app と :firetv ではUIが全く違うため、API関連と認証以外はあまり共有してもメ リットが薄かったため - repository 層も共有しようと思えば共有できたが、上記の通り UIが違うので無理に共有すると repository に実装が引きづられてしまってよくないのでやらなかった 23
Slide 24
Slide 24 text
その後 - 新しく実装するものは基本的に :common にはいれない - 欲しくなったら :common に移動、という方針 - 大きい機能の単位で共通化できるのものは別 module として新しく分離 - exoplayer - appsync 24
Slide 25
Slide 25 text
現在の構成 :app :smarttv :core :exoplayer :appsync 25 :androidtv :firetv
Slide 26
Slide 26 text
現在の構成 :app :smarttv :core :exoplayer :appsync 26 :androidtv :firetv Application Module Library Module
Slide 27
Slide 27 text
:common 27
Slide 28
Slide 28 text
:common の名前が悪い問題 - 開発を進めるにつれて common という名前があまり良くないと感じてきた - 新しく実装するときに、これは他でも使えそうだから common に入れておこう、みたいな雑な気 持ちで新規機能を入れたい気持ちになる - なんとなく気持ち悪い 28
Slide 29
Slide 29 text
:common -> :core - 名前を :common から :core に変更 - やっかいな点として module 名を変えると import が爆発する - 置換とかをうまく使って一つ一つ変えていく必要があった - AndroidStudio おまかせだとぜんぜんうまくいかなかった - また他のPRなどがマージされて conflict が発生するとなおすのがとてもつらい - 一度にガッとやる必要がある - 地味に辛い 29
Slide 30
Slide 30 text
:smarttv 30
Slide 31
Slide 31 text
現在の構成 :app :smarttv :core :exoplayer :appsync 31 :androidtv :firetv
Slide 32
Slide 32 text
:smarttv - cookpadTV は AndroidTV でもリリースしている - AndroidTV の話がでたのは repository 統一の構想段階あたりで、FireTV版と 一緒のUIという話だった - そのため、ログとかをDIしたり、 application id を変える等のためにapplication module を分けておいて、実態は :smarttv module に実装という形にした 32
Slide 33
Slide 33 text
まとめ - 当初の目標の FireTV の開発は加速させることができた - しかしまだ、マルチモジュール化によるビルド高速化などの効果はきちんと把握 できていない / 取り組んでいないので次はその辺もやっていきたい - 今後は feature 単位くらいでモジュールを分けていけると良いかな、と考えてい る - Dynamic Feature Module は検討中(まだあまり考えてない) 33