Jetpack Compose中Dagger Hilt依赖注入失败:无法实例化应用
问题分析:Dagger Hilt集成导致ClassNotFoundException及相关问题
当前使用Jetpack Compose + Dagger Hilt时出现以下问题:
- 无法实例化
com.lelestacia.submissioncompose.application.MyApp类,抛出ClassNotFoundException - Hilt未生成ViewModel工厂的Java代码
- App Module中的函数虽有Hilt消费标识,但仍被标记为未使用(相同配置在其他项目可正常运行)
异常信息
FATAL EXCEPTION: main Process: com.lelestacia.submissioncompose, PID: 6340 java.lang.RuntimeException: 无法实例化应用程序com.lelestacia.submissioncompose.application.MyApp(包名com.lelestacia.submissioncompose):java.lang.ClassNotFoundException: 未在路径DexPathList[[dex文件"/data/data/com.lelestacia.submissioncompose/code_cache/.overlay/base.apk/classes3.dex", zip文件"/data/app/~~UPDLbuW7-1MIDHePtZAPuw==/com.lelestacia.submissioncompose-VtqvuByd7B1W6Uwl4SYgJA==/base.apk"],nativeLibraryDirectories=[/data/app/~~UPDLbuW7-1MIDHePtZAPuw==/com.lelestacia.submissioncompose-VtqvuByd7B1W6Uwl4SYgJA==/lib/x86_64, /system/lib64, /system_ext/lib64]]上找到类"com.lelestacia.submissioncompose.application.MyApp" at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1466) at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1395) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6746) at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2134) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7898) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) Caused by: java.lang.ClassNotFoundException: 未在路径DexPathList[[dex文件"/data/data/com.lelestacia.submissioncompose/code_cache/.overlay/base.apk/classes3.dex", zip文件"/data/app/~~UPDLbuW7-1MIDHePtZAPuw==/com.lelestacia.submissioncompose-VtqvuByd7B1W6Uwl4SYgJA==/base.apk"],nativeLibraryDirectories=[/data/app/~~UPDLbuW7-1MIDHePtZAPuw==/com.lelestacia.submissioncompose-VtqvuByd7B1W6Uwl4SYgJA==/lib/x86_64, /system/lib64, /system_ext/lib64]]上找到类"com.lelestacia.submissioncompose.application.MyApp" at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:76) at androidx.core.app.CoreComponentFactory.instantiateApplication(CoreComponentFactory.java:52) at android.app.Instrumentation.newApplication(Instrumentation.java:1232) at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1458) at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1395) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6746) at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2134) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7898) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936) Suppressed: java.lang.NoClassDefFoundError: 无法解析类Lcom/lelestacia/submissioncompose/application/Hilt_MyApp; at java.lang.VMClassLoader.findLoadedClass(Native Method) at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:738) at java.lang.ClassLoader.loadClass(ClassLoader.java:363) ... 16 more Caused by: java.lang.ClassNotFoundException: 未在路径DexPathList[[dex文件"/data/data/com.lelestacia.submissioncompose/code_cache/.overlay/base.apk/classes3.dex", zip文件"/data/app/~~UPDLbuW7-1MIDHePtZAPuw==/com.lelestacia.submissioncompose-VtqvuByd7B1W6Uwl4SYgJA==/base.apk"],nativeLibraryDirectories=[/data/app/~~UPDLbuW7-1MIDHePtZAPuw==/com.lelestacia.submissioncompose-VtqvuByd7B1W6Uwl4SYgJA==/lib/x86_64, /system/lib64, /system_ext/lib64]]上找到类"com.lelestacia.submissioncompose.application.Hilt_MyApp" at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) ... 19 more
排查与解决方案
从异常中的Hilt_MyApp未找到可以看出,核心问题是Hilt的注解处理器没有生成必要的代码,或者生成的代码未被正确打包进APK。以下是针对性的排查步骤:
1. 检查Hilt依赖配置是否完整
确保build.gradle(项目级和模块级)的依赖和插件配置正确:
- 项目级build.gradle:
plugins { id 'com.android.application' version 'x.x.x' apply false id 'org.jetbrains.kotlin.android' version 'x.x.x' apply false id 'com.google.dagger.hilt.android' version '2.x.x' apply false } - 模块级build.gradle:
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } } dependencies { implementation "com.google.dagger:hilt-android:2.x.x" kapt "com.google.dagger:hilt-android-compiler:2.x.x" // ViewModel相关依赖 implementation "androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03" kapt "androidx.hilt:hilt-compiler:1.0.0" } kapt { correctErrorTypes = true }
2. 确认MyApp类的注解配置
MyApp类必须正确添加@HiltAndroidApp注解,且继承Application:
@HiltAndroidApp class MyApp : Application() { // ... }
同时检查AndroidManifest.xml中是否正确声明了这个Application类:
<application android:name=".application.MyApp" <!-- 其他配置 --> >
3. 清理并重新构建项目
Hilt的注解处理器生成的代码可能因缓存问题未更新,执行以下操作:
- 点击Android Studio的
Build->Clean Project - 然后点击
Build->Rebuild Project - 或直接删除项目根目录下的
.gradle、build文件夹,重新同步项目
4. 检查Dex配置
如果开启了MultiDex,确保MyApp类被包含在主Dex中:
- 添加MultiDex依赖:
implementation "androidx.multidex:multidex:2.0.1" - 让
MyApp继承MultiDexApplication,或在attachBaseContext中调用MultiDex.install(this):@HiltAndroidApp class MyApp : MultiDexApplication() { // ... }
5. 检查ViewModel的Hilt注解使用
确保ViewModel使用@HiltViewModel注解,且在Compose中通过hiltViewModel()获取:
@HiltViewModel class MyViewModel @Inject constructor( private val repo: MyRepository ) : ViewModel() { // ... }
在Compose中:
@Composable fun MyScreen(viewModel: MyViewModel = hiltViewModel()) { // ... }
6. 检查Module的注解与使用
确保App Module的注解正确,比如@Module、@InstallIn(SingletonComponent::class),且提供的依赖被其他类通过@Inject消费:
@Module @InstallIn(SingletonComponent::class) object AppModule { @Provides fun provideMyRepository(): MyRepository { return MyRepositoryImpl() } }
如果Module中的函数被标记为未使用,可能是没有地方通过@Inject依赖该对象,或Hilt注解处理器未识别到消费点,可尝试重新构建后查看是否消失。
内容的提问来源于stack exchange,提问作者lelestacia
相关产品推荐
相关产品推荐

