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

Pococha Androidのマルチモジュール化の取り組み【DeNA TechCon 2023】

Pococha Androidのマルチモジュール化の取り組み【DeNA TechCon 2023】

youtube:https://youtu.be/-kBpf9hOXCo

概要:
ライブコミュニケーションアプリ Pococha は事業規模が拡大し、常に複数の施策が同時に動くようになりました。それに伴い、組織規模も大きくなり複数のチームで並行して開発することが多くなっています。

1つのアプリに対して並行して様々な機能が追加されるようになると、当然ながら他作業とのコンフリクトが多くなっていきます。また、機能の追加を行い続けると、気づけばコンポーネントが密結合している状態になりやすいです。

PocochaのAndroidチームでは、このような課題を同時に解決することを意識しながらマルチモジュール化を行ってきました。本セッションでは、具体的にどのように行ったかと、残っている課題や展望について紹介します。

◆ チャンネル登録はこちら↓
https://youtube.com/c/denatech?sub_confirmation=1

◆ Twitter
https://twitter.com/DeNAxTech

◆ DeNA Engineering
https://engineering.dena.com/

◆ DeNA Engineer Blog
https://engineering.dena.com/blog/

◆ DeNA TechCon 2023 公式サイト
https://techcon2023.dena.dev/

DeNA_Tech

March 02, 2023
Tweet

More Decks by DeNA_Tech

Other Decks in Technology

Transcript

  1. 6

  2. 特徴1 モジュールの構成 • すべてのモジュールはビルドスクリプトを持っている ◦ ビルドスクリプトに書かれているもの:モジュールの設定、依存関係 ◦ 各モジュールで同じ外部のライブラリを使う場合はバージョンの管理に気をつける 10 Androidアプリ開発におけるマルチモジュール構成

    :A :B • 同じような性質のモジュールはビルドスクリプトの一部を共有できる ◦ 共通で使う依存関係やSDKバージョンなど A/build.gradle B/build.gradle :A :B apply from: feature.gradle apply from: feature.gradle feature.gradle
  3. マルチモジュールにする利点 • 以上の特徴により、以下のような利点を得られる: 1. (適切なモジュール分割を行えば)責務の分離によるスケーラビリティ 2. Gradleの依存関係の制約によるアーキテクチャの強制 3. 差分ビルドによるビルド時間の短縮 20

    Androidアプリ開発におけるマルチモジュール構成 (再掲)組織の拡大に伴って発生するAndroidアプリ開発上 の問題 • 他作業とのコンフリクトの多発 ◦ →適切にモジュール分割されれば、featureモジュールの変更が他のfeatureモジュールに影 響を与えることは少なくなる • コンポーネント間の依存性の制御の難易度上昇 ◦ →循環参照が作れないことにより強制的に依存性が制御できる • ビルド時間の伸長 • →差分ビルドによってビルド時間の短縮が望める
  4. 問題1 外部ライブラリのバージョンが直接ビルドスク リプトに書かれている • すべてのモジュールで別々に外部ライブラリのアーティファクトやバージョンを書く ◦ すべてのモジュールに同じことを手書きすると大きな労力がかかる ◦ 手動ですべてのモジュールのライブラリバージョンアップなどはほぼ不可能 22

    PocochaのAndroidチームでのマルチモジュール化の取り組み • すべてのモジュールはビルドスクリプトを持っている ◦ ビルドスクリプトに書かれているもの:モジュールの設定、依存関係 ◦ 各モジュールで使う外部のライブラリのバージョンを揃える工夫が必要 :A :B A/build.gradle B/build.gradle (再掲)モジュールの構成
  5. Version catalogを導入 • Gradleで依存関係のバージョンを共有する方法はいくつか存在 • PocochaではVersion catalogというものを使用した • Version catalogはtoml形式でライブラリとそのバージョンの一覧を管理することができる機能

    ◦ バージョン番号とアーティファクトを別に管理可能 ▪ 複数の関連するライブラリが同じバージョン番号でリリースされている場合に便利 ◦ 複数のライブラリをまとめて使うことが可能 ▪ 関連するライブラリをまとめて依存関係に追加することができる 23 PocochaのAndroidチームでのマルチモジュール化の取り組み
  6. 問題2 Applicationクラスで共有インスタンスを管理し ている • Httpクライアントなど、アプリ全体で共通のインスタンスを共有したいことがある • 共有のインスタンスがApplicationクラスで管理されていた ◦ Applicationクラスは:appモジュールで定義する必要がある •

    →モジュール同士が循環参照できない都合上、:dataなどからApplicationクラスに直接触れるこ とができない 24 PocochaのAndroidチームでのマルチモジュール化の取り組み :app :feature:a :data :feature:b :core ❌ インスタンス生成・管理 インスタンスを使いたい
  7. DIコンテナを導入 • DI ◦ 依存性の注入パターン ◦ あるオブジェクトが依存するオブジェクトを外から受 け取るようなパターン • DIコンテナ

    ◦ インスタンスの管理、依存性注入のための仕組みの提 供などをやってくれる ◦ 他のDIコンテナが導入されていると移行の必要がある など、導入に手間がかかってしまうこともある • 手軽さと機能性を兼ね備えたDagger Hiltを採用した 25 PocochaのAndroidチームでのマルチモジュール化の取り組み :app :feature:a :data :feature:b :core HttpClientのインスタンス インスタンスを使いたい オブジェクト
  8. :dataを作成し、データアクセスの仕組みを隠蔽 27 PocochaのAndroidチームでのマルチモジュール化の取り組み :data:repository :data:api :data:preferences :data:local モジュール 内容 リファクタ

    :data:api RetrofitのService RxStreamを返却していたところ、suspend関数化 :data:preferences SharedPreference操作クラス 設定読み書きのための共通の仕組みを作成 :data:local 動画キャッシュ用の仕組み 新たに作成 :date:repository Repository 新たに作成 • :data:repositoryより上のモジュールからは直接:data:api等を触れないようにした ◦ Repositoryモジュールでデータアクセス周りの仕組みを隠蔽 :feature:a ❌ ❌ ❌
  9. 最終的に出来上がった構成 30 :app :feature:a :data:repository :feature:b :feature:c :data:api :data:preferences :data:local

    :model :core PocochaのAndroidチームでのマルチモジュール化の取り組み