Android库集成Jetpack Compose后报ClassNotFoundException异常
问题产生原因
这个问题和代码压缩、混淆没有关系,核心是Gradle依赖配置规则不符合AAR发布的预期:
- Android库模块默认输出的AAR不会包含
implementation声明的第三方依赖字节码,同时implementation标记的依赖不会作为传递依赖暴露给引入AAR的宿主应用。 - 你当前所有Compose相关依赖都用
implementation声明,既没有打包进AAR,也不会通知宿主应用拉取这些依赖。而你的目标宿主本身没有接入Jetpack Compose,运行时启动你写的Compose Activity时,自然找不到androidx.compose.material.ColorsKt、androidx.compose.runtime.internal.ComposableLambdaKt这类Compose核心类,抛出ClassNotFoundException。 - 额外配置问题:你的依赖声明里重复添加了两次
androidx.compose.ui:ui-tooling-preview,属于冗余配置,虽然不会直接导致类找不到,但会增加不必要的配置复杂度。
修复方案
优先选择符合Android开发规范的依赖传递方案,避免冲突:
- 将所有运行时必需的Compose相关依赖、以及其他对外暴露接口需要用到的依赖,从
implementation修改为api。api声明的依赖会作为传递依赖,在宿主引入你的AAR时自动被Gradle拉取,即使宿主没有主动接入Compose,也能拿到所有需要的类。 - 检查库模块的
build.gradle配置,确保已经开启Compose编译支持,配置示例如下(和你当前的版本匹配):
android { // 省略compileSdk、defaultConfig等常规配置 buildFeatures { compose true } composeOptions { kotlinCompilerExtensionVersion = "1.1.1" kotlinCompilerVersion = "1.6.10" } }
- 删除冗余的重复依赖:去掉重复声明的那行
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"。 - 重新编译发布AAR后,可以在宿主工程执行
./gradlew app:dependencies检查依赖树,确认Compose相关依赖已经被正确拉取,即可解决运行时类找不到的问题。
如果你需要输出不依赖外部传递依赖的单文件AAR(不推荐,极易引发依赖冲突),可以引入FatAAR类插件,在编译阶段将所有依赖的字节码合并进AAR包内,但这种方案如果宿主本身也引入了相同的依赖(比如Glide、Kotlin协程、Compose组件),会出现重复类的编译错误。
内容的提问来源于stack exchange,提问作者TareK Khoury
相关产品推荐
相关产品推荐

