Android Library模块运行UI测试时出现CreationExtras$Key类找不到错误
问题描述
我尝试在应用了com.android.library插件的:mylibrary模块中运行Android UI测试。目前所有Android UI测试都在com.android.application类型的:app模块中,且:app模块依赖于:mylibrary模块。

在Library模块中添加UI测试并运行时,出现如下错误:
Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.viewmodel.CreationExtras$Key" on path: DexPathList[[zip file "/data/app/~~IQ9A0iTcN9ysP1ynYkle2w==/com.example.ivan.test-EKcv8pjnvziFFyouy7OVag==/base.apk"],nativeLibraryDirectories=[/data/app/~~IQ9A0iTcN9ysP1ynYkle2w==/com.example.ivan.test-EKcv8pjnvziFFyouy7OVag==/lib/arm64, /data/app/~~IQ9A0iTcN9ysP1ynYkle2w==/com.example.ivan.test-EKcv8pjnvziFFyouy7OVag==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]]
无论是用@RunWith(AndroidJUnit4::class)注解的简单插桩测试,还是@HiltAndroidTest测试,都会触发这个问题。
已尝试方案
因为看起来是dex相关问题,我做了以下尝试:
- 添加构建配置:
debug { minifyEnabled false } - 在ProGuard中保留相关类:
-keep class androidx.lifecycle.** { *; } - 为模块添加特定依赖:
dependencies { implementation libs.androidx.lifecycle.viewModel } - 按照Android开发者文档的Multidex配置说明,在
multidex-config.pro文件中添加规则:-keep class androidx.lifecycle.** { *; }
完整堆栈跟踪
Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.viewmodel.CreationExtras$Key" on path: DexPathList[[zip file "/data/app/~~IQ9A0iTcN9ysP1ynYkle2w==/com.example.ivan.test-EKcv8pjnvziFFyouy7OVag==/base.apk"],nativeLibraryDirectories=[/data/app/~~IQ9A0iTcN9ysP1ynYkle2w==/com.example.ivan.test-EKcv8pjnvziFFyouy7OVag==/lib/arm64, /data/app/~~IQ9A0iTcN9ysP1ynYkle2w==/com.example.ivan.test-EKcv8pjnvziFFyouy7OVag==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) ... 23 more java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/lifecycle/viewmodel/CreationExtras$Key; at androidx.lifecycle.SavedStateHandleSupport.enableSavedStateHandles(Unknown Source:0) at androidx.activity.ComponentActivity.<init>(ComponentActivity.java:305) at androidx.fragment.app.FragmentActivity.<init>(FragmentActivity.java:108) at androidx.appcompat.app.AppCompatActivity.<init>(AppCompatActivity.java:94) at com.example.ivan.MyLibraryActivity.<init>(MyLibraryActivity.kt:6) at java.lang.Class.newInstance(Native Method) at android.app.AppComponentFactory.instantiateActivity(AppComponentFactory.java:95) at androidx.core.app.CoreComponentFactory.instantiateActivity(CoreComponentFactory.java:45) at android.app.Instrumentation.newActivity(Instrumentation.java:1285) at androidx.test.runner.MonitoringInstrumentation.newActivity(MonitoringInstrumentation.java:817) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3578) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3842) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2252) 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:7842) 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:1003) Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.lifecycle.viewmodel.CreationExtras$Key" on path: DexPathList[[zip file "/data/app/~~IQ9A0iTcN9ysP1ynYkle2w==/com.example.ivan.test-EKcv8pjnvziFFyouy7OVag==/base.apk"],nativeLibraryDirectories=[/data/app/~~IQ9A0iTcN9ysP1ynYkle2w==/com.example.ivan.test-EKcv8pjnvziFFyouy7OVag==/lib/arm64, /data/app/~~IQ9A0iTcN9ysP1ynYkle2w==/com.example.ivan.test-EKcv8pjnvziFFyouy7OVag==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) ... 23 more
解决方案
1. 修正测试依赖作用域
Library模块的UI测试依赖要添加到androidTestImplementation而非implementation,同时补充SavedState相关依赖,确保测试环境下能获取到完整的lifecycle类:
dependencies { androidTestImplementation libs.androidx.lifecycle.viewModel androidTestImplementation libs.androidx.lifecycle.viewModelSavedState }
2. 为测试启用Multidex
在Library模块的build.gradle中配置测试变体的Multidex支持:
android { defaultConfig { multiDexEnabled true testInstrumentationRunnerArguments clearPackageData: 'true' } testOptions { animationsDisabled = true } }
同时添加Multidex的测试依赖:
androidTestImplementation 'androidx.multidex:multidex:2.0.1' androidTestImplementation 'androidx.multidex:multidex-instrumentation:2.0.1'
3. 统一AndroidX依赖版本
确保:app和:mylibrary模块中所有AndroidX依赖版本完全一致,避免版本冲突导致类缺失。可以在项目根目录build.gradle中统一管理版本:
ext { lifecycle_version = "2.6.2" }
然后在模块中引用统一版本:
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" androidTestImplementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
4. 彻底清理重建项目
执行以下操作清除缓存并重新构建:
- 点击Android Studio菜单栏
Build > Clean Project - 点击
Build > Rebuild Project - 执行命令:
./gradlew clean testClasses
5. 验证测试APK的Dex内容
通过Android Studio的Build > Analyze APK打开生成的测试APK,检查classes.dex中是否包含androidx.lifecycle.viewmodel.CreationExtras$Key类,确认依赖是否正确打包。
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

