Slide 1

Slide 1 text

Level Up with Android Build Variants

Slide 2

Slide 2 text

Why do I care? ● It’d be nice to build multiple variants of an Android app from a single code base ● Common variants include: ○ debug/release ○ free/paid ○ dev/staging/production

Slide 3

Slide 3 text

With Eclipse and Ant ● Code base contained in library project ● Needed an additional project for each variant which referenced library project

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

With Android Studio and Gradle ● All contained in single project ● Define Build Types and Product Flavours in build.gradle file ● Create src directories to hold code specific to each build type/flavour

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Build Types ● Define how to build and package your app ● debug and release build types created by default ● Can create your own

Slide 8

Slide 8 text

signingConfigs { release { storeFile file( 'release.keystore' ) storePassword 'verysecurepassw0rd' keyAlias 'release' keyPassword 'verysecurepassw0rd' } } buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile( 'proguard-android.txt' ), 'proguard-rules.pro' signingConfig signingConfigs.release } debug{ applicationIdSuffix ".debug" signingConfig null } }

Slide 9

Slide 9 text

Product Flavours ● Provide alternative code, resources or configuration ● Examples: ○ Different API endpoints for dev/staging/production environment ○ Free/paid version

Slide 10

Slide 10 text

Free / Paid ● Provide alternative resources and code by creating flavour directory ● Gradle creates combination of each Build Type and Product Flavour

Slide 11

Slide 11 text

productFlavors{ free{ applicationId "com.physphil.android.sandbox.free" } paid{ applicationId "com.physphil.android.sandbox.pro" } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.1' compile 'de.greenrobot:eventbus:2.4.0' // Only full version requires network calls paidCompile 'com.squareup.retrofit:retrofit:1.9.0' paidCompile 'com.squareup.okhttp:okhttp:2.2.0' }

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

Free / Paid

Slide 14

Slide 14 text

Dev / Staging / Production ● Define flavour for each server environment ● Store API base URL in a Config class ● Create directory in src for each flavour, which contains an instance of Config

Slide 15

Slide 15 text

buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile( 'proguard-android.txt' ), 'proguard-rules.pro' signingConfig signingConfigs.release } debug { applicationIdSuffix ".debug" signingConfig null } } productFlavors { dev staging production }

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

That’s Not All! ● Modify more build parameters ● Include libraries, code, Activities etc only when required ● Lots of examples in official docs

Slide 18

Slide 18 text

Additional Resources ● http://tools.android.com/tech-docs/new-build- system/user-guide ● https://developer.android. com/tools/building/configuring-gradle.html ● http://www.vogella. com/tutorials/AndroidBuild/article.html

Slide 19

Slide 19 text

Questions?