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

如何在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版本更新导致功能失效。

注意事项

  1. 确保你的插件依赖Android Gradle插件API,在插件的build.gradle中添加:
dependencies {
    implementation gradleApi()
    implementation "com.android.tools.build:gradle-api:7.4.2" // 版本号和你项目使用的AGP版本保持一致
}
  1. 优先选择RuntimeClasspath或CompileClasspath这类配置,它们包含了该变体下所有已解析的依赖(包括传递依赖)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:14:30