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

Posted

技术标签:

【中文标题】每个变体的 Android Gradle 自定义任务【英文标题】:Android Gradle custom task per variant 【发布时间】:2015-05-22 18:47:02 【问题描述】:

我有一个使用 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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我是自己发现的 :( 还是谢谢你的提示!【参考方案2】:

从 Gradle 3.2 开始,按照 Opal 的回答和 &lt;&lt; 运算符的 deprecation,正确答案应该是:

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()
        
    

【讨论】:

以上是关于每个变体的 Android Gradle 自定义任务的主要内容,如果未能解决你的问题,请参考以下文章

Android gradle 自定义配置

Android 基于Gradle 7.4.2,自定义插件示例

如何根据构建变体使用 gradle 不同依赖模块的依赖项进行编译?

Android 基于Gradle 7.2+,自定义插件示例(实测7.4.2也可以运行)

Android 基于Gradle 7.2+,自定义插件示例(实测7.4.2也可以运行)

Android知识要点整理(19)----Gradle 之构建变体