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.48 | 8.0~8.2 | 1.8.0~1.9.0 |
| 2.50 (谨慎使用) | 8.3+ | 1.9.20+ |
| 2.44 (旧项目兼容) | 7.4~8.0 | 1.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 启动三件套”:
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 快速检查清单
- ✔️ 项目级 build.gradle 有
classpath '...hilt-android-gradle-plugin:2.48' - ✔️ 模块级 build.gradle 应用了
dagger.hilt.android.plugin和kotlin-kapt - ✔️ dependencies 里添加了
hilt-android和hilt-compiler - ✔️ Application 类有
@HiltAndroidApp注解,且在 AndroidManifest 中注册 - ✔️ 任意 Activity 添加
@AndroidEntryPoint并尝试注入一个简单对象,编译通过
到这步,你的 Hilt 环境就已经搭好了。接下来就可以用它来做依赖注入,并开始关注内存泄漏的排查了。不过那是后面章节的事,咱们先把地基打牢。