第1章 Hilt项目初始化与依赖配置

在BLE(蓝牙低功耗)应用开发中,多个模块(扫描、连接、服务发现、通知)共享同一个BluetoothGatt实例,手动管理生命周期极易导致内存泄漏或状态错乱。本章使用Hilt(官方DI框架)替代手动依赖传递,通过编译期注入来统一管理BLE对象的创建与销毁。首先完成项目初始化,验证Hilt基础注入链路是否打通。

1.1 核心原理

Hilt基于Dagger的编译期注解处理,在Gradle构建时生成注入代码。它要求Application类标记@HiltAndroidApp,从而触发组件层次(SingletonComponent、ActivityComponent等)的生成。任何需要注入的Android组件(Activity、Fragment、Service、BroadcastReceiver)必须标记@AndroidEntryPoint。BLE生命周期管理通常将BluetoothAdapter、BluetoothGatt等对象作为Singleton或ActivityScoped提供。

为什么选择Hilt而非手动注入? 手动需要在每个Activity/Fragment中获取Application实例再调用DaggerComponent,侵入性强且容易遗漏。Hilt自动处理组件生命周期,减少样板代码。

1.2 实现流程

本章的完整流程分四步:

  1. 在project-level的build.gradle中添加Hilt Gradle插件依赖。
  2. 在app-level的build.gradle中应用插件并添加Hilt Android依赖。
  3. 创建自定义Application类,标记@HiltAndroidApp。
  4. 在任意Activity中验证基本注入(如注入一个简单的String对象)。
Hilt项目初始化与依赖配置流程 Project build.gradle 添加Hilt Gradle插件 App build.gradle 应用插件 + 添加依赖 Application类 @HiltAndroidApp 注入验证 @AndroidEntryPoint 全局Gradle配置必须同步一次,确保Hilt Annotation Processor可被编译器识别 常见错误:未同步导致 @HiltAndroidApp 无法解析 编译期生成 Hilt_MyApplication.java 自动注入框架代码

1.3 具体实现

1.3.1 Project build.gradle

在项目根目录的build.gradle文件的dependencies块中添加Hilt Gradle插件Classpath:

// project/build.gradle
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.google.dagger:hilt-android-gradle-plugin:2.48"
        // 注意版本需要与Hilt Android依赖保持一致
    }
}

1.3.2 App build.gradle

在app/build.gradle中应用插件并添加Hilt Android依赖:

// app/build.gradle
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'com.google.dagger.hilt.android'   // 应用Hilt插件
}

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

dependencies {
    implementation "com.google.dagger:hilt-android:2.48"
    kapt "com.google.dagger:hilt-compiler:2.48"   // 使用kapt或ksp
}
⚠️ kapt vs ksp:如果项目使用Kotlin,推荐使用ksp(需额外配置KSP插件),否则使用kapt。Hilt 2.48及以上版本兼容。若使用Java,则用annotationProcessor。

1.3.3 Application类注解

创建一个继承Application的类,并标记@HiltAndroidApp:

// MyApplication.java
import android.app.Application;
import dagger.hilt.android.HiltAndroidApp;

@HiltAndroidApp
public class MyApplication extends Application {
    // Hilt自动生成Hilt_MyApplication基类,无需重写任何方法
}

别忘了在AndroidManifest.xml中声明此Application:

<application
    android:name=".MyApplication"
    android:icon="@mipmap/ic_launcher"
    ...>

1.3.4 验证基础注入

创建一个最简单的Activity,标记@AndroidEntryPoint,并注入一个由Hilt提供的String(仅用于验证编译期能否成功生成注入代码):

// MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import dagger.hilt.android.AndroidEntryPoint;
import javax.inject.Inject;

@AndroidEntryPoint
public class MainActivity extends AppCompatActivity {

    @Inject String injectedString;   // 由Hilt提供,需要先定义Module

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d("HiltTest", "注入字符串: " + injectedString);
    }
}

定义提供String的Module:

// StringModule.java
import dagger.Module;
import dagger.Provides;
import dagger.hilt.InstallIn;
import dagger.hilt.components.SingletonComponent;

@Module
@InstallIn(SingletonComponent.class)
public class StringModule {
    @Provides
    public static String provideTestString() {
        return "Hilt注入成功!";
    }
}

1.4 调试与验证

构建项目(./gradlew build),观察编译是否通过。通过后运行App,查看Logcat输出:

D/HiltTest: 注入字符串: Hilt注入成功!

如果出现以下编译错误,请检查配置:

错误信息常见原因
@HiltAndroidApp 未找到未在Application类上添加注解,或Gradle插件未应用
@AndroidEntryPoint cannot be applied to ...目标组件未继承ComponentActivity或AppCompatActivity
cannot find symbol Hilt_MyApplication编译未完成,需重建项目;或依赖版本不匹配

1.5 性能与稳定性优化提示

  • 避免多Module重复配置:如果项目含多个Gradle Module,确保每个Module都正确应用Hilt插件,否则@Inject注解可能无法跨Module解析。
  • 使用Lint检查:Hilt提供hilt-lint规则,建议开启对未正确注解组件的检查。
  • 延迟初始化:BLE相关对象可能涉及蓝牙适配器,可考虑使用Lazy或Provider包装,避免无意义的初始化。
✅ 本章小结:通过添加Hilt Gradle插件、配置Application注解、定义Module,成功验证了基础注入。至此,Hilt的编译期代码生成管道已打通,为后续BLE生命周期管理提供了扎实的依赖注入基础设施。