如何获取构建变量输出目录

时间:2015-10-12 23:18:03

标签: android gradle android-gradle

我需要在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插件,而不是应用程序插件(我怀疑这些丢失的汇编*任务也不会在应用程序插件的项目配置期间生成)。

1 个答案:

答案 0 :(得分:2)

您可能想尝试使用gradle.taskGraph.whenReady尝试使用afterEvaluate封闭来包装整个内容。在评估项目后,任务应该存在。

这意味着您的闭包将在配置阶段结束时和执行阶段之前运行。此时所有任务都必须注册。

afterEvaluate { project ->
    // do work on `Project` object just like normal
    project.android.buildTypes.all { theBuildType ->
        ...
    }
}

参考:https://docs.gradle.org/current/javadoc/org/gradle/api/Project.html#afterEvaluate(groovy.lang.Closure)