安装与配置Hilt:Gradle依赖、Application注解

说实话,搞 Android 依赖注入,第一步就是搭环境。这一步看起来没什么含量,但我在项目里踩过坑——依赖版本对不上、Kapt 忘了加、Application 没注解,结果编译死活过不去。你想想看,要是连门都进不去,后面排查 UI 开销还从何谈起?

这一章我们只做三件事:配 Gradle、写 Application 注解、验证配置。简单,但必须准。

Gradle 依赖配置

Hilt 是基于 Dagger 的官方 DI 方案。它的依赖管理相比 Dagger 更轻量,但该配的东西一样不能少。

我个人习惯,先把整个项目的 build.gradle(项目根)和 build.gradle(模块级)分开看。因为 Hilt 需要同时动这两层。

1. 项目级 build.gradle

在根 build.gradle 的 buildscript 或 plugins 块里,声明 Hilt Gradle 插件。如果你用新版 Android Gradle Plugin(AGP 7.0+),推荐用 plugins 声明式写法。

// 项目根 build.gradle
plugins {
    id 'com.google.dagger.hilt.android' version '2.51' apply false
}

嗯,注意这里。版本号必须和 Hilt 核心库保持一致。我见过有人插件用 2.44,核心库用 2.51,结果编译报错说注解处理器找不到。所以记住:插件版本 = 核心库版本。

2. 模块级 build.gradle

应用 Hilt 插件,添加依赖。这里分两块:编译期需要的 Kapt 注解处理、运行时需要的库。

// app/build.gradle
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'com.google.dagger.hilt.android'
    id 'kotlin-kapt'  // Kapt 必须,否则注解不生效
}

android {
    // ... 你的常规配置
}

dependencies {
    implementation 'com.google.dagger:hilt-android:2.51'
    kapt 'com.google.dagger:hilt-compiler:2.51'

    // 如果你用 AndroidX 的 ViewModel,推荐加这个
    implementation 'androidx.hilt:hilt-navigation-fragment:1.2.0'
}
核心依赖对照表
依赖作用生命周期
hilt-androidHilt 运行时库,提供 @Inject、@HiltAndroidApp 等注解支持implementation
hilt-compiler注解处理器,生成 DI 代码kapt
hilt-navigation-fragmentFragment 配合 Navigation 时自动注入 ViewModelimplementation

我曾经在一个遗留项目里折腾过,Kotlin 1.6 配合 Hilt 2.44 跑得好好的,升级 Kotlin 1.9 后直接翻车。原因是 Kapt 的兼容性。后来我把 Hilt 升到 2.48+ 才稳住。

Application 注解配置

依赖配完,下一步就是告诉 Hilt:“嘿,这是我的 Application,你来接管。”这一步用 @HiltAndroidApp 搞定。

import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        // 这里可以放一些初始化逻辑
    }
}

看起来就这几行,但背后发生的事情不少。@HiltAndroidApp 会触发注解处理器,自动生成一个 Hilt_MyApplication 基类。它帮你管理了 Component 的生命周期,并且为后续 Activity、Fragment 的注入搭好舞台。

我个人习惯,在 Application 的 onCreate 里先打一条日志确认注入已生效。别小看这一步——后期排查 UI 渲染开销时,能看到注入时机是否滞后。

不要忘记 AndroidManifest

配了 Application 类,就必须在 AndroidManifest.xml 里声明它。否则系统不认。

<application
    android:name=".MyApplication"
    android:icon="@mipmap/ic_launcher"
    ... >
    // 你的 Activity 声明
</application>

配置校验:我能不能开始写了?

配完这些,别急着写依赖注入代码。先验证一下环境是否真的搭好了。我的方法是三步走。

  • Sync:Gradle Sync 必须通过,不能报未解析的依赖。
  • Build:执行一次 ./gradlew clean assembleDebug。如果编译成功,且没有 Kapt 相关的 warning,说明注解处理器跑通了。
  • Run:装到模拟器上,看 Application 的 onCreate 有没有跑起来。日志输出正常,就 ok。
踩坑提醒:我曾经遇到一个情况——Gradle 编译通过,但运行时闪退。原因是我忘了在模块级加上 kotlin-kapt 插件。没有 Kapt,Hilt 就不会生成任何代码,运行时空指针。我找了一个下午才发现少了这一行。

本章知识结构

下面这张图可以帮你理清 Hilt 配置阶段的完整依赖链。它展示了每个节点之间的先后顺序和依赖关系。

Hilt 配置三要素:Gradle · Application · 校验 Hilt 三要素 Gradle 依赖配置 Application 注解 配置校验 项目级 plugins 模块级 dependencies kotlin-kapt 插件 @HiltAndroidApp AndroidManifest 声明 Component 自动生成 Sync 无报错 assembleDebug 编译通过 运行日志验证 提示:三个分支缺一不可。少了任何一个,后续 UI 渲染开销排查都无法正常进行。 确保插件版本、Kapt、Application 类三者对齐。

一个常见的坑:版本对齐

Hilt 2.44 之前和之后,Gradle 插件声明方式有细微变化。如果你还在用旧版 AGP,可能需要用 apply plugin 方式。我建议直接看官方 Release Note,别靠直觉猜版本。

我自己维护了一个小笔记,记着每个项目的 Hilt 版本、Kotlin 版本、AGP 版本。每次升级时先查这张表,能避免 90% 的兼容性问题。