217
Gradle: From User to Addict

gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Embed Size (px)

Citation preview

Page 1: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Gradle: From User to Addict

Page 2: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 3: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 4: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Simple Possible

Page 5: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 6: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

apply plugin: 'android'

android { compileSdkVersion 19 buildToolsVersion "19.0.3"

defaultConfig { minSdkVersion 8 targetSdkVersion 19 versionCode 1 versionName "1.0" } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } }

dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:19.+' }

Page 7: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

I want to add a task!

Page 8: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

apply plugin: ‘com.android.application’

Page 9: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { compileSdkVersion 19 … }

Page 10: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

dependencies { compile 'com.android.support:appcompat-v7:19.+' compile fileTree(dir: 'libs', include: ['*.jar']) }

Page 11: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

dependencies { compile 'com.android.support:appcompat-v7:19.+' compile fileTree(dir: 'libs', include: ['*.jar']) }

Page 12: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

dependencies { compile 'com.android.support:appcompat-v7:19.+' compile fileTree(dir: 'libs', include: ['*.jar']) }

Page 13: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

What is the Gradle language really doing?

How do I use it?

• create tasks • make a multi-app project • write builds once, reuse

Page 14: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 15: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Simple PossibleSimpossible

Page 16: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

dependencies { compile 'com.crashlytics.android:crashlytics:1.+' }

build.gradle

Page 17: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { dependencies { compile 'com.crashlytics.android:crashlytics:1.+' } }

Page 18: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { … }

dependencies { compile 'com.crashlytics.android:crashlytics:1.+' }

Page 19: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

{ }

Page 20: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

example.java

new Runnable() { public void run() { … } }

Page 21: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

example.java

final int time = System.currentTimeMillis() new Runnable() { public void run() { … } }

Page 22: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

example.java

final int time = System.currentTimeMillis() new Runnable() { public void run() { System.out.println(time); } }

Page 23: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

example.java

final int time = System.currentTimeMillis()

{ System.out.println(time); }

Page 24: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { … }

Page 25: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android({ … })

Page 26: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

android() =

android.apply()

Page 27: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

android.apply(Closure configuration)

Page 28: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android.apply({ … })

Page 29: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android.apply({ it })

Page 30: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

println(android.getClass()) android { println(it.getClass()) }

Page 31: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line output

class com.android.build.gradle.AppExtension_Decorated class com.android.build.gradle.AppExtension_Decorated

println(android.getClass()) android { println(it.getClass()) }

Page 32: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

closure.delegate = this

Page 33: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android.apply({ it })

Page 34: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { defaultConfig { minSdkVersion 8 } }

Page 35: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

defaultConfig.apply(Closure configuration)

Page 36: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { defaultConfig { minSdkVersion 8 } }

Page 37: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { it.defaultConfig { minSdkVersion 8 } }

Page 38: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

println(android.defaultConfig.getClass()) android { defaultConfig { println(it.getClass()) } }

Page 39: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line output

class com.android.build.gradle.internal.dsl.ProductFlavorDsl_Decorated class com.android.build.gradle.internal.dsl.ProductFlavorDsl_Decorated

println(android.defaultConfig.getClass()) android { defaultConfig { println(it.getClass()) } }

Page 40: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { defaultConfig { minSdkVersion 8 } }

Page 41: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { defaultConfig { minSdkVersion 8 println(minSdkVersion) } }

Page 42: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { defaultConfig { setMinSdkVersion(8) } }

Page 43: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android.defaultConfig.minSdkVersion = 8

Page 44: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android.defaultConfig.minSdkVersion

Page 45: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { dependencies { compile 'com.crashlytics.android:crashlytics:1.+' } }

Page 46: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

