Search code examples
androidgradlegradle-task

How to filter and execute specific Gradle tasks?


My Android project has different product flavors configured:

productFlavors {
    devtracking {
        dimension trackingFlavorDimension
    }

    livetracking {
        dimension trackingFlavorDimension
    }

    stagingwebservice {
        dimension webserviceFlavorDimension
    }

    livewebservice {
        dimension webserviceFlavorDimension
    }

    playstore {
        dimension brandDimension
    }

    fdroid {
        dimension brandDimension
    }
}

How can I write a task which only builds release build for the devtracking flavor? The "filter" is ready - how can I actually execute the filtered tasks? Note, that right now the "filter" is already executed at configuration time.

task assembleDevtrackingRelease {
    description "Assembles all Devtracking release builds."
    group = "Build"
    android.applicationVariants.all { variant ->
        if (variant.name.contains("DevtrackingRelease")) {
            println(variant.name)
            // TODO Execute this variant
        }
    }
}

Solution

  • With great help of Selvin and mirceanis I finally come up with this solution:

    // Creates a parent task for a set of sub tasks.
    // Sub tasks are collected based on the given task name part.
    def createVariantBatchTask(taskNamePart, taskPrefix = "assemble", taskGroup = "Build") {
        String taskName = "${taskPrefix}${taskNamePart.capitalize()}"
        Task task = tasks.create(taskName)
        task.description "${taskPrefix.capitalize()}s all $taskName builds."
        task.group taskGroup
    
        android.applicationVariants.all { variant ->
            if (variant.name.toLowerCase().contains(taskNamePart.toLowerCase())) {
                Task variantTask = tasks.findByName("${taskPrefix}${variant.name.capitalize()}")
                if (variantTask != null) {
                    task.dependsOn variantTask
                }
            }
        }
    }
    
    createVariantBatchTask("devtrackingRelease")
    createVariantBatchTask("devtrackingDebug")
    

    Possible improvement: Move into a custom task class in buildSrc.