我需要运行 Android 项目的 assemble* 任务完成后发生的一些任务。特别是,这些任务需要知道特定构建变体的所有已编译类的输出目录是什么。如何检索 assembleFlavor1Debug 任务的输出目录?
我当前的解决方法是这样的(尽管此解决方法存在其自身的问题,例如无法找到汇编任务,即使它已放置在 android 配置 block 之后):
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 assemble* 任务(assembleProdDebug、assembleProdRelease 等)尚未在项目上创建,即使配置是在 Android 配置 block 之后发生的。通过将上面的整个代码 fragment 封装到 gradle.taskGraph.whenReady {...}
中,我能够获得 assemble* 任务的附加配置。 block ,但这确实意味着我失去了继续配置依赖关系图的能力。幸运的是,在我的特定情况下不配置依赖项并不是重大损失;我所需要的只是能够记录最后组装的构建类型和产品风格。
我还想指出,此行为是在 Android Gradle 插件 1.0.0 版本中出现的。虽然我没有检查过,但在该插件的较新版本上可能不会出现这些 Android 任务缺失的情况。
编辑#2:所以我也尝试了 Android Gradle 插件的 1.3.0 版本。我还想指出,这是 LIBRARY Android 插件,而不是应用程序插件(不过,我怀疑这些缺失的 assemble* 任务也不会在应用程序插件的项目配置期间生成)。
最佳答案
您可能想尝试使用 afterEvaluate
闭包,而不是使用 gradle.taskGraph.whenReady
包装整个内容。任务应该在项目评估后存在。
这意味着您的闭包将在配置阶段结束时和执行阶段之前运行。此时所有任务都必须注册。
afterEvaluate { project ->
// do work on `Project` object just like normal
project.android.buildTypes.all { theBuildType ->
...
}
}
关于android - 如何获取构建变体输出目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33091708/