Android 依赖注入框架详解
主流依赖注入框架对比
框架 | 维护者 | 特点 | 适用场景 |
---|---|---|---|
Dagger/Hilt | 编译时生成代码,高性能,学习曲线陡峭 | 中大型项目,需要高性能DI | |
Koin | Kotlin 社区 | 纯 Kotlin,DSL 配置,运行时依赖解析,简单易用 | 中小型项目,Kotlin 纯项目 |
Kodein | Open Source | Kotlin 友好,多平台支持,灵活的配置方式 | Kotlin 多平台项目 |
Anko | JetBrains | 已废弃,原为 Kotlin Android 扩展的一部分 | 不推荐新项目使用 |
ButterKnife | Jake Wharton | 视图绑定库(非完整DI),已废弃 | 仅视图绑定,不推荐新项目使用 |
1. Dagger/Hilt (推荐)
Dagger 核心特点
- 编译时依赖解析:在编译时生成代码,运行时无反射
- 高性能:生成的代码直接执行,无运行时开销
- 强类型:编译时检查依赖关系,提前发现问题
Hilt 对 Dagger 的增强
- 简化配置:预定义组件和作用域
- 与 Android 深度集成 :
- 自动提供
Application
、Activity
等内置组件 - 内置
@HiltViewModel
支持
- 自动提供
- 减少模板代码:自动生成部分 Dagger 模块
基本使用示例
1. 添加依赖
gradle
// build.gradle (app)
plugins {
id 'kotlin-kapt'
id 'com.google.dagger.hilt.android'
}
dependencies {
implementation "com.google.dagger:hilt-android:2.44"
kapt "com.google.dagger:hilt-compiler:2.44"
}
// 启用 Hilt 的增量处理
kapt {
correctErrorTypes true
}
2. 定义依赖项
kotlin
// 定义可注入的依赖
class AnalyticsAdapter @Inject constructor(
private val service: AnalyticsService
) { /*...*/ }
// 使用模块提供接口实现
@Module
@InstallIn(SingletonComponent::class)
abstract class AnalyticsModule {
@Binds
abstract fun bindAnalyticsService(
impl: AnalyticsServiceImpl
): AnalyticsService
}
3. 在 Android 组件中使用
kotlin
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
@Inject lateinit var analytics: AnalyticsAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
analytics.track("Activity Created")
}
}
2. Koin (轻量级替代方案)
核心特点
- 纯 Kotlin 实现:使用 Kotlin DSL 配置
- 运行时依赖解析:使用小型代理工厂和反射
- 简单易用:学习曲线平缓
- 适合中小项目:对性能要求不苛刻的场景
基本使用示例
1. 添加依赖
gradle
dependencies {
// Koin 核心
implementation "io.insert-koin:koin-android:3.4.0"
// 如需 ViewModel 支持
implementation "io.insert-koin:koin-androidx-viewmodel:3.4.0"
}
2. 配置 Koin 模块
kotlin
val appModule = module {
// 单例实例
single<AnalyticsService> { AnalyticsServiceImpl() }
// 工厂模式(每次获取新实例)
factory { AnalyticsAdapter(get()) }
// ViewModel 注入
viewModel { MainViewModel(get()) }
}
3. 启动 Koin
kotlin
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
startKoin {
androidContext(this@MyApp)
modules(appModule)
}
}
}
4. 注入依赖
kotlin
class MainActivity : AppCompatActivity() {
// 懒注入
private val analytics: AnalyticsAdapter by inject()
// 直接注入
private val viewModel: MainViewModel by viewModel()
}
3. Kodein (多平台支持)
核心特点
- Kotlin 多平台支持:可跨 Android、iOS、后端等使用
- 多种绑定方式:非常灵活的依赖配置
- 性能中等:介于 Dagger 和 Koin 之间
基本使用示例
1. 添加依赖
gradle
dependencies {
implementation "org.kodein.di:kodein-di:7.18.0"
implementation "org.kodein.di:kodein-di-framework-android-x:7.18.0"
}
2. 配置 Kodein
kotlin
val kodein = Kodein {
bind<AnalyticsService>() with singleton { AnalyticsServiceImpl() }
bind<AnalyticsAdapter>() with provider { AnalyticsAdapter(instance()) }
}
3. 在 Android 中使用
kotlin
class MainActivity : AppCompatActivity(), KodeinAware {
override val kodein by closestKodein()
private val analytics: AnalyticsAdapter by instance()
}
选择建议
- 新项目/大型项目 :优先考虑 Hilt (官方维护,性能最佳)
- 中小型 Kotlin 项目 :可以选择 Koin (简单易用)
- 多平台项目 :考虑 Kodein (跨平台支持)
- 已废弃方案:避免使用 ButterKnife、Anko 等
高级主题
作用域管理
- Hilt :预定义
@Singleton
、@ActivityScoped
等作用域 - Koin :使用
scope
定义自定义作用域 - 生命周期感知:自动清理与组件生命周期绑定的依赖
测试支持
- Hilt :提供
@UninstallModules
和@HiltAndroidTest
- Koin :使用
checkModules
验证模块,支持测试模块覆盖
性能比较
- 初始化时间:Hilt (编译时) > Kodein > Koin
- 运行时性能:Hilt > Kodein > Koin
- 内存占用:Hilt < Kodein < Koin
与架构组件集成
- ViewModel 注入:各框架都提供专门支持
- WorkManager 注入:Hilt 提供原生支持
- Compose 集成 :均可通过
@Composable
函数访问依赖
选择适合项目的 DI 框架可以显著提高代码的可维护性和可测试性,建议根据项目规模、团队熟悉度和性能需求做出选择。