构建AAR时添加模块依赖遇NoClassDefFoundError问题求助
排查AAR依赖缺失导致NoClassDefFoundError的常见配置问题
依赖声明类型错误:使用
implementation project(":module2")仅能让module1在编译阶段访问module2的代码,但生成的AAR不会包含module2的类文件,客户端引用后自然找不到对应类。需将依赖声明改为api project(":module2"),这样module2的依赖会被传递到客户端;若需要将module2的代码直接打包进module1的AAR,再配合后续打包配置。AAR未打包依赖模块代码:默认Android Library的AAR不会自动合并本地依赖模块的代码。若要将module2的代码合并到module1的AAR中,在module1的构建脚本中添加以下配置:
- Groovy版本(build.gradle):
android { libraryVariants.all { variant -> variant.outputs.each { output -> def aarTask = output.getProcessResourcesProvider().get() aarTask.doLast { def module2Aar = project(':module2').tasks.getByName("bundle${variant.name.capitalize()}Aar").outputs.files.singleFile def tempDir = output.outputFile.parentFile.resolve("temp") copy { from zipTree(module2Aar) into tempDir } def mergedAar = output.outputFile.parentFile.resolve("merged-${output.outputFile.name}") // 复制除classes.jar外的内容到合并包 zipTree(output.outputFile).matching { exclude 'classes.jar' }.copyTo(mergedAar) // 合并两个模块的classes.jar zipTree(tempDir.resolve("classes.jar")).plus(zipTree(output.outputFile).matching { include 'classes.jar' }).copyTo(mergedAar) // 替换原AAR output.outputFile.delete() mergedAar.renameTo(output.outputFile) tempDir.deleteDir() } } } } - Kotlin版本(build.gradle.kts):
android { libraryVariants.all { variant -> variant.outputs.forEach { output -> val aarTask = output.processResourcesProvider.get() aarTask.doLast { val module2Aar = project(":module2").tasks.getByName("bundle${variant.name.replaceFirstChar { it.uppercase() }}Aar").outputs.files.singleFile val tempDir = output.outputFile.parentFile.resolve("temp") copy { from(zipTree(module2Aar)) into(tempDir) } val mergedAar = output.outputFile.parentFile.resolve("merged-${output.outputFile.name}") zipTree(output.outputFile).matching { exclude("classes.jar") }.copyTo(mergedAar) zipTree(tempDir.resolve("classes.jar")).plus(zipTree(output.outputFile).matching { include("classes.jar") }).copyTo(mergedAar) output.outputFile.delete() mergedAar.renameTo(output.outputFile) tempDir.deleteRecursively() } } } }
- Groovy版本(build.gradle):
客户端依赖未同步:若选择不合并模块,客户端需同时添加module1和module2的AAR依赖,但这种方式不利于库的分发,优先推荐合并或使用
api传递依赖。混淆规则遗漏:若module2开启了混淆,可能会移除或重命名被调用的类。检查module2的
proguard-rules.pro,确保保留相关类:-keep public class com.yourpackage.module2.** { *; }同时module1的混淆规则也要避免混淆module2的类,或在合并AAR后统一配置混淆规则。
构建变体不匹配:确保生成AAR时,module1和module2使用相同的构建变体(如debug/release),否则AAR可能未包含对应变体的module2代码。
内容的提问来源于stack exchange,提问作者PPB
相关产品推荐
相关产品推荐

