You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android平台Shadow Gradle Plugin问题:生成AAR时提示shadowJar()方法未找到

解决Shadow Gradle Plugin生成AAR时的"Could not find method shadowJar()"错误

当然有人成功用Shadow Gradle Plugin生成AAR啦!你遇到的这个错误,核心原因是Shadow插件默认的shadowJar()任务是给Java库设计的,而Android Library项目用的是com.android.library插件,它和Java库的任务体系不一样,所以直接调用shadowJar会找不到这个方法。

下面给你一套可行的配置方案,帮你生成包含依赖的胖AAR:

1. 先调整插件版本(建议升级)

首先确保Shadow插件版本和你的Android Gradle Plugin(AGP)兼容,比如AGP 7.x可以用Shadow 7.1.2,AGP 8.x可以用Shadow 8.1.1。修改插件配置:

plugins {
    id 'com.android.library'
    id 'kotlin-android'
    id 'com.github.johnrengelman.shadow' version '7.1.2' // 根据AGP版本调整
}

2. 替换原有的shadowJar配置

删掉原来单独的shadowJar块,添加以下自定义任务配置:

android {
    // 保留你原来的Android配置(compileSdk、defaultConfig等)
    ...
}

// 第一步:生成包含所有依赖的胖JAR(基于Release变体)
task shadowReleaseJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar) {
    // 确保先完成编译和资源合并再打包
    dependsOn 'compileReleaseKotlin'
    dependsOn 'mergeReleaseResources'

    // 指定要打包的内容:源码、编译后的类文件、合并后的资源
    from android.sourceSets.main.java.srcDirs
    from android.sourceSets.main.kotlin.srcDirs
    from fileTree(dir: "${buildDir}/intermediates/javac/release/classes", include: '**/*.class')
    from fileTree(dir: "${buildDir}/intermediates/kotlin-classes/release", include: '**/*.class')
    from fileTree(dir: "${buildDir}/intermediates/merged_resources/release", include: '**/*')

    // 配置最终归档的名称(按需修改)
    archiveBaseName.set('shadow')
    archiveClassifier.set('')
    archiveVersion.set('')

    // 可选:排除不需要打包的依赖或类
    // exclude 'androidx/core/**'
}

// 第二步:将胖JAR替换进AAR,生成最终的胖AAR
task shadowReleaseAar(type: Zip) {
    dependsOn shadowReleaseJar
    dependsOn 'assembleRelease' // 先生成基础的Release AAR

    // 解压基础AAR作为模板
    from zipTree("${buildDir}/outputs/aar/${project.name}-release.aar")

    // 替换原有的classes.jar为Shadow生成的胖JAR
    delete 'classes.jar'
    from zipTree(shadowReleaseJar.archiveFile)

    // 配置输出的AAR信息
    archiveBaseName.set('shadow-release')
    archiveExtension.set('aar')
    destinationDirectory.set(file("${buildDir}/outputs/shadow-aar"))
}

3. 执行任务生成AAR

在终端运行以下命令:

# 先生成基础的Release AAR
./gradlew assembleRelease

# 再生成包含所有依赖的胖AAR
./gradlew shadowReleaseAar

最终的AAR会输出在build/outputs/shadow-aar/目录下。

注意事项

  • 如果需要针对Debug变体生成,只需要把任务名里的Release改成Debug,对应调整依赖的任务即可。
  • 确保Shadow插件版本和AGP版本兼容,如果出现版本冲突,参考Shadow插件的版本适配说明调整即可。

内容的提问来源于stack exchange,提问作者gelojavonitalla

火山引擎 最新活动