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
相关产品推荐
相关产品推荐

