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