Jetpack Compose截图测试调用captureToImage()后出现NoClassDefFoundError
Compose截图测试抛出NoClassDefFoundError异常
问题场景
运行针对Compose可组合项的截图测试时,出现NoClassDefFoundError异常。
测试代码
@RunWith(AndroidJUnit4::class) class MyTest { @get:Rule val composeTestRule = createComposeRule() @Test fun exampleTest() { composeTestRule.setContent { MyComposable() } composeTestRule.onRoot().captureToImage() } }
堆栈跟踪信息
java.lang.NoClassDefFoundError: androidx.compose.ui.test.android.WindowCapture_androidKt$$ExternalSyntheticLambda0 at androidx.compose.ui.test.android.WindowCapture_androidKt.generateBitmapFromPixelCopy(WindowCapture.android.kt:112) at androidx.compose.ui.test.android.WindowCapture_androidKt.generateBitmap(WindowCapture.android.kt:104) at androidx.compose.ui.test.android.WindowCapture_androidKt.access$generateBitmap(WindowCapture.android.kt:1) at androidx.compose.ui.test.android.WindowCapture_androidKt$captureRegionToImage$1.invoke(WindowCapture.android.kt:46) at androidx.compose.ui.test.android.WindowCapture_androidKt$captureRegionToImage$1.invoke(WindowCapture.android.kt:46) at androidx.compose.ui.test.android.WindowCapture_androidKt.withDrawingEnabled(WindowCapture.android.kt:60) at androidx.compose.ui.test.android.WindowCapture_androidKt.captureRegionToImage(WindowCapture.android.kt:46) at androidx.compose.ui.test.AndroidImageHelpers_androidKt.processSingleWindowScreenshot(AndroidImageHelpers.android.kt:138) at androidx.compose.ui.test.AndroidImageHelpers_androidKt.captureToImage(AndroidImageHelpers.android.kt:75) at androidx.compose.ui.test.AndroidImageHelpers_androidKt.captureToImage(AndroidImageHelpers.android.kt:50) at com.example.MyTest.exampleTest(MyTest.kt:47)
解决方案
这个异常通常由Compose测试依赖版本不匹配、缺失必要依赖或R8混淆误删类导致,可按以下步骤修复:
统一Compose依赖版本
在Module级build.gradle中定义统一的Compose版本变量,确保所有测试相关依赖使用同一版本:ext { compose_version = "1.5.4" } dependencies { androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version" debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version" }调整R8混淆规则
若测试构建启用了R8,需在测试混淆文件(如proguard-test-rules.pro)中添加规则保留合成类:-keep class androidx.compose.ui.test.android.WindowCapture_androidKt$$ExternalSyntheticLambda* { *; }也可直接禁用测试构建的混淆:
android { buildTypes { debug { minifyEnabled false shrinkResources false } } }清理重建项目
执行Clean Project和Rebuild Project操作,清除旧构建缓存,确保依赖同步生效。更新Android Gradle Plugin(AGP)
旧版AGP可能与Compose测试工具链存在兼容性问题,尝试将AGP升级至8.1.x及以上的稳定版本。
内容的提问来源于stack exchange,提问作者Sergei Kozelko
相关产品推荐
相关产品推荐

