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

ZOZOTOWNでの Dagger Hilt対応について/Migration to Dagger Hilt at ZOZOTOWN.

Dbab5e5a1fd54531e1119ede6b3b9e65?s=47 Ryosuke Horie
December 18, 2020

ZOZOTOWNでの Dagger Hilt対応について/Migration to Dagger Hilt at ZOZOTOWN.

# Codelab
- Using Hilt in your Android app
- https://codelabs.developers.google.com/codelabs/android-hilt/?hl=ja#0
- 日本語訳資料: https://scrapbox.io/horie1024-pub/【Codelab】Using_Hilt_in_your_Android_app_メモ

- Migrating your Dagger app to Hilt
- https://developer.android.com/codelabs/android-dagger-to-hilt#0
- 日本語訳資料: https://scrapbox.io/horie1024-pub/【Codelab】Migrating_your_Dagger_app_to_Hiltメモ

# 参考資料
- Hiltを使用した依存関係の注入 Android Developers
https://developer.android.com/training/dependency-injection/hilt-android

- Dagger Hilt (DevFest 2020 資料)
https://qiita.com/takahirom/items/46053e031041405e2a9e

- dagger.dev/hilt
https://dagger.dev/hilt/

dagger.dev/hilt/migration-guide
- Hiltへのマイグレーションガイド
- マイグレーションの進め方についての丁寧な解説
- https://dagger.dev/hilt/migration-guide

# HiltへのマイグレーションPR
- google/iosched
https://github.com/google/iosched/commit/9c20fdd52d446e5fdb03369e50fb196c31ae16e3

- chrisbanes/tivi
https://github.com/chrisbanes/tivi/pull/640

- android/sunflower
https://github.com/android/sunflower/pull/623

- android/architecture-samples
https://github.com/android/architecture-samples/pull/739

Dbab5e5a1fd54531e1119ede6b3b9e65?s=128

Ryosuke Horie

December 18, 2020
Tweet

