BUILDING ANDROID APPSBUILDING ANDROID APPS
WITH GRADLEWITH GRADLE
GREACH 2015, Madrid
René Gröschke
Principal Engineer Gradleware
INTRO, DEMO & FORECASTINTRO, DEMO & FORECAST
WHY A NEW BUILDWHY A NEW BUILD
SYSTEM?SYSTEM?
GRADLE 2.3GRADLE 2.3
RELEASED 16TH FEBRUARY 2015RELEASED 16TH FEBRUARY 2015
OLD ANDROID BUILDSOLD ANDROID BUILDS
Two (official) build mechanism
ADT (Eclipse based)
Ant
Maven
Customization?
Nothing in ADT
Manually hacking xml in ant scripts
REQUIREMENTS OF THEREQUIREMENTS OF THE
NEW BUILD SYSTEMNEW BUILD SYSTEM
Use same system for
CommandLine
CI Server
IDE
Support for application/library variants
Dependency Management
Provide a plugin ecosystem
WHY GRADLEWHY GRADLE
Allows custom DSL to express build logic
Very flexible for customization
Well integrated with CI ecosystem (Ant, Maven, Ivy, CI
server)
Allow User / 3Party tools to configure, extend and
customize the build process
Tooling API for IDE integration
...
GRADLE IN A NUTSHELLGRADLE IN A NUTSHELL
apply plugin:'java'
version = file("version.txt").text
task helloWorld << {
println "Hello World - version '$version'!"
}
THE ANDROID GRADLE PLUGINTHE ANDROID GRADLE PLUGIN
MINIMAL ANDROID BUILDMINIMAL ANDROID BUILD
plugins {
id 'com.android.application' version '1.1.+'
}
android {
compileSdkVersion 22
buildToolsVersion '22.0.1'
}
>gradle check assemble
>gradle build
THE ANDROID GRADLE PLUGINTHE ANDROID GRADLE PLUGIN
BASIC BUILD CUSTOMIZATIONBASIC BUILD CUSTOMIZATION
android {
compileSdkVersion 22
buildToolsVersion '22.0.1'
defaultConfig {
versionCode 12
versionName "2.0"
minSdkVersion 19
targetSdkVersion 22
multiDexEnabled = true
}
}
THE ANDROID GRADLE PLUGINTHE ANDROID GRADLE PLUGIN
REMEMBER, IT'S GROOVY!REMEMBER, IT'S GROOVY!
def calculateVersionName() {
...
}
android {
compileSdkVersion 22
buildToolsVersion '22.0.1'
defaultConfig {
versionName calculateVersionName()
}
}
BUILD TYPESBUILD TYPES
"controls how an app is built"
Customize app parameters
debuggable flag
native debug compilation flag
package suffix
debug signing
proguard options
2 default types (debug + release)
Source code + resources overlay
Custom dependencies
PRODUCT FLAVORSPRODUCT FLAVORS
"a way to generate several versions of the same app"
Customize app parameters
package name
min/targetSdkVersion
versionCodeName
signing info
Source code + resources overlay
Custom dependencies
BUILD VARIANTSBUILD VARIANTS
"a variant is always a flavor + a type"
debug release
free free-debug free-release
payed payed-debug payed-release
BUILD VARIANTS IIBUILD VARIANTS II
PRODUCT FLAVOR GROUPSPRODUCT FLAVOR GROUPS
debug release
free x86 free-x86-debug free-x86-release
ARM free-ARM-debug free-ARM-release
payed x86 payed-x86-debug payed-x86-release
ARM payed-ARM-debug payed-ARM-release
FLAVOR GROUPSFLAVOR GROUPS
flavorDimensions "group1", "group2"
productFlavors {
arm {
flavorDimension "group1"
}
x86 {
flavorDimension "group1"
}
free {
flavorDimension "group2"
}
pro {
flavorDimension "group2"
}
}
SOURCE CODE + RESOURCES OVERLAYSOURCE CODE + RESOURCES OVERLAY
~/dev/androidApp/src>tree
|____main
| |____java
| |____res
|____androidTest
| |____java
| |____res
|____free
| |____java
| |____res
|____debug
| |____java
~/dev/androidApp/src>
Build Type > Product Flavor > main
DEMO IDEMO I
VARIANTS IN ACTIONVARIANTS IN ACTION
BUILD CUSTOMIZATION IBUILD CUSTOMIZATION I
DEX CONFIGURATIONDEX CONFIGURATION
android {
dexOptions {
incremental true
preDexLibraries = false
jumboMode = false
}
}
BUILD CUSTOMIZATION IIBUILD CUSTOMIZATION II
AAPT CONFIGURATIONAAPT CONFIGURATION
android {
aaptOptions {
noCompress 'foo', 'bar'
ignoreAssetsPattern "!.svn:!.git:!.ds_store:!*.scc"
}
}
BUILD CUSTOMIZATION IIIBUILD CUSTOMIZATION III
AND MOREAND MORE
lint
java compile options
proguard
DEMO IIDEMO II
MANIPULATING TASKSMANIPULATING TASKS
TESTINGTESTING
no separate test project needed
variant aware tests
run against (all) connected devices
experimental unit test support (android build tools 1.1)
android {
// ...
testOptions {
unitTests.returnDefaultValues = true
}
}
PLENTY OF MORE THINGSPLENTY OF MORE THINGS
android libraries (aar)
vivid plugin ecosystem
crashlytics
roboelectrics
testfairy
instabug
...
UNDER CONSTRUCTIONUNDER CONSTRUCTION
NDK support
variant aware dependency management
significant performance improvements
LINKS AND POINTERSLINKS AND POINTERS
http://tools.android.com/tech-docs/new-build-
system/user-guide
https://groups.google.com/forum/#!forum/adt-dev
gradle.org
gradleware.com
https://github.com/breskeby/android-demo-app
Q&AQ&A
¡MUCHAS¡MUCHAS
GRACIAS!GRACIAS!
! @breskeby
" github.com/breskeby
# rene.groeschke@gradleware.com

