如何使用 gradlew 列出所有构建变体?

mic*_*ckp 6 android gradle build.gradle android-gradle-plugin

是否可以使用gradlew其他命令行工具列出所有构建变体?

例如以下内容build.gradle

buildTypes {
    debug {}
    release {}
}
productFlavors {
    dev {}
    prod {}
}
Run Code Online (Sandbox Code Playgroud)

该命令将返回类似以下内容:

devDebug
devRelease
prodDebug
prodRelease
Run Code Online (Sandbox Code Playgroud)

一种选择是在 my 中创建一个 gradle 任务build.gradle,然后我将使用gradlew. 但我正在寻找一种适用于任何项目的通用解决方案,而无需添加任何内容。

小智 7

据我所知,没有一个任务可以输出所有变体。创建这样的任务并不是非常困难,但我认为这里可能有更好的解决方案适合您的用例。

所以你在这里有几个选择。首先,gradle 任务的设置方式使得您的示例将具有以下任务:

assemble
assembleDev
assembleProd
assembleDebug
assembleRelease
assembleDevDebug
assembleDevRelease
assembleProdDebug
assembleProdRelease
Run Code Online (Sandbox Code Playgroud)

如果您的目标是构建所有变体,那么您可以简单地运行:app:assemble,并且将构建所有 ProductFlavor 和 buildType 变体。如果您只想发布版本,但是每种风格,那么您可以:app:assembleRelease这样做,并且会自动运行

assembleDevRelease
assembleProdRelease
Run Code Online (Sandbox Code Playgroud)

许多其他任务也遵循相同的模式。但不一定是全部。正如 Stephan 在/sf/answers/4847834211/中提到的那样,跑步:app:tasks可以是查看您有哪些任务可用的良好开始。


如果您确实需要一个输出每个变体名称的任务(或者您想在代码中访问这些名称),那么您可以执行以下操作:

task("printVariants") {
    doFirst {
        println project.getExtensions().getByType(com.android.build.gradle.AppExtension.class).applicationVariants*.name
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您想对每个变体执行某些操作,则可以执行以下操作:

AppExtension android = project.getExtensions().getByType(AppExtension.class)
android.applicationVariants.each { appVariant ->
    // Variant-specific code goes here.
    // Example below: Creating a task for each variant.
    project.tasks.create("${appVariant.name}MyVariantSpecificTask", ...)
}
Run Code Online (Sandbox Code Playgroud)

记住 build.gradle 只是代码会有所帮助。你可以在这里编写任何代码 - 只要你熟悉 Groovy 和 gradle + android gradle 插件 (AGP) api。


Ste*_*han 4

Gradle 已经有一个任务,它叫做tasks

./gradlew tasks
Run Code Online (Sandbox Code Playgroud)