Hands on the Gradle


Published on

A talk I did on the DroidCon 2011 barcamp, it's on Gradle and its Android plug-in

  • Be the first to comment

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Hands on the Gradle

  1. 1. Hands on the Gradle Painless Android builds © 2011 Matthias Käppler Qype GmbH S
  2. 2. What is Gradle?S  Gradle is a task based build system. From files and configuration it assembles build artifacts.S  Gradle is flexible. It is not bound to any specific process or technology.S  Gradle uses a Groovy based DSL to write configuration. This makes it easy to read and write Gradle scripts.
  3. 3. The Gradle manifestoS  „Build scripts are code.“S  Don‘t expect, allow.S  Don‘t re-invent, re-use.S  Don‘t inherit, inject.S  Scale to the complexity of a problem. – „Make the impossible possible, the possible easy, and the easy elegant.“
  4. 4. Gradle vs. Maven<build>
 <echo message="what’s with the bloat?" />
  5. 5. Gradle vs. Maven (cont.) println "dunno, must be a Maven thing."
  6. 6. Gradle vs. Maven (cont.)S  Maven is declarative. Gradle is imperative.S  Maven is verbose. Gradle is concise.S  Maven assumes Maven. Gradle doesn‘t.S  Maven scales poorly to simple problems. Gradle scales with the complexity of a problem.
  7. 7. Gradle vs. Maven (cont.)S  Maven has a rich plug-in ecosystem. Gradle still needs to catch-up here.S  Maven has very good IDE support. Gradle has... IDE support.S  Maven has project archetypes. Gradle doesn‘t.
  8. 8. How is Gradle used?$ls
build/ build.gradle ... ... $gradle tasks $gradle clean build $gradle androidInstall androidInstrument
  9. 9. build.gradle env = System.getenv() dependsOnChildren() apply from: ‘shared.gradle allprojects {
 apply plugin: java
} task hello << {
 println ‘hello from Gradle‘
  10. 10. Demo Move along, nothing to see here.
  11. 11. More about tasksS  There are different ways how tasks can be used or exposed in a build script: 1 – by writing them 2 – through project.ant 3 – by applying a plug-in
  12. 12. Writing tasks task hello << {
 4.times { println ‘hello from Gradle‘ }

hello.dependsOn initLang

hello.someProperty = 1
  13. 13. Writing tasks (cont.) project.task(‘hello‘, dependsOn: ‘initLang‘)

greeter = { println it }

hello.doLast greeter.curry(‘hello from Gradle‘)
  14. 14. Ant tasksS  Ant tasks are first class citizens in Gradle. You access them through Groovy‘s AntBuilder DSL.
myProp = ant.properties["my.prop"]

ant.copy {
 from zipTree("/path/to/lib.jar")
 into "$buildDir/extracted-classes"
 exclude "com.example/**"
  15. 15. Plug-ins S  Most of Gradle‘s functionality comes from plug-ins. This helps in keeping the core Gradle APIs lean and clean.
 apply plugin: java
 apply plugin: maven


 $gradle clean install
  16. 16. Plug-ins (cont.) S  Writing Gradle plug-ins is very simple. Check this out.
 class MyPlugin implements Plugin<Project> {
 def apply(Project project) {
 project.task(‘hello‘) << {
 println ‘hello, people‘
  17. 17. Dependencies S  Gradle doesn‘t define ist own dependency management system. Instead, it builds on Apache Ivy.
repositories {
 mavenRepo urls: "http://my.repo.com"
 flatDir dirs: "libs"
  18. 18. Dependencies (cont.) S  Dependencies are grouped into configurations. A configuration is simply a set of files bound to a name.
dependencies {
 compile "commons-lang:commons-lang:2.5"
 compile fileTree(dir: "libs", include: "*.jar")
 testCompile "junit:junit:4.8.2"
  19. 19. Android S  There‘s a Gradle plug-in for Android. 
  20. 20. Setting it up S  Now:
 buildscript {
 repositories {
 mavenRepo(urls: http://jvoegele.com/maven2/‘)
 dependencies {
 classpath com.jvoegele.gradle.plugins:android-plugin:0.9.8‘
 apply plugin: com.jvoegele.gradle.plugins.android.AndroidPlugin S  Soon:
 apply plugin: android
  21. 21. What‘s in store S  The plug-in adds the following tasks: S  :androidProcessResources S  :androidPackage S  :androidInstall S  :androidInstrument S  [:proguard] 
 $gradle clean andInstall :test-proj:andInstr
  22. 22. Instrumentation tests androidInstrument {

 runners {

 run testpackage: "unit", with: "com.my.UnitTestRunner", name: "instrumentation-unit-tests"

 run annotation: "android.test.suitebuilder.annotation.Smoke"

 run with: "com.my.OtherTestRunner”, options: "…”


  23. 23. Thanks Thanks for listening!
  24. 24. Android in Practice Charlie Collins, Michael Galpin, Matthias Käppler •  Real world practical recipes •  Focus on intermediate to professional developers •  Two chapters on testing and build automation Summer 2011 MEAP edition available http://manning.com/collins