Building android apps with Gradle (GREACH 2015)

  • 2.
    BUILDING ANDROID APPSBUILDINGANDROID APPS WITH GRADLEWITH GRADLE GREACH 2015, Madrid René Gröschke Principal Engineer Gradleware
  • 3.
    INTRO, DEMO &FORECASTINTRO, DEMO & FORECAST
  • 4.
    WHY A NEWBUILDWHY A NEW BUILD SYSTEM?SYSTEM?
  • 5.
    GRADLE 2.3GRADLE 2.3 RELEASED16TH FEBRUARY 2015RELEASED 16TH FEBRUARY 2015
  • 6.
    OLD ANDROID BUILDSOLDANDROID BUILDS Two (official) build mechanism ADT (Eclipse based) Ant Maven Customization? Nothing in ADT Manually hacking xml in ant scripts
  • 7.
    REQUIREMENTS OF THEREQUIREMENTSOF THE NEW BUILD SYSTEMNEW BUILD SYSTEM Use same system for CommandLine CI Server IDE Support for application/library variants Dependency Management Provide a plugin ecosystem
  • 8.
    WHY GRADLEWHY GRADLE Allowscustom DSL to express build logic Very flexible for customization Well integrated with CI ecosystem (Ant, Maven, Ivy, CI server) Allow User / 3Party tools to configure, extend and customize the build process Tooling API for IDE integration ...
  • 9.
    GRADLE IN ANUTSHELLGRADLE IN A NUTSHELL apply plugin:'java' version = file("version.txt").text task helloWorld << { println "Hello World - version '$version'!" }
  • 10.
    THE ANDROID GRADLEPLUGINTHE ANDROID GRADLE PLUGIN MINIMAL ANDROID BUILDMINIMAL ANDROID BUILD plugins { id 'com.android.application' version '1.1.+' } android { compileSdkVersion 22 buildToolsVersion '22.0.1' } >gradle check assemble >gradle build
  • 11.
    THE ANDROID GRADLEPLUGINTHE ANDROID GRADLE PLUGIN BASIC BUILD CUSTOMIZATIONBASIC BUILD CUSTOMIZATION android { compileSdkVersion 22 buildToolsVersion '22.0.1' defaultConfig { versionCode 12 versionName "2.0" minSdkVersion 19 targetSdkVersion 22 multiDexEnabled = true } }
  • 12.
    THE ANDROID GRADLEPLUGINTHE ANDROID GRADLE PLUGIN REMEMBER, IT'S GROOVY!REMEMBER, IT'S GROOVY! def calculateVersionName() { ... } android { compileSdkVersion 22 buildToolsVersion '22.0.1' defaultConfig { versionName calculateVersionName() } }
  • 13.
    BUILD TYPESBUILD TYPES "controlshow an app is built" Customize app parameters debuggable flag native debug compilation flag package suffix debug signing proguard options 2 default types (debug + release) Source code + resources overlay Custom dependencies
  • 14.
    PRODUCT FLAVORSPRODUCT FLAVORS "away to generate several versions of the same app" Customize app parameters package name min/targetSdkVersion versionCodeName signing info Source code + resources overlay Custom dependencies
  • 15.
    BUILD VARIANTSBUILD VARIANTS "avariant is always a flavor + a type" debug release free free-debug free-release payed payed-debug payed-release
  • 16.
    BUILD VARIANTS IIBUILDVARIANTS II PRODUCT FLAVOR GROUPSPRODUCT FLAVOR GROUPS debug release free x86 free-x86-debug free-x86-release ARM free-ARM-debug free-ARM-release payed x86 payed-x86-debug payed-x86-release ARM payed-ARM-debug payed-ARM-release
  • 17.
    FLAVOR GROUPSFLAVOR GROUPS flavorDimensions"group1", "group2" productFlavors { arm { flavorDimension "group1" } x86 { flavorDimension "group1" } free { flavorDimension "group2" } pro { flavorDimension "group2" } }
  • 18.
    SOURCE CODE +RESOURCES OVERLAYSOURCE CODE + RESOURCES OVERLAY ~/dev/androidApp/src>tree |____main | |____java | |____res |____androidTest | |____java | |____res |____free | |____java | |____res |____debug | |____java ~/dev/androidApp/src> Build Type > Product Flavor > main
  • 19.
    DEMO IDEMO I VARIANTSIN ACTIONVARIANTS IN ACTION
  • 20.
    BUILD CUSTOMIZATION IBUILDCUSTOMIZATION I DEX CONFIGURATIONDEX CONFIGURATION android { dexOptions { incremental true preDexLibraries = false jumboMode = false } }
  • 21.
    BUILD CUSTOMIZATION IIBUILDCUSTOMIZATION II AAPT CONFIGURATIONAAPT CONFIGURATION android { aaptOptions { noCompress 'foo', 'bar' ignoreAssetsPattern "!.svn:!.git:!.ds_store:!*.scc" } }
  • 22.
    BUILD CUSTOMIZATION IIIBUILDCUSTOMIZATION III AND MOREAND MORE lint java compile options proguard
  • 23.
    DEMO IIDEMO II MANIPULATINGTASKSMANIPULATING TASKS
  • 24.
    TESTINGTESTING no separate testproject needed variant aware tests run against (all) connected devices experimental unit test support (android build tools 1.1) android { // ... testOptions { unitTests.returnDefaultValues = true } }
  • 25.
    PLENTY OF MORETHINGSPLENTY OF MORE THINGS android libraries (aar) vivid plugin ecosystem crashlytics roboelectrics testfairy instabug ...
  • 26.
    UNDER CONSTRUCTIONUNDER CONSTRUCTION NDKsupport variant aware dependency management significant performance improvements
  • 27.
    LINKS AND POINTERSLINKSAND POINTERS http://tools.android.com/tech-docs/new-build- system/user-guide https://groups.google.com/forum/#!forum/adt-dev gradle.org gradleware.com https://github.com/breskeby/android-demo-app
  • 28.
  • 30.