repositories { maven { url “example" } }

Page 47: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

def maven(Closure closure)

Page 48: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

MavenArtifactRepository maven(Closure closure)

Page 49: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

repositories { println maven { url "example" }.url }

Page 50: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line output

example

Page 51: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 52: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

MavenArtifactRepository maven(Closure closure)

mutation

Page 53: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

repositories { maven { url “example" maven { url "example2" } } }

Page 54: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle (with annotation)

repositories { SEARCHED NEXT maven { SEARCHED FIRST } }

Page 55: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { dependencies { compile 'com.crashlytics.android:crashlytics:1.+' } }

Page 56: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

SEARCHED SECOND android { SEARCHED FIRST

dependencies { compile 'com.crashlytics.android:crashlytics:1.+' } }

Page 57: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Adding a task

Page 58: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Adding a task: Cache each build.gradle with a

timestamp

Page 59: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy)

Page 60: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) << { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Page 61: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) << { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Page 62: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) << { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Page 63: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) << { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Page 64: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line output

:app:copyTask UP-TO-DATE

BUILD SUCCESSFUL

Page 65: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

ideal directory listing

buildCache/ build.gradle1399906750071 build.gradle1401281449000 build.gradle1401290623000

Page 66: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line output

> ls app/buildCache …

Page 67: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask

Page 68: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 69: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

org.gradle.api Interface Project

All Superinterfaces: Comparable<Project>, ExtensionAware, PluginAware

public interface Project extends Comparable<Project>, ExtensionAware, PluginAware

This interface is the main API you use to interact with Gradle from your build file. From a Project, you have programmatic access to all of Gradle's features.

Page 70: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask

Page 71: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

org.gradle.api Interface Project

All Superinterfaces: Comparable<Project>, ExtensionAware, PluginAware

public interface Project extends Comparable<Project>, ExtensionAware, PluginAware

This interface is the main API you use to interact with Gradle from your build file. From a Project, you have programmatic access to all of Gradle's features.

Page 72: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask

Page 73: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task(“copyTask”)

Page 74: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy)

Page 75: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task(“copyTask”, [“type” : “Copy”])

groovy map

Page 76: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Task

task(“copyTask”, [“type” : “Copy”])

Page 77: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

def apply(Closure closure)

Page 78: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Page 79: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line output

:app:copyTask

Page 80: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line output

> ls app/buildCache

build.gradle1399906750071

Page 81: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Page 82: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) << { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Page 83: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

<< { }

Page 84: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

.doLast({ })

Page 85: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Executes?

Page 86: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line

./gradlew assemble

Page 87: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

configuration

apply plugin: ‘android’

android { minSdkVersion 8 }

task print << { println(“Hi!”) }

assemble.dependsOn(print)

apply plugin: ‘android’

android { minSdkVersion 8 }

task print << { println(“Hi!”) }

assemble.dependsOn(print)

executed

execution

apply plugin: ‘android’

android { minSdkVersion 8 }

task print << { println(“Hi!”) }

assemble.dependsOn(print)

Page 88: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Page 89: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Page 90: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) { … } << { println(“Execution”) }

Page 91: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) { … } << { println(“Execution”) }

