You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建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()
                  }
              }
          }
      }
      
  • 客户端依赖未同步:若选择不合并模块,客户端需同时添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:09:21