0

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
        }
    }
}
JJD
  • 50,076
  • 60
  • 203
  • 339

2 Answers2

1

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.

JJD
  • 50,076
  • 60
  • 203
  • 339
0
task installDevtrackingReleaseFlavors() {
    android.applicationVariants.all { v ->
        if (v.name.endsWith('DevtrackingRelease')) {
            String name = v.name.capitalize()
            dependsOn "install$name"
        }
    }
}
Rajesh N
  • 6,198
  • 2
  • 47
  • 58
  • I don't want an `install` task. I don't want to run it automatically when I call `./gradlew tasks`. – JJD Apr 26 '17 at 09:22
  • 1
    it's look like a good track ... change install to assemble then this task should run all `assembleXXXXXXXDevtrackingRelease` tasks ... this answer seems like copy of [Gradle Recipes for Android code](https://books.google.pl/books?id=10pODAAAQBAJ&pg=PA79&lpg=PA79&dq=android.applicationVariants.all+%7B+v+-%3E+if+(v.name.endsWith()+%7B+String+name+%3D+v.name.capitalize()+dependsOn+install$name+%7D+%7D&source=bl&ots=qKM0lIEMhK&sig=iknp-r56E9kfKSFRLaqPc2OH4hE&hl=pl&sa=X&ved=0ahUKEwjNzu__5sHTAhXJ1xQKHScECh8Q6AEIIzAA#v=onepage&q&f=false) without change for your requeriments – Selvin Apr 26 '17 at 09:24
  • I do not understand: which line executes the variant specific task? Further, the ebook states that I need to add a `doLast` block to execute commands. – JJD May 02 '17 at 12:45