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 第33章:実践ミニアプリ:天気情報アプリ

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

You Missed

Kubernetes Learning 第31章:コンテナのセキュリティ対策(PodSecurityなど)~Kubernetes環境を守るために最低限知っておきたいこと~

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

現場で使えるChrome DevTools実践ガイド 第10章:Device Modeでのレスポンシブ検証

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

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第4章:課金と料金モデル、予算とアラート:GCPの「お財布」管理術

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

Kubernetes Learning 第30章:NetworkPolicyの使い方 〜Pod間通信を制御するセキュリティの要〜

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

Google Cloud Platform エンジニア向け教科書:実践から認定まで : 第3章:IAM(Identity and Access Management):GCPの「誰が」「何に」「何ができるか」を管理する門番

  • 投稿者 mh
  • 6月 2, 2025
  • 17 views

現場で使えるChrome DevTools実践ガイド 第9章:Applicationパネルとストレージの確認

  • 投稿者 mh
  • 6月 2, 2025
  • 13 views