如何在Gradle插件中高效获取项目已解析的依赖版本?
最优解决方案:利用Gradle依赖解析API直接获取已解析版本
你之前踩的那些坑其实完全可以避开——Gradle本身就提供了直接访问已完成版本解析的依赖API,既不用去抓任务输出,也不用启动新进程,速度快还准确。
方案1:针对单个构建变体获取依赖
Android项目的每个变体(比如debug、release)都对应专属的依赖配置,你可以直接拿到对应配置的resolvedConfiguration,它返回的就是最终解析好的依赖集合,不会有+这类未解析的占位符。
在你的插件任务里可以这么写:
import org.gradle.api.artifacts.ResolvedDependency task checkOurLibraries { doLast { // 选择你需要的配置,比如debugRuntimeClasspath(包含运行时所有依赖) def targetConfig = project.configurations.findByName("debugRuntimeClasspath") if (!targetConfig) { println "目标配置不存在,请检查变体名称是否正确" return } // 触发依赖解析(Gradle会自动缓存结果,后续执行几乎即时) def resolvedConfig = targetConfig.resolvedConfiguration // 遍历直接声明的一级依赖 resolvedConfig.firstLevelModuleDependencies.each { ResolvedDependency dep -> // 过滤我方特定组的库 if (dep.moduleGroup == "com.your-company") { println "找到我方库:${dep.moduleGroup}:${dep.moduleName}:${dep.moduleVersion}" // 在这里添加下载对应版本配置文件的逻辑即可 } // 如果需要遍历所有传递依赖,取消下面的注释 // dep.children.each { ResolvedDependency childDep -> // if (childDep.moduleGroup == "com.your-company") { // println "找到传递依赖的我方库:${childDep.moduleGroup}:${childDep.moduleName}:${childDep.moduleVersion}" // } // } } } }
方案2:遍历所有构建变体
如果需要检查所有变体的依赖,可以通过Android插件API遍历所有变体,为每个变体生成对应的检查任务:
import com.android.build.gradle.api.BaseVariant import org.gradle.api.artifacts.ResolvedDependency android { applicationVariants.all { BaseVariant variant -> task "checkOurLibrariesFor${variant.name.capitalize()}" { doLast { def configName = "${variant.name}RuntimeClasspath" def targetConfig = project.configurations.findByName(configName) if (!targetConfig) { println "配置${configName}不存在" return } def resolvedConfig = targetConfig.resolvedConfiguration resolvedConfig.firstLevelModuleDependencies.each { ResolvedDependency dep -> if (dep.moduleGroup == "com.your-company") { println "[${variant.name}] 我方库:${dep.moduleGroup}:${dep.moduleName}:${dep.moduleVersion}" } } } } } }
这个方案的核心优势
- 速度快:复用当前Gradle进程的依赖缓存,第一次解析可能需要几秒,但后续执行几乎无延迟,完全没有启动新守护进程的5秒开销。
- 准确性高:拿到的是Gradle最终解析后的版本,和实际构建时使用的版本完全一致,不会出现
+这类未解析占位符。 - 维护性强:基于官方API实现,比解析任务输出、逆向分析任务逻辑更可靠,不会因为Gradle版本更新导致功能失效。
注意事项
- 确保你的插件依赖Android Gradle插件API,在插件的
build.gradle中添加:
dependencies { implementation gradleApi() implementation "com.android.tools.build:gradle-api:7.4.2" // 版本号和你项目使用的AGP版本保持一致 }
- 优先选择
RuntimeClasspath或CompileClasspath这类配置,它们包含了该变体下所有已解析的依赖(包括传递依赖)。
内容的提问来源于stack exchange,提问作者MrMister
相关产品推荐
相关产品推荐

