Android application development 第24章:HiltによるDI導入とその注意点

🔰 Hiltとは?

**Hilt(ヒルト)**は、Google が公式に提供する Android 専用の DI(依存性注入)フレームワークです。
内部では Dagger2 をベースにしていますが、「Activityのスコープ」や「ViewModelへの注入」など、Android特有の構造に最適化されているのが特徴です。

Java で Spring Framework を使ったことがある方は、@Autowired@Component を使った DI をイメージしてもらうと近いです。


🛠 Hiltの導入ステップ(基本の流れ)

1. 依存関係を追加

build.gradle (app) に以下を追加します:

plugins {
    id 'dagger.hilt.android.plugin'
}

dependencies {
    implementation "com.google.dagger:hilt-android:2.x"
    kapt "com.google.dagger:hilt-compiler:2.x"
}

2.x には最新版のバージョンを指定します。


2. Applicationクラスにアノテーションを付ける

@HiltAndroidApp
public class MyApp extends Application {
}

これにより、アプリ全体で Hilt の DI コンテナが使えるようになります。


3. 依存を注入するクラスに @AndroidEntryPoint を付ける

@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {
    @Inject
    TaskRepository repository;
}

このアノテーションを使うことで、Hilt がこのクラスに必要な依存関係を自動的に注入します。


4. 依存性を提供するクラス(モジュール)を作成

@Module
@InstallIn(SingletonComponent.class)
public class AppModule {

    @Provides
    public static TaskRepository provideTaskRepository() {
        return new TaskRepository();
    }
}
  • @Module:依存性を提供するクラスに付ける
  • @Provides:戻り値を依存オブジェクトとして提供する

⚠ 注意点とハマりどころ

1. Hilt対象のクラスは必ず@AndroidEntryPointが必要

  • これを忘れると xxx is not annotated with @AndroidEntryPoint のようなエラーになります。

2. ViewModelへのDIにはHiltViewModelを使う

@HiltViewModel
public class MainViewModel extends ViewModel {

    private final TaskRepository repository;

    @Inject
    public MainViewModel(TaskRepository repository) {
        this.repository = repository;
    }
}

ViewModel を使う側(Activityなど):

viewModel = new ViewModelProvider(this).get(MainViewModel.class);

Hilt の DI は、ViewModel のライフサイクルも意識して設計されています。


3. カスタムクラスやライブラリの注入は要注意

  • Retrofit や Room などの外部ライブラリも DI 対象にできますが、スコープやインスタンス生成のタイミングには注意が必要です。
  • @Singleton@ActivityRetainedScoped など、スコープの選択を誤るとバグにつながりやすいです。

4. kapt(Kotlin Annotation Processing Tool)を使うことに注意

  • Javaプロジェクトでも kapt が必要になることがあり、ビルド設定が少し複雑になることがあります。

✅ まとめ

特徴内容
Androidに最適化されたDIActivity / Fragment / ViewModelに自然に注入可能
Dagger2より簡単アノテーションベースで最小限の設定
スコープに注意が必要Singleton, ActivityScoped などを意識する

mh

Related Posts

Android application development 第32章:実践ミニアプリ:シンプルなToDoリスト

Android application development 第31章:Firebase Analytics や Remote Config の活用

You Missed

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第2章:リージョンとゾーン、グローバルリソース:GCPの「物理的な場所」の考え方

  • 投稿者 mh
  • 6月 1, 2025
  • 4 views

現場で使えるChrome DevTools実践ガイド 第8章:NetworkパネルでのHTTP通信確認

  • 投稿者 mh
  • 6月 1, 2025
  • 3 views

Kubernetes Learning 第28章:Fluentd / Loki などのロギングスタック 〜Kubernetesログの集約と可視化〜

  • 投稿者 mh
  • 6月 1, 2025
  • 3 views

Android application development 第32章:実践ミニアプリ:シンプルなToDoリスト

  • 投稿者 mh
  • 6月 1, 2025
  • 3 views

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第1章:Google Cloud コンソールとGCPプロジェクト:あなたのGCPの「指令室」と「作業空間」

  • 投稿者 mh
  • 5月 31, 2025
  • 12 views

現場で使えるChrome DevTools実践ガイド 第7章:Performanceパネルでパフォーマンス分析

  • 投稿者 mh
  • 5月 31, 2025
  • 9 views