Upgrade to Pro — share decks privately, control downloads, hide ads and more …

cookpadTV マルチモジュール化について/Multi modularization in cookpadTV

E6d41d2d8b9dc4139ff18e46c8cc97c9?s=47 Naoya Shibahara
February 18, 2019
5.8k

cookpadTV マルチモジュール化について/Multi modularization in cookpadTV

Cookpad.apk #2

E6d41d2d8b9dc4139ff18e46c8cc97c9?s=128

Naoya Shibahara

February 18, 2019
Tweet

Transcript

  1. cookpadTV マルチモジュール化について Cookpad.apk #2 2019-02-18 1

  2. 自己紹介 柴原直也 (Twitter: @nshiba310) メディアプロダクト開発部 cookpadTV の SmartTV(FireTV/AndroidTV) 向けアプリを担当 2

  3. 話すこと • マルチモジュールとは • なぜマルチモジュール化したかったのか • cookpadTV におけるマルチモジュール化 • まとめ

    3
  4. cookpadTV 4

  5. cookpadTV - 有名人や料理家の人たちの料理LIVE配信をみながら、一緒に料理をするLIVE 配信アプリ - Android, iOS, FireTV, AndroidTV でリリースしている

    5
  6. なぜマルチモジュール化したのか 6

  7. FireTV の開発を加速させたかったから 7

  8. FireTV 8

  9. 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)
  10. 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
  11. 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
  12. Fire App Builder - Amazon 公式が配布してる FireTV 向けアプリを簡単につくれるフレームワーク - config

    ファイル(json)をいじるだけである程度カスタマイズできる - Fire App Builder 発表資料 12
  13. なぜ FireTV の開発を加速させたかったのか 13

  14. Fire App Builder を用いた開発が 辛かったから 14

  15. [当時] FireTV プロジェクトの課題 • FireTV版 の開発には Fire App Builder というフレームワークを採用していたの

    で、完全な別プロジェクト(repository も別)になっていた ◦ アプリ版と全く同じ実装を FireTV で全て再実装が必要 ◦ 例: 認証や通信 ◦ そもそも fire-app-builder が辛い 15
  16. [当時] FireTV プロジェクトの課題 • Fire App Builder が辛い ◦ framework

    側でクラッシュすることがまぁまぁあり、そのたびに framework のソースコードを読 み修正するのがつらい ◦ メンテナンスがあまりされなく将来的に不安 ▪ ライブラリのアップデートがされていない ▪ issue を見る感じあんま活発に開発はされてなさそう ◦ config いじるだけである程度カスタマイズできる仕様のため reflection 等を用いている。 そのため、プロジェクトの見通しが悪く、実装箇所も多いので機能拡張するのが大変 16
  17. 課題を解決するためにどうしたかったのか - Android版とFireTV版で共通して使えそうな部分を共通化したい - FireTV プロジェクトを Fire App Builder をやめて

    Leanback Library で作り直し たい 17
  18. 課題を解決するためにどうしたかったのか - Android版とFireTV版で共通して使えそうな部分を共通化したい - FireTV プロジェクトを Fire App Builder をやめて

    Leanback Library で作り直し たい → Multi Module 化することで解決できそう 18
  19. 過去の構成 :firetv :app 19

  20. 過去の構成 • :app ◦ モノリシックプロジェクト ◦ VIPER アーキテクチャ • :firetv

    ◦ fire-app-builder を採用 ▪ マルチモジュール 20
  21. 最初にやったこと - 共通モジュールとして common モジュールを作成 - 必要な物のみ common モジュールに移動 -

    認証 - API関連 - Preference - etc 21
  22. 最初の構成 :firetv :app 22 :common

  23. どうしてこうしたか - :app と :firetv ではUIが全く違うため、API関連と認証以外はあまり共有してもメ リットが薄かったため - repository 層も共有しようと思えば共有できたが、上記の通り

    UIが違うので無理に共有すると repository に実装が引きづられてしまってよくないのでやらなかった 23
  24. その後 - 新しく実装するものは基本的に :common にはいれない - 欲しくなったら :common に移動、という方針 -

    大きい機能の単位で共通化できるのものは別 module として新しく分離 - exoplayer - appsync 24
  25. 現在の構成 :app :smarttv :core :exoplayer :appsync 25 :androidtv :firetv

  26. 現在の構成 :app :smarttv :core :exoplayer :appsync 26 :androidtv :firetv Application

    Module Library Module
  27. :common 27

  28. :common の名前が悪い問題 - 開発を進めるにつれて common という名前があまり良くないと感じてきた - 新しく実装するときに、これは他でも使えそうだから common に入れておこう、みたいな雑な気

    持ちで新規機能を入れたい気持ちになる - なんとなく気持ち悪い 28
  29. :common -> :core - 名前を :common から :core に変更 -

    やっかいな点として module 名を変えると import が爆発する - 置換とかをうまく使って一つ一つ変えていく必要があった - AndroidStudio おまかせだとぜんぜんうまくいかなかった - また他のPRなどがマージされて conflict が発生するとなおすのがとてもつらい - 一度にガッとやる必要がある - 地味に辛い 29
  30. :smarttv 30

  31. 現在の構成 :app :smarttv :core :exoplayer :appsync 31 :androidtv :firetv

  32. :smarttv - cookpadTV は AndroidTV でもリリースしている - AndroidTV の話がでたのは repository

    統一の構想段階あたりで、FireTV版と 一緒のUIという話だった - そのため、ログとかをDIしたり、 application id を変える等のためにapplication module を分けておいて、実態は :smarttv module に実装という形にした 32
  33. まとめ - 当初の目標の FireTV の開発は加速させることができた - しかしまだ、マルチモジュール化によるビルド高速化などの効果はきちんと把握 できていない / 取り組んでいないので次はその辺もやっていきたい

    - 今後は feature 単位くらいでモジュールを分けていけると良いかな、と考えてい る - Dynamic Feature Module は検討中(まだあまり考えてない) 33