Transcript

  1. ZOZOTOWNでの
 Dagger Hilt対応について
 2020/12/18(Fri)
 【Sansan Tech Meetup】Android開発Tipsを3社のエンジニアが語る
 株式会社ZOZOテクノロジーズ
 ZOZOTOWN部 Androidチーム

    Tech Lead
 堀江 亮介 Copyright © ZOZO Technologies, Inc.
  2. © ZOZO Technologies, Inc. 株式会社ZOZOテクノロジーズ
 ZOZOTOWN部 Androidチーム
 Tech Lead 堀江

    亮介
 • 自動化とビールが好き • @Horie1024 • 昔Androidテスト全書という本を書きました 
 2
  3. © ZOZO Technologies, Inc. https://zozo.jp/
 • 日本最大級のファッション通販サイト
 • 1,300以上のショップ、7,600以上のブランドの取り扱い(ともに2020年3 月末時点)


    • 常時83万点以上の商品アイテム数と毎日平均3,000点以上の新着 商 品を掲載
 • 即日配送サービス
 • ギフトラッピングサービス
 • ツケ払い など

  4. © ZOZO Technologies, Inc. 4 • Dagger Hiltへマイグレーションするモチベーション
 • どのようなマイグレーション作業を行ったか


    • 作業を行う中で躓いたポイント
 今日話すこと

  5. © ZOZO Technologies, Inc. 5 • DI(依存性の注入)とは何か
 • Daggerの詳細
 •

    Dagger Hiltの詳細
 今日話さないこと

  6. © ZOZO Technologies, Inc. 6 Daggerを利用する中で感じた課題
 
 
 • 学習コスト


    ◦ DI + Dagger + AndroidアプリでのDaggerの使用方法

  7. © ZOZO Technologies, Inc. 7 Daggerを利用する中で感じた課題
 
 
 • 学習コスト


    ◦ DI + Dagger + AndroidアプリでのDaggerの使用方法
 • 設計で迷う
 ◦ 自由度が高く、ベストプラクティスがわからない
 ◦ 例: Subcomponents vs. Component dependencies
 ▪ コンポーネントの構成・設計をどうするか?
 ▪ Injectのタイミングは?

  8. © ZOZO Technologies, Inc. 8 Daggerを利用する中で感じた課題
 
 
 • 学習コスト


    ◦ DI + Dagger + AndroidアプリでのDaggerの使用方法
 • 設計で迷う
 ◦ 自由度が高く、ベストプラクティスがわからない
 ◦ 例: Subcomponents vs. Component dependencies
 ▪ コンポーネントの構成・設計をどうするか?
 ▪ Injectのタイミングは?
 • ボイラープレートなコードの増加

  9. © ZOZO Technologies, Inc. 9 • 学習コスト
 ◦ DI +

    Dagger + AndroidアプリでのDaggerの使用方法
 • 設計で迷う
 ◦ 自由度が高く、ベストプラクティスがわからない
 ◦ 例: Subcomponents vs. Component dependencies
 ▪ コンポーネントの構成・設計をどうするか?
 ▪ Injectのタイミングは?
 • ボイラープレートなコードの増加
 Daggerを利用する中で感じた課題
 
 
 Dagger Hiltなら課題を改善できるか?
  10. © ZOZO Technologies, Inc. Dagger Hiltとは?
 10

  11. © ZOZO Technologies, Inc. 11 “Hiltは、プロジェクト内のすべてのAndroidクラスにコンテナを提供し、そのラ イフサイクルを自動で管理することで、アプリケーションでDIを行うための標 準的な方法を提供します。Hiltは、よく知られた DIライブラリであるDaggerの 上に構築されているため、コンパイル時の正確性、実行時のパフォーマン

    ス、スケーラビリティ、Android StudioのサポートといったDaggerの恩恵を受 けられます。”
 Dagger Hiltとは?
 引用: Hilt を使用した依存関係の注入 Android Developers https://developer.android.com/training/dependency-injection/hilt-android
  12. © ZOZO Technologies, Inc. 12 • Dagger上に構築されたDIライブラリ
 • Android開発に特化
 •

    Androidアプリ開発におけるDIを標準化
 Dagger Hiltとは?

  13. © ZOZO Technologies, Inc. • 制約と一貫性
 ◦ Hiltの制約に従うことで一貫性が生まれる
 ◦ 考慮すべき点が減り設計に迷わない


    13 HiltによるAndroidアプリ開発におけるDIの標準化

  14. © ZOZO Technologies, Inc. • 制約と一貫性
 ◦ Hiltの制約に従うことで一貫性が生まれる
 ◦ 考慮すべき点が減り設計に迷わない


    • 学習すべき内容が整理され絞られる
 ◦ DI + Dagger + HiltでのAndroidクラスへのDI方法
 ◦ 結果的に学習コストが減少
 14 HiltによるAndroidアプリ開発におけるDIの標準化

  15. © ZOZO Technologies, Inc. • 制約と一貫性
 ◦ Hiltの制約に従うことで一貫性が生まれる
 ◦ 考慮すべき点が減り設計に迷わない


    • 学習すべき内容が整理され絞られる
 ◦ DI + Dagger + HiltでのAndroidクラスへのDI方法
 ◦ 結果的に学習コストが減少
 • AndroidフレームワーククラスへのDI方法の標準化
 ◦ ボイラープレートなコードが減少
 15 HiltによるAndroidアプリ開発におけるDIの標準化

  16. © ZOZO Technologies, Inc. • Daggerの利用で感じていた課題の改善を期待
 16 Dagger Hiltへのマイグレーションのモチベーション


  17. © ZOZO Technologies, Inc. • Daggerの利用で感じていた課題の改善を期待
 ◦ 学習コストの削減
 ◦ 設計の迷いをなくし機能の開発に集中


    ◦ ボイラープレートなコードの削減
 17 Dagger Hiltへのマイグレーションのモチベーション

  18. © ZOZO Technologies, Inc. • Daggerの利用で感じていた課題の改善を期待
 ◦ 学習コストの削減
 ◦ 設計の迷いをなくし機能の開発に集中


    ◦ ボイラープレートなコードの削減
 • それによるチームの生産性向上
 ◦ 素早いリリースと価値検証の実現
 18 Dagger Hiltへのマイグレーションのモチベーション

  19. © ZOZO Technologies, Inc. マイグレーションの流れ
 19

  20. © ZOZO Technologies, Inc. • 次の2段階でマイグレーションを進めた
 ◦ Dagger Hiltについての学習
 ◦

    マイグレーションの実施
 20 マイグレーションの流れ

  21. © ZOZO Technologies, Inc. • Dagger Hiltについての学習
 • マイグレーションの実施
 21

    マイグレーションの流れ

  22. © ZOZO Technologies, Inc. • Dagger Hiltについての学習
 • マイグレーションの実施
 22

    マイグレーションの流れ

  23. © ZOZO Technologies, Inc. • Dagger Hiltについての理解を深める
 • マイグレーションの方法について学ぶ
 •

    具体的に行った内容
 ◦ Codelabの実施
 ◦ 各種資料の確認
 ◦ OSSのHiltマイグレーションのPull Requestを確認
 23 Dagger Hiltについての学習

  24. © ZOZO Technologies, Inc. • Codelab会でDagger HiltのCodelabをチーム全員で実施
 24 Dagger Hiltについての学習:

    Codelabの実施

  25. © ZOZO Technologies, Inc. • Using Hilt in your Android

    app
 ◦ AndroidアプリでのDagger Hiltの基本的な使い方
 ◦ https://codelabs.developers.google.com/codelabs/android-hilt/?hl=ja#0
 ◦ 日本語訳した資料
 ◦ https://scrapbox.io/horie1024-pub/【Codelab】Using_Hilt_in_your_Android_app_メモ
 • Migrating your Dagger app to Hilt
 ◦ Daggerを使用するアプリをステップバイステップでHiltへマイグレーションする方法を学ぶ
 ◦ https://developer.android.com/codelabs/android-dagger-to-hilt#0
 ◦ 日本語訳した資料
 ◦ https://scrapbox.io/horie1024-pub/【Codelab】Migrating_your_Dagger_app_to_Hiltメモ
 
 25 Dagger Hiltについての学習: Codelabの実施

  26. © ZOZO Technologies, Inc. 26 • Hiltを使用した依存関係の注入 Android Developers
 ◦

    まずDagger Hiltの概要を掴むのに最適
 ◦ https://developer.android.com/training/dependency-injection/hilt-android
 • Dagger Hilt (DevFest 2020 資料)
 ◦ DIの概要からHiltの実践tipsまでまとまった非常に参考になる資料
 ◦ https://qiita.com/takahirom/items/46053e031041405e2a9e
 • dagger.dev/hilt
 ◦ より詳細なHiltのドキュメント
 ◦ https://dagger.dev/hilt/
 Dagger Hiltについての学習: 各種資料の確認

  27. © ZOZO Technologies, Inc. 27 • dagger.dev/hilt/migration-guide
 ◦ Hiltへのマイグレーションガイド
 ◦

    マイグレーションの進め方についての丁寧な解説
 ◦ https://dagger.dev/hilt/migration-guide
 
 Dagger Hiltについての学習: 各種資料の確認

  28. © ZOZO Technologies, Inc. 28 • google/iosched
 ◦ PRではなくcommit。dagger.androidからのマイグレーション
 ◦

    https://github.com/google/iosched/commit/9c20fdd52d446e5fdb03369e50fb196c31ae16e3
 • chrisbanes/tivi
 ◦ https://github.com/chrisbanes/tivi/pull/640
 • android/sunflower
 ◦ https://github.com/android/sunflower/pull/623
 • android/architecture-samples
 ◦ https://github.com/android/architecture-samples/pull/739
 
 Dagger Hiltについての学習: マイグレーションPRの確認

  29. © ZOZO Technologies, Inc. • マイグレーションについてはこの2つを押さえる
 ◦ Codelab: Migrating your

    Dagger app to Hilt
 ◦ dagger.dev/hilt/migration-guide
 • マイグレーションの概要を把握後は?
 ◦ 実際にマイグレーションを実施
 29 Dagger Hiltについての学習

  30. © ZOZO Technologies, Inc. • Dagger Hiltについての学習
 • マイグレーションの実施
 30

    マイグレーションの流れ
 
 

  31. © ZOZO Technologies, Inc. • Dagger Hiltについての学習
 • マイグレーションの実施
 31

    マイグレーションの流れ
 
 

  32. © ZOZO Technologies, Inc. • 具体的に何をするのか?
 ◦ Migrating to Hiltの「Migration

    Overview」に書かれている
 32 マイグレーションの実施
 引用: Migrating to Hilt Migration Overview https://dagger.dev/hilt/migration-guide#migration-overview
  33. © ZOZO Technologies, Inc. • ZOZOTOWNのマイグレーションに必要な作業
 ◦ すべての@Component/@Subcomponentの削除
 ◦ すべての@Moduleクラスに@InstallInアノテーションを付ける


    ◦ Activity/FragmentといったAndroidフレームワークのクラスに @AndroidEntryPointアノテーションを付ける
 33 マイグレーションの実施

  34. © ZOZO Technologies, Inc. • ZOZOTOWNのマイグレーションに必要な作業
 ◦ すべての@Component/@Subcomponentの削除
 ◦ すべての@Moduleクラスに@InstallInアノテーションを付ける


    ◦ Activity/FragmentといったAndroidフレームワークのクラスに @AndroidEntryPointアノテーションを付ける
 34 マイグレーションの実施

  35. © ZOZO Technologies, Inc. • 既存のコンポーネントを対応するHiltコンポーネントにマッピング
 ◦ マッピングしたHiltコンポーネントを@Moduleクラスの
 @InstallInアノテーションで指定
 •

    Componentから依存を取得するコードの確認と置換え
 • コンポーネント引数の確認と置換え
 35 すべての@Component/@Subcomponentの削除

  36. © ZOZO Technologies, Inc. • ZOZOTOWN AndroidはComponent dependenciesで構成
 • Activity/Fragment/Gradle

    Module毎にComponentを用意
 36 コンポーネント構成の確認
 App Component Core Component Feature Component Feature Component Feature Component
  37. © ZOZO Technologies, Inc. • Androidクラスに対して自動で生成されるコンポーネント
 37 Hiltコンポーネント
 引用: https://dagger.dev/hilt/components

  38. © ZOZO Technologies, Inc. 対応するHiltコンポーネントへのマッピング
 • App/Core Component → SingletonComponent


    • Feature Component →
 ActivityComponent または FragmentComponent
 
 38 App Component Core Component Feature Component Feature Component Feature Component
  39. © ZOZO Technologies, Inc. • MainActivityの場合
 ◦ 既存のComponentをActivityComponentへマッピング
 ◦ @InstallInアノテーションにマッピングしたComponentを指定


    ◦ MainActivity内でバインディングが使用可能
 39 @Module @InstallIn(ActivityComponent::class) object MainModule {} @Moduleクラスの@InstallInアノテーションで指定

  40. © ZOZO Technologies, Inc. • Hiltではモノリシックなコンポーネントとなる
 ◦ 例: すべてのActivityで1つのコンポーネント共有
 •

    @InstallInアノテーションの付与で競合が発生する可能性がある
 • 競合が発生した場合単一の定義になるようバインディングを再定義
 40 duplicate bindingエラー

  41. © ZOZO Technologies, Inc. • Componentからの依存の取得はEntryPointで置換え
 41 val database =

    MyApp.getDaggerAppComponent().appDatabase() // EntryPointでの置換え @InstallIn(SingletonComponent::class) @EntryPoint interface AppDatabaseEntryPoint { fun appDatabase(): AppDatabase } val database = EntryPointAccessors .fromApplication(context, AppDatabaseEntryPoint.class).appDatabase() Componentから依存を取得するコードの確認と置換え

  42. © ZOZO Technologies, Inc. • Hiltコンポーネントの初期化は隠蔽され引数をとることができない
 • ZOZOTOWNの場合ViewModelのバインディングを作成するために Activity/FragmentをComponent引数で@BindInstanceしている
 42

    Component引数の確認と置換え
 @Module object MainModule { @ScreenScope @Provides fun provideMainViewModel( activity: MainActivity, factory: MainViewModelFactory ): MainViewModel = ViewModelProvider(activity.viewModelStore, factory) .get(MainViewModel::class.java) }
  43. © ZOZO Technologies, Inc. • ViewModelは by viewModels での作成に変更
 •

    ZOZOTOWNではViewModelFactoryを明示的に渡している ◦ ViewModelはFragmentComponentにバインドされる • @ViewModelInjectをViewModelに付与すればFactoryが不要になるが使 用しない
 43 Component引数の確認と置換え
 @Inject lateinit var viewModelFactory: MainViewModelFactory private val viewModel: MainViewModel by viewModels { viewModelFactory }
  44. © ZOZO Technologies, Inc. • @ViewModelInjectを使用するとActivityRetainedComponentに ViewModelがバインドされる
 • ZOZOTOWNの実装ではViewModelがFragmentComponentにバインドされ た依存を使用する。そのためHiltコンポーネントの階層の制約に違反して

    しまう
 44 @ViewModelInjectを使用しない理由

  45. © ZOZO Technologies, Inc. 45 @ViewModelInjectを使用しない理由
 引用: Hilt Components https://dagger.dev/hilt/components.html

    上層から下層へのアクセス不可
  46. © ZOZO Technologies, Inc. • 既存のコンポーネントを対応するHiltコンポーネントにマッピング
 ◦ マッピングしたHiltコンポーネントを@Moduleクラスの
 @InstallInアノテーションで指定
 •

    Componentから依存を取得するコードの確認と置換え
 • コンポーネント引数の確認と置換え
 • ここまでの作業終えると@Component/@Subcomponentが削除可能になる
 46 すべての@Component/@Subcomponentの削除

  47. © ZOZO Technologies, Inc. • ZOZOTOWNのマイグレーションに必要な作業
 ◦ すべての@Component/@Subcomponentの削除
 ◦ すべての@Moduleクラスに@InstallInアノテーションを付ける


    ◦ Activity/FragmentといったAndroidフレームワークのクラスに @AndroidEntryPointアノテーションを付ける
 47 マイグレーションの実施

  48. © ZOZO Technologies, Inc. • ZOZOTOWNのマイグレーションに必要な作業
 ◦ すべての@Component/@Subcomponentの削除
 ◦ すべての@Moduleクラスに@InstallInアノテーションを付ける


    ◦ Activity/FragmentといったAndroidフレームワークのクラスに @AndroidEntryPointアノテーションを付ける
 48 マイグレーションの実施

  49. © ZOZO Technologies, Inc. • Applicationクラスに@HiltAndroidAppを付与
 ◦ Hiltのコード生成がトリガーされる
 • Activity/Fragment/View/Service/BroadcastReceiverへ


    @AndroidEntryPointを付与
 ◦ 付与されたクラスはHiltの管理下に入りDIが実行される
 ◦ ZOZOTOWNでは既にDaggerの管理下に入っていたクラスのみ
 付与した
 49 Androidクラスへの@AndroidEntryPointアノテーションの付与

  50. © ZOZO Technologies, Inc. 50 @HiltAndroidApp class App : Application()

    @AndroidEntryPoint class MainActivity : AppCompatActivity() { @Inject lateinit var foo: Foo . . } class Foo @Inject constructor() { fun say() = "Hello" } これだけでFooクラスの インスタンスが注入される
  51. © ZOZO Technologies, Inc. • 具体的に何をするのか?
 ◦ すべての@Component/@Subcomponentの削除
 ◦ すべての@Moduleクラスに@InstallInアノテーションを付ける


    ◦ Activity/FragmentといったAndroidフレームワークのクラスに @AndroidEntryPointアノテーションを付ける
 • ここまでの作業をすべて終えるとマイグレーションが完了
 ◦ エラーがでた場合でもHiltのエラーログが見やすいので解決は比較的し やすい
 51 マイグレーションの実施

  52. © ZOZO Technologies, Inc. まとめ
 52

  53. © ZOZO Technologies, Inc. 53 • ボイラープレートなコードが消え見通しが良くなった
 • Codelabや資料が充実しているのでマイグレーションに取組やすい
 •

    マイグレーションの難易度はプロジェクトによる
 ◦ ZOZOTOWNの場合マイグレーション作業はマイグレーションガイド通り の物が多かった
 まとめ

  54. None