You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

因Hilt初始化错误导致Android应用无法启动的求助

解决Hilt构建失败(javassist.NotFoundException)及ViewModel注入问题

看起来你在Hilt集成上踩了几个常见的坑,我帮你一步步梳理解决:

1. 先补全Hilt的Gradle依赖配置

这是最容易遗漏的环节,Hilt需要在项目和模块两级的build.gradle中配置完整依赖:

项目根目录的build.gradle

确保添加Hilt的gradle插件classpath:

buildscript {
    dependencies {
        // 注意:这里的版本要和你的Android Gradle Plugin(AGP)版本兼容,比如AGP 7.4+对应Hilt 2.44+
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.44'
    }
}

app模块的build.gradle

添加Hilt核心依赖、注解处理器,以及ViewModel集成依赖:

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    // 别忘了加这个Hilt插件
    id 'dagger.hilt.android.plugin'
}

dependencies {
    // Hilt核心库
    implementation 'com.google.dagger:hilt-android:2.44'
    // Hilt注解处理器
    kapt 'com.google.dagger:hilt-android-compiler:2.44'
    // ViewModel和Hilt的集成库
    implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'
    kapt 'androidx.hilt:hilt-compiler:1.0.0'
}

// 开启kapt的错误类型修正,避免一些编译问题
kapt {
    correctErrorTypes true
}

2. 替换过时的ApplicationComponent为SingletonComponent

你在AppModule里用的ApplicationComponent是Hilt旧版本的API,现在已经被SingletonComponent替代了,赶紧换掉:

private const val BASE_URL = "http://google.es"
@Module
@InstallIn(SingletonComponent::class) // 把ApplicationComponent改成这个
object AppModule {
    @Singleton
    @Provides
    fun provideRetrofit(gson: Gson): Retrofit = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build()
    @Provides
    fun provideGson(): Gson = GsonBuilder().create()
    @Provides
    fun provideSearchDataSource(retrofit: Retrofit): SearchDataSource = retrofit.create(SearchDataSource::class.java)
    @Singleton
    @Provides
    fun provideSearchRepository(searchDataSource: SearchDataSource) = SearchRepositoryImpl(searchDataSource)
    
    // 把这行删掉!ViewModel不能这么提供,下面说正确方式
    // @Provides
    // fun provideSearchViewModel(repository: SearchRepository) = SearchViewModel(repository)
}

3. 修正ViewModel的Hilt注入方式

你现在在Module里用@Provides提供ViewModel是错误的,Hilt要求ViewModel类本身标记@HiltViewModel,并且构造函数用@Inject注解:

修改你的SearchViewModel:

@HiltViewModel // 必须加这个注解
class SearchViewModel @Inject constructor(
    private val repository: SearchRepository // 构造函数用@Inject让Hilt自动注入依赖
) : ViewModel() {
    // 你的getSongs()方法逻辑保持不变
    fun getSongs(): LiveData<List<Song>> {
        // ... 你的实现
    }
}

然后Fragment里的ViewModel获取代码不用改,Hilt会自动处理注入:

@AndroidEntryPoint
class SearchFragment : Fragment() {
    private lateinit var binding: FragmentSearchBinding
    // 这里的viewModels()会自动通过Hilt获取实例
    private val searchViewModel: SearchViewModel by viewModels()
    // ... 其他代码
}

4. 清理重建项目

做完以上修改后,一定要执行:

  • Build -> Clean Project
  • Build -> Rebuild Project
  • 必要时重启Android Studio(缓存问题有时候会搞事情)

关于javassist.NotFoundException的原因

这个错误基本都是Hilt的注解处理器没正常工作导致的,可能是依赖缺了、版本不兼容,或者用了过时的API(比如你之前的ApplicationComponent)让处理器找不到对应的类。补全依赖+替换新API后,这个问题应该就解决了。

如果还是有问题,可以再检查:

  • 确认SearchSpotifyApp在Manifest里正确注册了(你已经做好了)
  • 所有需要被Hilt注入的类,构造函数都加了@Inject
  • 确保kapt配置正确(模块级build.gradle里的kapt块)

内容的提问来源于stack exchange,提问作者binkypv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 13:18:01