第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提供。
1.2 实现流程
本章的完整流程分四步:
- 在project-level的
build.gradle中添加Hilt Gradle插件依赖。 - 在app-level的
build.gradle中应用插件并添加Hilt Android依赖。 - 创建自定义
Application类,标记@HiltAndroidApp。 - 在任意
Activity中验证基本注入(如注入一个简单的String对象)。
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
}
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包装,避免无意义的初始化。