Jetpack Compose @Preview报NoClassDefFoundError如何解决
Compose 1.2.0-rc01 预览报PoolingContainer类缺失问题解决
问题复现配置
使用1.2.0-rc01版本Jetpack Compose UI Tooling、1.2.0版本Compose Compiler时,典型出错的项目配置如下:
android { composeOptions { kotlinCompilerExtensionVersion "1.2.0" } } dependencies { debugImplementation "androidx.compose.ui:ui-tooling:1.2.0-rc01" debugImplementation "androidx.customview:customview:1.1.0" // 其他依赖间接引入 debugImplementation "androidx.customview:customview:1.2.0-alpha01" // 手动升级的最新版本 }
该配置下IDE无法正常渲染@Preview注解标注的预览页面,表层报错如下:
java.lang.NoClassDefFoundError: Could not initialize class androidx.customview.poolingcontainer.PoolingContainer at androidx.compose.ui.platform.ViewCompositionStrategy$DisposeOnDetachedFromWindowOrReleasedFromPool.installFor(ViewCompositionStrategy.android.kt:97) ...
排查后定位根因为预览类加载器找不到对应资源类:
java.lang.ClassNotFoundException: androidx.customview.poolingcontainer.R$id at com.android.tools.idea.rendering.classloading.loaders.DelegatingClassLoader.findClass(DelegatingClassLoader.kt:81) ...
解决步骤
缺失的androidx.customview.poolingcontainer.R$id是customview-poolingcontainer组件编译时自动生成的资源类,不需要手动写代码补全,按以下操作修复依赖即可:
- 移除手动添加的
debugImplementation "androidx.customview:customview:1.2.0-alpha01"依赖,手动跨版本升级customview会和Compose UI Tooling传递依赖的组件版本冲突,导致资源类丢失。 - 在dependencies块中显式添加和Compose 1.2.0-rc01匹配的poolingcontainer依赖:
debugImplementation "androidx.customview:customview-poolingcontainer:1.0.0"
- 如果业务必须保留高版本customview,需要在Gradle配置中强制统一customview相关组件的版本,避免传递依赖冲突:
configurations.all { resolutionStrategy { force "androidx.customview:customview:1.2.0-alpha01" force "androidx.customview:customview-poolingcontainer:1.0.0" } }
- 执行Gradle同步后,点击IDE菜单栏
File -> Invalidate Caches...,勾选清除缓存并重启IDE,预览即可正常渲染。
注意:不要尝试手动创建对应R类,这类资源类是编译阶段AAR自动合并生成的,手动编写的类无法匹配资源ID映射,会引发其他运行时异常。
内容的提问来源于stack exchange,提问作者Martin Zeitler
相关产品推荐
相关产品推荐