Page 92: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask << { // Roll my own }

Page 93: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

Files.copy( new File("build.gradle"), new File(“${project.projectDir}/buildCache/build.gradle" + System.currentTimeMillis()))

Page 94: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

Files.copy( new File("build.gradle"), new File(“${project.projectDir}/buildCache/build.gradle" + System.currentTimeMillis()))

Page 95: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

Files.copy( new File("build.gradle"), new File(“${project.projectDir}/buildCache/build.gradle" + System.currentTimeMillis()))

Page 96: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask << { Files.copy( new File("build.gradle"), new File(“${project.projectDir}/buildCache/build.gradle" + System.currentTimeMillis())) }

Page 97: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

TASK

Page 98: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

TASKTASK

TASK

@Input @InputDirectory @InputFile @InputFiles

Page 99: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

TASK

@OutputDirectories @OutputDirectory @OutputFile @OutputFiles

TASK

TASK

TASK

TASK

Page 100: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

TASKTASK

TASK TASK EXECUTED

Page 101: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

TASKTASK

TASK TASK EXECUTED

Page 102: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

TASKTASK

TASK UP-TO-DATE

Page 103: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask { inputs.file new File("build.gradle") // outputs } << { // Java file copy code }

Page 104: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask { inputs.file new File("build.gradle") // outputs } << { // Java file copy code }

Page 105: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask { inputs.file new File("build.gradle"), // outputs } << { // Java file copy code }

Page 106: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task example

HAS NO INPUTS YET, ALWAYS RUNS

Page 107: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy)

COPY TASK HAS EMPTY SET OF THINGS TO COPY

Page 108: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) << {

}

COPY TASK HAS EMPTY SET OF THINGS TO COPY

// CODE WILL NOT EXECUTE

Page 109: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Good

Page 110: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) << { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

BAD

Page 111: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask << { Files.copy( new File("build.gradle"), new File(“${project.projectDir}/buildCache/build.gradle" + System.currentTimeMillis())) }

Weird

Page 112: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line

./gradlew tasks

Page 113: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line output

Build tasks ----------- assemble assembleDebug assembleDebugTest assembleRelease build buildDependents buildNeeded clean

Page 114: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

configuration

apply plugin: ‘android’

android { minSdkVersion 8 }

task print << { println(“Hi!”) }

assemble.dependsOn(print)

apply plugin: ‘android’

android { minSdkVersion 8 }

task print << { println(“Hi!”) }

assemble.dependsOn(print)

not executed

Page 115: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Compile

Dependency Graph

PreBuild Assemble

Page 116: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

call?

Compile Assemble

Page 117: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Compile Assemble

Page 118: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

assemble.dependsOn(task)task.dependsOn(compile)

AssembleCompile

Page 119: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

task.onlyIf { condition }

Page 120: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Compile Task

Dependency GraphCrashlytics Task

Crashlytics Task

Page 121: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Multi-Project Builds

Page 122: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

opensource/library/

day-job/app/

Page 123: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

development/app/library/

Page 124: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line

cd development/app/

Page 125: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line

ant build

Page 126: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

development/app/library/

Page 127: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

App

Project Root Library

Page 128: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

root/app/library/build.gradle

development/

Page 129: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line

cd development/root

Page 130: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line

./gradlew app:assemble

Page 131: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

dependencies { compile project(‘:library’) }

Page 132: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

include ‘library’ include ‘app’

settings.gradle

Page 133: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

opensource/library/

day-job/app/

Page 134: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

AppLibrary

Installs Into Depends

OnLocal Maven Cache

Page 135: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

repositories { mavenLocal() }

Page 136: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

app library

ExecutionC

onfiguration./gradlew customBuild

Tasks Executed

Tasks Executed

Page 137: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

app library Maven Local

ExecutionC

onfigurationEXEC: ./gradlew :library:install

Tasks Executed

Page 138: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

app library Maven Local

ExecutionC

onfiguration

Tasks Executed

EXEC: ./gradlew :app:install

Page 139: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

AppProject Root

Library

Page 140: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

app library

ExecutionC

onfiguration

Tasks Executed

EXEC: ./gradlew :app:install

Tasks Executed

Page 141: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

-P

Page 142: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

./gradlew :app:assemble -PrunOnCi=false

Page 143: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

if (runOnCi) { … }

build.gradle

Page 144: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

App

App2

Project Root

Library

./gradlew :app:assemble -PrunOnCi=false

Page 145: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

app library

ExecutionC

onfiguration

Tasks Executed

EXEC: ./gradlew :app:assemble -PrunOnCi=false

Tasks Executed

app2

Page 146: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

BUILD SUCCESSFUL

Page 147: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

App

App2

Project Root

Library

./gradlew :app2:assemble

Page 148: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

app library

ExecutionC

onfigurationEXEC: ./gradlew :app2:assemble

app2

BUILD FAILED

Page 149: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

BUILD FAILED

Page 150: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

app library

ExecutionC

onfigurationEXEC: ./gradlew :app2:assemble

app2

BUILD FAILED

if (runOnCi)

Page 151: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

if (hasProperty(runOnCi)) { … }

Page 152: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

org.gradle.configureondemand=true

gradle.properties

Page 153: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

app library

ExecutionC

onfigurationEXEC: ./gradlew :app2:assemble

Tasks Executed

app2

Tasks Executed

Page 154: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Code Reuse

Page 155: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Good

Page 156: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Good?

Page 157: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

task copyTask(type: Copy) { from ‘build.gradle’ into ‘buildCache’ rename {it + System.currentTimeMillis()} }

Page 158: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

class CacheBuild extends Copy {

}

Page 159: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

class CacheBuild extends Copy { { … } }

plain ol’ java initializer

Page 160: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

class CacheBuild extends Copy { { from('build.gradle'); into('buildCache'); rename({ it + System.currentTimeMillis() }) } }

Page 161: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

task cache(type:CacheBuild)

Page 162: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

AppProject Root

Library

Page 163: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

App

Project Root

Library

Page 164: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

App

Project Root

Library

Custom Code

Page 165: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

App

Project Root

Library

Page 166: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

App

Project Root

Library

buildsrc/src/main/groovy/CacheBuild.groovy

Custom Code

Page 167: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

App

Project Root

Library

buildsrc/src/main/groovy/CacheBuild.groovy

Page 168: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

App

Project Root

Library

buildsrc/src/main/groovy/CacheBuild.groovy

day-job/app

Page 169: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

AppCustom Task

Installs Into Depends

OnLocal Maven Cache

Page 170: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

assemble.dependsOn(‘cache’)

Page 171: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

apply plugin: 'BuildCache'

Page 172: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

org.gradle.api Interface Project

All Superinterfaces: Comparable<Project>, ExtensionAware, PluginAware

public interface Project extends Comparable<Project>, ExtensionAware, PluginAware

This interface is the main API you use to interact with Gradle from your build file. From a Project, you have programmatic access to all of Gradle's features.

Page 173: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

apply([‘plugin’ : ‘BuildCache’])

Page 174: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

User’s Build Scriptapply plugin: ‘BuildCache’

plugin codevoid apply(Project project)

calls

Page 175: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

class BuildCache implements Plugin<Project> {

void apply(Project project) {

Page 176: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Inject into dependency graph

compile.dependsOn(buildCache)

Page 177: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

buildCache = … android.applicationVariants.all { assemble.dependsOn(buildCache) }

Page 178: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 179: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 180: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

ExampleActivity.onClick()a.b()com.crashlytics.obfuscation.

Page 181: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 182: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 183: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Building on top of Android

Page 184: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Pay attention to Android Gradle updates

Page 185: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

0.3 * System requirements: * Gradle 1.3+ (tested on 1.3/1.4). Will not be compatible with 1.5. An update will be required. * Android Platform Tools 16.0.2+ * New Features: * Renderscript support. * Support for multi resource folders. See 'multires' sample. * PNG crunch is now done incrementally and in parallel. * Support for multi asset folders. * Support for asset folders in Library Projects. * Support for versionName suffix provided by the BuildType. * Testing * Default sourceset for tests now src/instrumentTest (instrumentTest<Name> for flavors) * Instrumentation tests now: * started from "deviceCheck" instead of "check" * run on all connected devices in parallel. * break the build if any test fails. * generate an HTML report for each flavor/project, but also aggregated. * New plugin 'android-reporting' to aggregate android test results across projects. See 'flavorlib' sample. * Improved DSL: * replaced android.target with android.compileSdkVersion to make it less confusing with targetSdkVersion * signing information now a SigningConfig object reusable across BuildType and ProductFlavor * ability to relocate a full sourceSet. See 'migrated' sample. * API to manipulate Build Variants. * Fixes: * Default Java compile target set to 1.6. * Fix generation of R classes in case libraries share same package name as the app project. 0.2 * Fixed support for windows. * Added support for customized sourceset. (http://tools.android.com/tech-docs/new-build-system/using-the-new-build-system#TOC-Working-with-and-Customizing-SourceSets) * Added support for dependency per configuration. * Fixed support for dependency on local jar files. * New samples "migrated" and "flavorlib"

Page 186: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

java.lang.OutOfMemoryError

Resource Resource Resource Resource

Merge Resources TaskAndroid Gradle v0.4

Page 187: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Resource Resource Resource Resource

Merge Resources TaskAndroid Gradle v0.5.4

MergedResource

Page 188: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Use extra properties to configure on a per-flavor

basis

Page 189: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android { productFlavors { paid { ext.crashlyticsEnabled = true } free { ext.crashlyticsEnabled = false } } }

Page 190: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

android.productFlavors.each { ext.crashlyticsEnabled }

Page 191: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

apply plugin: ‘com.android.application’

android { productFlavors { paid { } } }

apply plugin: ‘io.fabric’apply plugin: ‘com.android.application’

android { productFlavors { paid { } } }

apply plugin: ‘io.fabric’apply plugin: ‘io.fabric’

Page 192: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

build.gradle

apply plugin: ‘com.android.application’

android { productFlavors { paid { } } }

android.applicationVariants.all { variant -> // Rename package name }

apply plugin: ‘io.fabric’apply plugin: ‘com.android.application’

android { productFlavors { paid { } } }

apply plugin: ‘io.fabric’apply plugin: ‘io.fabric’

android.applicationVariants.allandroid.applicationVariants.all { variant -> // Rename package name }

Page 193: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

plugin code.groovy

afterEvaluate { // READ PACKAGE NAME }afterEvaluate { // CHANGE PACKAGE NAME }

Page 194: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

apply plugin: ‘com.android.application’

android { productFlavors { paid { } } }

apply plugin: ‘io.fabric’

android.applicationVariants.all { variant -> // Rename package name }

Page 195: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Crashlytics used HttpClient 4.3

Page 196: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Android Gradle used HttpClient 4.1.1

Page 197: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

command line

./gradlew assemble

Page 198: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

[ERROR] Caused by: java.lang.NoSuchMethodError:

org.apache.http.entity.mime.content.StringBody.<init>

Page 199: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Use the Shadow Plugin: Bytecode Manipulation

Page 200: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

apply plugin: ‘shadow’

Page 201: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

org.apache -> com.crashlytics.org.apache

Page 202: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

shadow { relocation { … } }

Page 203: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

shadow { relocation { pattern = 'org.apache' shadedPattern = ‘com.crashlytics’ + pattern } }

Page 204: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 205: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Showed what Gradle is really doing.

• created tasks • made a multi-app project • wrote a plugin

Page 206: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Simple PossiblePossimple

Page 207: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Jake Ouellette @jakeout

Senior Software Engineer Twitter

Page 208: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 209: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

Gradle Plugin Syntax has growing pains

Page 210: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

buildscript { … }

Page 211: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

buildscript { repositories { … } }

Page 212: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

def crashlytics = … buildscript { … }

Page 213: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

No such property: crashlytics

Page 214: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"
Page 215: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

./gradlew assemble -Dcrashlytics=…

Page 216: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

buildscript { repositories { maven { url System.getProperty(“crashlytics”) } } }

repositories { maven { url System.getProperty(“crashlytics”) } }

Page 217: gradle user to addict sf - Meetupfiles.meetup.com/1715787/gradle_user_to_addict.pdf · build.gradle apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.3"

buildScript { ext.crashlytics = … }

buildscript.ext.crashlytics