如何在Gradle任务中获取当前构建的flavor名称?
Gradle任务获取当前构建Flavor的修复方案
问题原因
之前的实现无法拿到flavor,是因为gradle.getStartParameter().getTaskRequests().toString()打印的是DefaultTaskExecutionRequest对象自身的结构信息,而非实际传入的任务执行参数,需要主动调用getArgs()方法获取实际要执行的任务列表。同时原代码缺少显式返回值,也会导致获取到的flavor为空。
修复后的实现代码
首先修正getCurrentFlavor方法:
def getCurrentFlavor() { Gradle gradle = getGradle() // 正确获取所有任务请求的参数列表 List<String> taskRequests = gradle.getStartParameter().getTaskRequests().collect { it.args }.flatten() String tskReqStr = taskRequests.join(" ") // 兼容assemble、generate、install三类常见任务前缀,可按需扩展 Pattern pattern = Pattern.compile("(assemble|generate|install)(\\w+)(Release|Debug)") Matcher matcher = pattern.matcher(tskReqStr) if (matcher.find()) { return matcher.group(2).toLowerCase() } else { println "NO MATCH FOUND" // 可自定义默认返回值避免空指针 return "default" } }
调用注意事项
不要在任务的配置阶段直接调用getCurrentFlavor,Gradle配置阶段会优先解析所有任务配置,此时任务请求参数还未完全加载,需要放在任务的执行阶段逻辑中:
task getAssets(type: Copy) { // 配置阶段逻辑写此处(如复制的源路径、目标路径) from("src/main/assets/") into("build/intermediates/assets/") // 执行阶段逻辑用doFirst/doLast包裹,此时才能正确获取flavor doFirst { def currentFlavor = getCurrentFlavor() // 后续基于flavor的处理逻辑写此处 println "当前构建flavor为:${currentFlavor}" } }
内容的提问来源于stack exchange,提问作者matdev
相关产品推荐
相关产品推荐

