3. Hilt 环境搭建:从零到可跑

说实话,Hilt 学习曲线不算陡,但环境搭建这一步要是没弄对,后面排查内存泄漏压根跑不起来。我见过不少同学在 build.gradle 里写错依赖版本,结果编译就报了一堆“Dagger 符号找不到”的错误。所以咱们今天一步一步来,把环境搭扎实。

3.1 第一步:在项目级 build.gradle 添加 Hilt Gradle 插件

Hilt 是基于 Dagger 的,它需要 Gradle 插件来生成代码。打开项目根目录下的 build.gradle(Project 级别的),在 buildscript.dependencies 里加上下面这一行:

// 项目级 build.gradle (Project)
buildscript {
    dependencies {
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.48'
    }
}

为什么是 2.48?这是我目前在线上生产项目用着最稳定的版本。你可以去 (此处不跳转) 官网查最新版,但建议别追最新,容易踩坑。我以前就试过 2.50 的 RC 版,结果和 AGP 8.2 不兼容,折腾了小半天。

3.2 第二步:在模块级 build.gradle 引入 Hilt 依赖

接下来在 app 模块或你需要用 Hilt 的模块的 build.gradle 里,添加三样东西:插件、kapt 依赖、编译选项。

// app/build.gradle
plugins {
    id 'com.android.application'
    id 'kotlin-kapt'          // 或者 'kotlin' + 'kotlin-kapt'
    id 'dagger.hilt.android.plugin'
}

android {
    // ... 其他配置
}

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

注意 kotlin-kapt 插件必须在 dagger.hilt.android.plugin 之前声明,否则编译会警告顺序不对。这个顺序问题我当年踩过一次,它不会直接报错,但生成的代码会有奇怪的空指针异常。

版本对应表(我建议的搭配)

Hilt 版本AGP 版本Kotlin 版本
2.488.0~8.21.8.0~1.9.0
2.50 (谨慎使用)8.3+1.9.20+
2.44 (旧项目兼容)7.4~8.01.6.0~1.8.0

3.3 第三步:配置 Application 类,添加 @HiltAndroidApp

这是整个 Hilt 环境搭建的“核心起搏器”。如果你用的是 Kotlin,直接在你的 Application 类上加上 @HiltAndroidApp 注解:

@HiltAndroidApp
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        // 这里可以放你的初始化代码
    }
}

嗯,就这么简单?对,Hilt 会在这个注解下自动生成 Dagger 的组件。但有个坑——别忘了在 AndroidManifest.xml 里注册这个 Application,如果你忘记把 android:name=".MyApplication" 写进去,Hilt 根本不会起作用,而且编译时也不会报错。运行时你会收到一个诡异的错误:

E/AndroidRuntime: java.lang.RuntimeException: 
  Hilt Application must be annotated with @HiltAndroidApp

我当时第一次用 Hilt 时就掉进这个坑里了,找了半小时才意识到 Manifest 里写的还是 android.app.Application……

3.4 第四步:在 Activity 和 Fragment 上添加 @AndroidEntryPoint

虽然这步严格来说是“使用”阶段,但为了快速验证环境是否搭好,我强烈建议你顺手在你的 MainActivity 上加上 @AndroidEntryPoint:

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var repository: SomeRepository  // 测试用

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...
    }
}

然后创建一个简单的 SomeRepository 类,用 @Inject constructor 标记:

class SomeRepository @Inject constructor() {
    fun getData(): String = "Hello Hilt"
}

如果你能编译通过并且 run 起来不报错,恭喜你,环境搭建成功了!

小技巧:如果编译报“无法找到符号 DaggerSomeComponent”之类的错误,试试 Clean Project → Rebuild。Hilt 的代码生成偶尔会因为增量编译而遗漏,暴力重建能解决问题。

3.5 环境搭建全局流程图

下面这张图总结了整个搭建过程,我把它叫做“Hilt 启动三件套”:

Hilt 环境搭建流程 项目级 build.gradle 添加 Hilt Gradle 插件 模块级 build.gradle implementation + kapt @HiltAndroidApp Application 类添加注解 AndroidManifest.xml 注册 Application 类 编译通过 ✅ 环境就绪 ⚠️ 常见遗漏: · 忘写 kapt 插件顺序 · Mani 没改 Application 💡 验证方式: 在 Activity 使用 @Inject 看是否能正确注入

3.6 避坑指南(我踩过的坑)

  • kapt 与 Kotlin 版本冲突:Hilt 2.48 要求 Kotlin 1.8+,如果你还在用 1.6,要么升级 Kotlin,要么降 Hilt 到 2.44。我曾经在一个遗留项目上试过,Hilt 2.44 配合 Kotlin 1.6.21 完美运行。
  • 多模块项目注意:如果你有多个模块(比如 library module),每个需要 Hilt 的模块都要添加 dagger.hilt.android.plugin 和依赖。不然你会看到“@HiltViewModel 未找到”之类的错误。
  • 增量编译导致代码不生成:这个我已经说过了——Clean → Rebuild 是万能药。Hilt 用 kapt 做注解处理,有时候 Gradle 缓存会搞砸。

特别警告:不要在 Application 类里直接调用 @Inject lateinit var 注入的字段,因为 @HiltAndroidApp 生成的组件在 super.onCreate() 之后才完成初始化。如果你想在 Application 初始化时获取依赖,请使用 @EntryPoint 机制。我见过有人写 lateinit var 然后在 onCreate 第一行就访问,直接 NPE。

3.7 快速检查清单

  1. ✔️ 项目级 build.gradle 有 classpath '...hilt-android-gradle-plugin:2.48'
  2. ✔️ 模块级 build.gradle 应用了 dagger.hilt.android.plugin 和 kotlin-kapt
  3. ✔️ dependencies 里添加了 hilt-android 和 hilt-compiler
  4. ✔️ Application 类有 @HiltAndroidApp 注解,且在 AndroidManifest 中注册
  5. ✔️ 任意 Activity 添加 @AndroidEntryPoint 并尝试注入一个简单对象,编译通过

到这步,你的 Hilt 环境就已经搭好了。接下来就可以用它来做依赖注入,并开始关注内存泄漏的排查了。不过那是后面章节的事,咱们先把地基打牢。