KMM生成AAR后嵌套依赖缺失,无法导入共享类及第三方库
问题分析与解决方案
核心原因:AAR默认不包含依赖项
AAR本质是Android库的编译产物归档,默认不会将依赖的模块(如KMM共享模块)或第三方库(koin、coil、ktor)打包进去,只会在生成的pom.xml文件中声明这些依赖关系。但当你直接将AAR放在主项目的libs目录下引入时,Gradle不会自动读取AAR附带的pom文件,因此这些依赖不会被自动引入主项目,导致共享模块类无法导入、第三方库类找不到(如coil.compose.SingletonAsyncImageKt的ClassNotFoundException)。
而你单独添加共享模块AAR时能正常导入,是因为此时主项目直接依赖了共享模块的代码,没有经过Android库模块的中转。
解决方案
1. 发布KMM库到Maven仓库(推荐)
这是最规范的方式,能让Gradle自动解析所有依赖:
- 在KMM项目的Android模块和共享模块的
build.gradle.kts中添加maven-publish插件:plugins { // ... 其他插件 `maven-publish` } - 配置发布内容,以Android模块为例:
publishing { publications { create<MavenPublication>("release") { from(components["release"]) groupId = "com.yourgroup" artifactId = "kmm-library" version = "1.0.0" } } repositories { mavenLocal() // 发布到本地Maven仓库 // 也可以配置远程Maven仓库,如私有仓库等 } } - 执行命令发布到本地仓库:
./gradlew publishToMavenLocal - 在主项目的
build.gradle.kts中引入本地Maven依赖:
这样Gradle会自动下载KMM库的所有依赖(包括共享模块、koin、coil等)。repositories { mavenLocal() // ... 其他仓库 } dependencies { implementation("com.yourgroup:kmm-library:1.0.0") }
2. 使用Fat-AAR插件打包所有依赖
如果不想发布到仓库,可以用插件将依赖合并到AAR中:
- 在KMM Android模块的
build.gradle.kts中引入fat-aar插件:plugins { id("com.android.library") id("com.kezong.fat-aar") version "1.3.8" // ... 其他KMM相关插件 } - 配置需要合并的依赖,将共享模块和第三方依赖标记为
embed:dependencies { // 嵌入共享模块 embed(project(":shared")) // 嵌入第三方依赖 embed("io.insert-koin:koin-android:3.4.0") embed("io.coil-kt:coil-compose:2.4.0") embed("io.ktor:ktor-client-android:2.3.3") // ... 其他需要嵌入的依赖 } - 重新执行
./gradlew assembleRelease生成包含所有依赖的AAR,再导入主项目即可。
3. 手动添加缺失依赖(不推荐)
如果临时测试用,可以手动在主项目中添加所有缺失的依赖:
- 将KMM共享模块的AAR也放到主项目的
libs目录 - 在主项目的
build.gradle.kts中添加:
这种方式容易遗漏依赖,且后续KMM库更新时需要同步修改主项目依赖,维护成本高。dependencies { implementation(files("libs/kmm-android-library.aar")) implementation(files("libs/kmm-shared-library.aar")) // 添加第三方依赖 implementation("io.insert-koin:koin-android:3.4.0") implementation("io.coil-kt:coil-compose:2.4.0") implementation("io.ktor:ktor-client-android:2.3.3") // ... 其他KMM库依赖的第三方库 }
额外确认点
确保KMM Android模块已正确转为库:
- 将插件从
com.android.application改为com.android.library - 移除
defaultConfig中的applicationId配置
内容的提问来源于stack exchange,提问作者PRATHIV
相关产品推荐
相关产品推荐

