DEV Community

Cover image for Groovy 101: How To Create Custom Gradle Tasks In Android Studio
saadnoor salehin
saadnoor salehin

Posted on

Groovy 101: How To Create Custom Gradle Tasks In Android Studio

For automating the build process, Android Studio uses Gradle, which is a build tool. Gradle uses Groovy-based DSL (Domain Specific Language) and Groovy is a powerful scripting language for Java platform.

Well, in summary, we need a little bit of familiarity with Groovy to work with Gradle. In this blog post, we will learn some hello world type Groovy, and then we will learn how to write custom tasks in Gradle with Groovy.

Variable Declaration:

def str = "hello world" yes, as simple as that.
Similarly we can declare lists and maps also,

def nameOfList = []
def nameOfMap = [:]


Loops are very interesting, start.upto(end), that’s it.


1.upto(5) {
 println "$it"



For iterating through lists and map, we can use every keyword.

nameOfList.each { item ->
    println element


In simple term, a block of code that acts like a function. This function can be assigned to a variable.

A closure in Groovy is an open, anonymous, block of code that can take arguments, return a value and be assigned to a variable.

We will understand closure by running an example. Lets open android studio to play with Groovy. After opening the android studio, go to tools -> groovy console.

Type this code:

void doSomething(Closure closure) {

doSomething {
    print “DID SOMETHING”

Then run it, for running it click the green run button

Are these codes seems familiar? Your build.gradle file is full of these codes. Eg:

dataBinding {
    enabled = true
testOptions {
    animationsDisabled = true

Now we will write a task in our build.gradle file, the task is to make a list of 10 numbers, (from 1 to 10), then print the list.

At the end of your app/build.gradle file, add this code:

task myFirstTask { task ->
    def list = []
    doFirst {
        1.upto(10){ val->
    doLast {
        list.each { item ->

Code explains everything, still - myFirstTask is the task name, and into that we are defining our task.
doFirst and doLast is the syntax of Gradle to differentiate which portion will run first and which one will run last.

Now for executing this, in the terminal navigate to the project folder. and type:
./gradlew myFirstTask
If everything alright, you will see in your console:

> Task :app:myFirstTask
1 actionable task: 1 executed

Okay, pretty boring , right?
Now let's​ do some interesting stuffs. I don’t like the name “app-debug.apk" every-time I build the project, and I am too lazy to navigate some subfolders to get this apk file, I want it in my desktop folder. Here is how, I will write the task.

task getDebugAppInDesktopFolder(dependsOn: 'assembleDebug') {
        def destination = "/Users/saadnoorsalehin/Desktop"
        def desiredName = "my-given-name"
        ext.apk = file("build/outputs/apk/debug/app-debug.apk")

        if (ext.apk.exists()) {
            copy {
                from ext.apk.absolutePath
                into destination
                rename { desiredName }

In the above code, the keyword dependsOn specify the dependencies tasks,
getDebugAppInDesktopFolder will require the execution of assembleDebug (the default task which will generate our debug apk) .

After running ./gradlew getDebugAppInDesktopFolder you will see your desired apk file in your desktop folder.

Thanks for reading, Groovy and Gradle both are very vast topic, it is impossible to make everything clear in a single blog post, but I hope you have gotten an idea how things work and how to play with them. If you have any query or feedback regarding this reach me at

Top comments (2)

jadebeer profile image
Hannes de Beer 💥

Can anyone tell me: I have a freeDebug, freeRelease, paidDebug and paidRelease variants. As per my school assignment I have to have an installRelease task but of course I only have an installFreeRelease and installPaidRelease task. How can I create an installRelease task that would alias installFreeRelease - for all intents and purposes do exactly what installFreeRelease would do.

jmfayard profile image
Jean-Michel (

In the last example, you should use a task of type Copy