【问题标题】:How to get build variant output directory如何获取构建变体输出目录
【发布时间】:2015-10-12 23:18:03
【问题描述】:

我需要运行一些在 Android 项目的 assemble* 任务完成后发生的任务。特别是,这些任务需要知道特定构建变体的所有已编译类的输出目录是什么。如何检索 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 assemble* 任务(assembleProdDebug、assembleProdRelease 等)尚未在项目中创建,即使配置是在 Android 配置块之后发生的。通过将上面的整个代码 sn-p 包含在 gradle.taskGraph.whenReady {...} 块中,我能够完成 assemble* 任务的附加配置,但这确实意味着我失去了继续配置依赖关系图的能力。幸运的是,在我的特定情况下不配置依赖项并不是重大损失;我所需要的只是能够记录最后组装的构建类型和产品风味。

我还想指出,此行为适用于 Android Gradle 插件的 1.0.0 版。虽然我没有检查过,但在此插件的较新版本上可能不会出现这些 Android 任务的缺失。

编辑 #2:所以我也尝试了 Android Gradle 插件的 1.3.0 版。我还想指出,这是 LIBRARY Android 插件,而不是应用程序插件(我怀疑这些缺少的 assemble* 任务也不会在应用程序插件的项目配置期间生成)。

【问题讨论】:

    标签: android gradle android-gradle-plugin


    【解决方案1】:

    您可能想尝试使用 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)

    【讨论】:

    • 谢谢!我可以使用 afterEvaluate() 配置任务依赖项。似乎在项目配置和 afterEvaluate 闭包执行之间的某个地方生成了额外的 Android 任务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2011-05-09
    • 2013-09-20
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多