每个变种的Android Gradle自定义任务

时间:2015-03-19 15:09:45

标签: android groovy gradle android-productflavors

我有一个使用Gradle构建的Android应用程序,其中包含BuildTypes和Product Flavors(变体)。 我可以运行此命令来构建特定的apk:

./gradlew testFlavor1Debug
./gradlew testFlavor2Debug

我必须在每个变体的build.gradle中创建一个自定义任务,例如:

./gradlew myCustomTaskFlavor1Debug

我为此创建了一个任务:

android.applicationVariants.all { variant ->
    task ("myCustomTask${variant.name.capitalize()}") {
        println "*** TEST ***"
        println variant.name.capitalize()
    }
}

我的问题是,所有变种都会调用此任务,而不是我正在运行的唯一变体。 输出:

./gradlew myCustomTaskFlavor1Debug

*** TEST ***
Flavor1Debug
*** TEST ***
Flavor1Release
*** TEST ***
Flavor2Debug
*** TEST ***
Flavor2Release

预期产出:

./gradlew myCustomTaskFlavor1Debug

*** TEST ***
Flavor1Debug

如何定义自定义任务,动态,每个变体,然后使用正确的变体调用它?

2 个答案:

答案 0 :(得分:17)

这是因为逻辑是在配置时执行的。尝试添加操作(<<):

android.applicationVariants.all { variant ->
    task ("myCustomTask${variant.name.capitalize()}") << {
        println "*** TEST ***"
        println variant.name.capitalize()
    }
}

答案 1 :(得分:1)

从Gradle 3.2开始,遵循蛋白石的答案和<<的{​​{3}},正确的答案应该是:

android.applicationVariants.all { variant ->
    task ("myCustomTask${variant.name.capitalize()}") {
        // This code runs at configuration time

        // You can for instance set the description of the defined task
        description = "Custom task for variant ${variant.name}"

        // This will set the `doLast` action for the task..
        doLast {
            // ..and so this code will run at task execution time
            println "*** TEST ***"
            println variant.name.capitalize()
        }
    }
}