📘 @HiltAndroidApp

Hilt · Compose 整合实战

第4讲 · 核心注解 — 深入 @HiltAndroidApp 的作用、Application 改造以及 Hilt 组件初始化流程。

🔹 @HiltAndroidApp 的作用

⚡ 触发器 @HiltAndroidApp 是 Hilt 依赖注入的应用级入口注解。它标记在 Application 类上,用于:

💡 一句话:@HiltAndroidApp 是 Hilt 在 Android 世界的“总开关”,没有它,Hilt 无法工作。

🔸 Application 类改造

使用 Hilt 前,需要将自定义 Application 改造为 Hilt 感知的入口。步骤如下:

  1. 添加注解 @HiltAndroidApp 到 Application 类。
  2. 继承 Hilt 生成的基类(或保持原继承,Hilt 通过字节码修改)。
  3. 移除手动依赖初始化(如 Dagger 旧版配置),Hilt 会自动管理。

📄 改造前后对比

改造前 (传统)改造后 (Hilt)
class MyApp : Application() @HiltAndroidApp
class MyApp : Application()
手动创建 Dagger 组件:
DaggerAppComponent.create()
无需手动创建,Hilt 自动生成 Hilt_MyApp 并注入
在 onCreate() 中初始化全局单例 使用 @Singleton + @Provides 或 @Binds

✅ 标准改造代码

// MyApplication.kt
@HiltAndroidApp
class MyApplication : Application() {
    // Hilt 会自动生成 Hilt_MyApplication 基类
    // 无需覆写 onCreate 进行手动依赖初始化
}

注意:如果项目中使用了多模块,每个模块的 Application 类同样只需添加 @HiltAndroidApp,Hilt 会合并所有模块的组件。

⚙️ Hilt 组件初始化流程

从 @HiltAndroidApp 注解开始,Hilt 在编译期和运行期执行以下步骤:

@HiltAndroidApp 编译期 · APT 生成 Hilt_MyApplication 基类 Application onCreate() SingletonComponent (ApplicationComponent) ActivityComponent · FragmentComponent ServiceComponent · ViewModelComponent ... 🚀 @AndroidEntryPoint 注入依赖 Hilt 组件初始化流程 · 编译期 + 运行时

📋 初始化步骤详解

阶段行为关键产出
① 编译期APT 处理 @HiltAndroidApp生成 Hilt_MyApplication 基类 & 组件工厂
② 运行时 · 应用启动Application.onCreate() 触发 Hilt 初始化创建 SingletonComponent (ApplicationComponent)
③ 组件树构建根据 @AndroidEntryPoint 创建子组件ActivityComponent, FragmentComponent 等
④ 依赖注入Hilt 自动注入标记了 @Inject 的字段/构造全局单例、ViewModel、Retrofit 等实例就绪

🧩 组件层级速览

Hilt 根据 Android 生命周期自动管理以下组件(部分):

✅ 所有组件均由 @HiltAndroidApp 触发的根组件 SingletonComponent 提供。

📁 完整代码示例

// MyApplication.kt (使用 Hilt)
@HiltAndroidApp
class MyApplication : Application() {
    // 无需额外代码,Hilt 自动处理初始化
}

// 在 AndroidManifest.xml 中声明 (必须)
<application
    android:name=".MyApplication"
    ... />

// 任意 Activity 使用 @AndroidEntryPoint 即可注入
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    @Inject lateinit var repository: MyRepository

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // repository 已就绪
    }
}