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

Android项目多模块依赖源码Jar下载Gradle配置报错求助

解决Android项目下载依赖源码Jar的问题

嘿,我知道你在Android项目里下载依赖源码Jar时踩坑了——原来的Java项目Gradle代码在Android里用不了,主要是因为Android Gradle插件(AGP)早就弃用了configurations.compile,再加上项目存在Build Variants(比如debug/release),得针对Android项目的特性来调整代码。

为什么原来的代码报错?

从AGP 3.0版本开始,compile依赖配置就被implementation和api取代了,而且Android项目的依赖是和Build Variants绑定的——不同的变体(debug/release)可能有不同的依赖配置,所以直接用configurations.compile肯定会找不到对应的配置项。

解决方案:针对Android项目的Gradle任务

1. 单个模块下载指定变体的源码Jar

如果只需要处理当前模块(比如app模块),可以在模块的build.gradle里添加以下任务:

// 定义下载源码的任务
task downloadDebugSources(type: Copy) {
    // 源码Jar的输出目录,可自定义
    into "$project.rootDir/libDownload/${project.name}/debug"
    
    // 针对debug变体的依赖配置,获取对应的源码Jar
    from configurations.debugImplementation.map { dependency ->
        // 仅获取存在的源码Jar,避免空文件
        dependency.source ?: null
    }
    
    // 排除空目录
    includeEmptyDirs = false
}

// 让build任务自动触发下载,也可以手动执行./gradlew downloadDebugSources
build.dependsOn(downloadDebugSources)

如果需要下载release变体的源码,只需要把debugImplementation换成releaseImplementation,任务名改成downloadReleaseSources即可。

2. 批量处理所有模块的所有变体

如果项目有多个模块(app+多个library),且需要下载所有变体的源码Jar,可以在**根目录的build.gradle**里添加以下代码:

subprojects {
    afterEvaluate { project ->
        // 只对Android模块生效(app或library)
        if (project.plugins.hasPlugin('com.android.application') || project.plugins.hasPlugin('com.android.library')) {
            // 遍历所有Build Type(debug/release等)
            project.android.buildTypes.each { buildType ->
                def variantName = buildType.name.capitalize()
                def taskName = "download${variantName}Sources"
                
                // 为每个变体创建下载任务
                project.task(taskName, type: Copy) {
                    into "$rootDir/libDownload/${project.name}/${buildType.name}"
                    from project.configurations."${buildType.name}Implementation".map { it.source ?: null }
                    includeEmptyDirs = false
                }
                
                // 将下载任务绑定到对应变体的build任务
                project.tasks."assemble${variantName}".dependsOn taskName
            }
        }
    }
}

3. 处理带Product Flavors的情况

如果项目还有Product Flavors(比如free/paid),需要组合Flavor和Build Type来获取对应的配置,比如freeDebugImplementation,可以调整代码如下:

subprojects {
    afterEvaluate { project ->
        if (project.plugins.hasPlugin('com.android.application') || project.plugins.hasPlugin('com.android.library')) {
            // 遍历所有Flavor和Build Type的组合
            project.android.productFlavors.each { flavor ->
                project.android.buildTypes.each { buildType ->
                    def variantName = "${flavor.name.capitalize()}${buildType.name.capitalize()}"
                    def configName = "${flavor.name}${buildType.name}Implementation"
                    def taskName = "download${variantName}Sources"
                    
                    project.task(taskName, type: Copy) {
                        into "$rootDir/libDownload/${project.name}/${flavor.name}/${buildType.name}"
                        from project.configurations[configName].map { it.source ?: null }
                        includeEmptyDirs = false
                    }
                    
                    project.tasks."assemble${variantName}".dependsOn taskName
                }
            }
        }
    }
}

使用方法

  • 手动执行单个任务:比如在Terminal里输入 ./gradlew app:downloadDebugSources(下载app模块debug变体的源码)
  • 执行build任务自动下载:输入 ./gradlew assembleDebug,会自动触发对应变体的源码下载
  • 所有模块所有变体:直接执行对应变体的下载任务即可,比如./gradlew downloadFreeDebugSources

注意事项

  • 部分第三方依赖可能没有提供源码Jar,这类依赖会被自动跳过,不会报错
  • 输出目录可以根据自己的需求修改,比如改成libs/sources之类的路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:58:45