2. 项目环境搭建与依赖声明:Gradle配置、Hilt插件、hiltViewModel依赖、版本兼容性
本章将搭建《Hilt与ViewModel集成实践》的完整开发环境。Hilt作为Android官方推荐的依赖注入框架,与ViewModel的集成需要在Gradle构建系统中精确配置插件、依赖项并确保版本兼容性。错误的配置将导致编译失败、运行时错误或注解处理失效,因此本章是后续所有实践章节的基础。
核心原则:所有依赖版本必须与AGP(Android Gradle Plugin)、Kotlin、Hilt、ViewModel、KSP/kapt的版本形成锁定的版本矩阵。本章使用当前稳定版本组合,你可以在实际项目中根据官方兼容性表进行调整。
2.1 整体架构流程
下图展示了Hilt与ViewModel集成的完整构建流程,从项目级构建脚本到模块级依赖声明,最终生成支持@HiltViewModel注解的编译产物。
版本锁定策略:Hilt 2.51.1 要求 AGP ≥ 8.2.0、Kotlin 1.9.24。ViewModel 2.8.4 配合 lifecycle 稳定版。如果你的项目使用更低版本AGP,请务必查阅 Hilt 官方发布说明的兼容性矩阵。
2.2 项目级 Gradle 配置
首先在 项目根目录的 build.gradle.kts(或 build.gradle)中声明 Hilt 插件和 Kotlin/KSP 插件依赖。
// 项目级 build.gradle.kts
plugins {
id("com.android.application") version "8.4.0" apply false
id("com.android.library") version "8.4.0" apply false
id("org.jetbrains.kotlin.android") version "1.9.24" apply false
// Hilt Gradle Plugin
id("com.google.dagger.hilt.android") version "2.51.1" apply false
// KSP Plugin(用于 Hilt 编译)
id("com.google.devtools.ksp") version "1.9.24-1.0.20" apply false
}
// 可选:统一仓库和Java工具链配置
allprojects {
repositories {
google()
mavenCentral()
}
}
// Java 工具链统一(推荐)
subprojects {
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
kotlinOptions {
jvmTarget = "17"
}
}
}
常见错误:Hilt 插件的 classpath 声明已过时,新版 Gradle 7.6+ 建议只使用
plugins { id(...) version ... apply false } 声明,不要在 buildscript 块中使用 classpath。如果使用旧版项目,请迁移到此方式以避免“plugin not found”错误。
2.3 模块级 build.gradle.kts:应用插件与声明依赖
在 app 模块(或应用主模块)的 build.gradle.kts 中,应用上述插件并添加所有与 Hilt、ViewModel 相关的依赖。
// app/build.gradle.kts
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
// Hilt 插件 —— 必须在 Android 插件之后
id("com.google.dagger.hilt.android")
// KSP 插件 —— 用于编译时注解处理
id("com.google.devtools.ksp")
}
android {
namespace = "com.example.hiltviewmodelsample"
compileSdk = 34
defaultConfig {
applicationId = "com.example.hiltviewmodelsample"
minSdk = 26
targetSdk = 34
versionCode = 1
versionName = "1.0"
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
// 启用 ViewBinding(可选,用于非Compose集成)
buildFeatures {
viewBinding = true
}
}
dependencies {
// ========== Hilt 核心 ==========
implementation("com.google.dagger:hilt-android:2.51.1")
// Hilt 编译处理器(使用 kapt 或 ksp 二选一)
kapt("com.google.dagger:hilt-compiler:2.51.1")
// 如果使用 KSP,则使用以下代替 kapt:
// ksp("com.google.dagger:hilt-compiler:2.51.1")
// ========== ViewModel + Hilt 集成 ==========
// 在 Compose 中使用 @HiltViewModel + hiltViewModel()
implementation("androidx.hilt:hilt-navigation-compose:1.2.0")
// ViewModel 核心(生命周期稳定版)
implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.8.4")
// Saved State Handle 支持
implementation("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.8.4")
// ========== Activity/Fragment 集成 ==========
// 用于非Compose的 @AndroidEntryPoint 支持
implementation("androidx.activity:activity-ktx:1.9.1")
implementation("androidx.fragment:fragment-ktx:1.8.2")
// ========== 测试依赖(可选)==========
testImplementation("com.google.dagger:hilt-android-testing:2.51.1")
kaptTest("com.google.dagger:hilt-compiler:2.51.1")
androidTestImplementation("com.google.dagger:hilt-android-testing:2.51.1")
kaptAndroidTest("com.google.dagger:hilt-compiler:2.51.1")
}
// 必须为 kapt 配置,否则 Hilt 注解处理失效
kapt {
correctErrorTypes = true
}
2.4 kapt vs ksp:注解处理器选择
Hilt 编译器支持 kapt 和 ksp 两种处理方式。下表对比了差异,帮助你根据项目情况选择。
| 特性 | kapt | ksp |
|---|---|---|
| 全称 | Kotlin Annotation Processing Tool | Kotlin Symbol Processing |
| 速度 | 较慢(生成 Java stubs) | 快 2~4 倍(直接处理符号) |
| 官方推荐 | 兼容旧版 Kotlin 插件(≤ 1.8.0) | Kotlin 1.9.0+ 强力推荐 |
| Hilt 支持 | 完全支持 | Hilt 2.48+ 完全支持 |
| 配置方式 | kapt("com.google.dagger:hilt-compiler:2.51.1") |
ksp("com.google.dagger:hilt-compiler:2.51.1") |
kotlin-kapt 插件 |
需要 apply kotlin-kapt |
不需要,使用 com.google.devtools.ksp 即可 |
实践建议:本课程使用 KSP,因为 KSP 在 Gradle 增量编译中性能更好,且与 Kotlin 1.9.x 原生集成。如果你维护旧项目且无法升级 Kotlin 版本,请坚持使用 kapt。无论选择哪个,切记只能使用一个处理器,同时声明 kapt 和 ksp 会触发重复类错误。
2.5 AndroidManifest.xml:声明 @HiltAndroidApp
Hilt 要求所有使用依赖注入的 Application 类被 @HiltAndroidApp 注解。确保在 AndroidManifest 中引用自定义 Application 类。
<!-- app/src/main/AndroidManifest.xml -->
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:name=".MyApplication"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.HiltViewModelSample">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
同时在 MyApplication.kt 中注入 Hilt 入口:
// app/src/main/java/com/example/hiltviewmodelsample/MyApplication.kt
package com.example.hiltviewmodelsample
import android.app.Application
import dagger.hilt.android.HiltAndroidApp
@HiltAndroidApp
class MyApplication : Application()
2.6 版本兼容性矩阵与排查指南
版本不匹配是 Hilt 集成中最常见的失败原因。下表列出了本课程基准版本组合以及降级方案。
| 组件 | 本课程版本 | 最小兼容版本 | 最大测试版本 |
|---|---|---|---|
| Android Gradle Plugin | 8.4.0 | 8.2.0 | 8.5.0 |
| Kotlin | 1.9.24 | 1.9.0 | 2.0.0 |
| Hilt | 2.51.1 | 2.48 | 2.52 |
| ViewModel | 2.8.4 | 2.7.0 | 2.8.5 |
| hilt-navigation-compose | 1.2.0 | 1.1.0 | 1.3.0 |
| KSP(Kotlin 1.9.24) | 1.9.24-1.0.20 | 1.9.24-1.0.19 | 1.9.24-1.0.20 |
常见错误:Caused by: java.lang.IllegalStateException: Hilt KSP must be configured with correct Kotlin version.
解决方案:检查
解决方案:检查
com.google.devtools.ksp 的版本号必须严格对应 Kotlin 版本。如 Kotlin 1.9.24 ⇒ KSP 1.9.24-1.0.20。版本号前缀 1.9.24 指向 Kotlin 编译器版本,后缀 1.0.20 是 KSP 自身版本。两者组合错误将导致 KSP 注解处理器无法识别 Hilt 注解。
2.7 Gradle Sync 验证与调试
配置完成后,执行以下步骤验证环境准备就绪:
- File → Sync Project with Gradle Files,确保无红色报错。
- 在 Terminal 执行
./gradlew assembleDebug,观察编译输出。# 成功标志(部分日志) > Task :app:kspDebugKotlin UP-TO-DATE > Task :app:compileDebugKotlin UP-TO-DATE > Task :app:compileDebugJavaWithJavac UP-TO-DATE > Task :app:mergeDebugAssets UP-TO-DATE ... BUILD SUCCESSFUL in 12s - 如果遇到
Unresolved reference: hilt或Cannot find symbol class HiltAndroidApp,常见原因为:- 插件未在模块级 build.gradle.kts 中 apply(缺少
id("com.google.dagger.hilt.android"))。 - kapt/ksp 处理器未声明或处理器与 Hilt 版本不匹配。
- IDE 缓存问题:执行
File → Invalidate Caches / Restart。
- 插件未在模块级 build.gradle.kts 中 apply(缺少
调试指令速查表:
./gradlew assembleDebug --stacktrace —— 查看完整异常堆栈。./gradlew :app:dependencies --configuration debugRuntimeClasspath —— 检查依赖树,确认 Hilt 和 ViewModel 版本未被其他库替换。./gradlew clean build —— 清理缓存后重建。
2.8 小结与最佳实践
完成本章配置后,你的项目已具备 Hilt + ViewModel 集成 的完整构建基础。确保以下关键点:
- 项目级插件声明:只使用
plugins { id(...) version ... apply false },避免buildscript方式。 - 模块级应用插件:三个插件
com.android.application、com.google.dagger.hilt.android、com.google.devtools.ksp必须顺序正确。 - 依赖声明:hilt-android 实现 + hilt-compiler 处理器,
hilt-navigation-compose用于 Compose 中获取 ViewModel。 - Application 类:
@HiltAndroidApp+ manifest 中 android:name 指向该类。 - 版本锁定期:固定 AGP / Kotlin / KSP 版本号,升级时逐个验证。