我需要在Android项目的汇编*任务完成后运行一些任务。特别是,这些任务需要知道特定构建变体的所有已编译类的输出目录是什么。如何检索assembleFlavor1Debug任务的输出目录?
我目前的解决方法是这样的(虽然这种解决方法会出现问题,就像找不到汇编任务一样,即使它已经放在android配置块之后):
android.buildTypes.all { theBuildType ->
android.productFlavors.all { theFlavor ->
String capitalizedType = ... //Type name with first letter capitalized
String capitalizedFlavor = ... //Flavor name with first letter capitalized
...
project.tasks["assemble${capitalizedType}${capitalizedFlavor}"].configure {
doLast {
project.ext.variantOutput = "build/intermediates/classes/${theFlavor.name}/${theBuildType.name}"
}
}
}
}
编辑#1:我能够修复我的解决方法。主要问题是Android汇编*任务(assembleProdDebug,assembleProdRelease等)尚未在项目中创建,即使配置是在Android配置块之后发生的。通过将上面的整个代码片段封装到gradle.taskGraph.whenReady {...}
块中,我能够对汇编*任务进行额外配置,但这确实意味着我失去了继续配置依赖关系图的能力。幸运的是,在我的特定情况下不配置依赖关系并不是一个重大损失;我需要的就是能够记录最后组装的构建类型和产品风格。
我还要注意,此行为适用于Android Gradle插件的1.0.0版。虽然我没有检查过,但是在这个插件的较新版本中可能不会出现这些Android任务。
编辑#2:所以我也尝试了Android Gradle插件的1.3.0版本。我还要注意这是LIBRARY Android插件,而不是应用程序插件(我怀疑这些丢失的汇编*任务也不会在应用程序插件的项目配置期间生成)。答案 0 :(得分:2)
您可能想尝试使用gradle.taskGraph.whenReady
尝试使用afterEvaluate
封闭来包装整个内容。在评估项目后,任务应该存在。
这意味着您的闭包将在配置阶段结束时和执行阶段之前运行。此时所有任务都必须注册。
afterEvaluate { project ->
// do work on `Project` object just like normal
project.android.buildTypes.all { theBuildType ->
...
}
}