A Gradle Story

Post on 25-Jan-2017

551 views 0 download

Transcript of A Gradle Story

A Gradle StoryEduardo Bonet

$ whoamiBonet

Control and Automation Engineer

Master Student in Computer Science

Full Stack / Data Scientist Jr

Android Hobbyist

Agenda● What is Gradle?

● Build Types and Variables

● Flavors

● Cool Tasks

Why Gradle?Building and packaging an android app is complicated

Gradle is a build tool powered by Groovy

You CODE configurations

It's magical!

Introducing John

John is a CS student, and his dad has a bakery. He made an app for his dad's bakery and wants to publish it.

John's First Problem

John tested his api calls on his local server during development. He needs to change his client to point to the new production server.

Error Prone!

Gradle Build Variables

John can improve it by moving the variable to build.config

build.gradle

BuildConfig already contains lots of goodies

Installing different versions of the app

build.gradle

Installing different versions of the app

BakeryAPP Identity Crisis

John will now split the app into two versions: free and premium. Should he create a new app and copy/paste code? How will that be maintained, what about new features?

Vanilla or Chocolate? Product Flavors

Flavors - Multiple app versions

build.gradle

Flavors - Multiple app versions

src/ free /java/res/values/strings.xml

src/ pro /java/res/values/strings.xml

Not instead. Flavors WITH BuildTypes! They can be combined!

Why Flavors instead of BuildTypes?

Build Type

Flavor Debug Homolog Release

Free freeDebug freeHomolog freeRelease

Pro proDebug proHomolog proRelease

Customizing Flavors and BuildTypes| -- src| | --- test (java, res, assets)| | --- main (java, res, assets)| | --- free (java, res, assets)| | --- pro (java, res, assets)| | --- debug (java, res, assets)| | --- freeDebug (java, res, assets)

Priority OrderflavorBuild > flavor > build > main

John now for some reason wants to add different behavior to the flavors: all cakes for free version are stored in memory, while only the pro version queries the API.

src/ pro /java/johnsdadbakery/AwesomeCakeRepository.java

src/ free /java/johnsdadbakery/AwesomeCakeRepository.java

Example: Specific Code with DIThe D on SOLID! This is where Dependency Injection shines. John first abstracts the repo and builder into an interface, in the main source set.

src/java/ main /johnsdadbakery/ AwesomeCakeRepository.java

src/java/main/johnsdadbakery/ LocalCakeRepoBuilder.java

src/java/ main /johnsdadbakery/ RetrofitCakeRepoBuilder.java

Example: Specific Code with DIOur injector interface will helps us configure flavor specific behaviour

src/java/main/johnsdadbakery/ InjectorInterface.java

Example: Specific Code with DIFinally, we just need to implement the Injector interface on each flavor:

src/java/ free /johnsdadbakery/Injector.java

Example: Specific Code with DIFinally, we just need to implement the Injector interface on each flavor:

src/java/ pro /johnsdadbakery/Injector.java

Example: Specific Code with DINow we simply ask the injector for the correct CakeRepo Implementation

This is a very naive DI implementation, consider using Dagger2, it is way more powerful

John is tired of typing his Keystore credentials

John hates typing password every time he creates a release version. Android Studio helps with that, but how a CI server would handle it?

Gradle, do the thing!Signing Configs

PASSWORD ON REPO

build.gradle

signing.props

Signing Config - Better

Lost in screenshots

John translated his app to three different languages. And has support for multiple screens. That means every time he publishes a new release he has to generate a LOT of screenshots for the PlayStore.

● Create screenshots with Spoon https://github.com/stanfy/spoon-gradle-plugin● Frame it with https://github.com/chemouna/frame-gradle-plugin● Ta-da!

Another way: http://flavienlaurent.com/blog/2014/12/05/screenshot_automation/

Screenshot ALL THE THINGS

Screenshot ALL THE THINGS

Gradle make a SandwichCool Gradle Plugins

OMG Google Play Services! - Dexcount● https://github.com/mihaip/dex-method-counts● https://github.com/KeepSafe/dexcount-gradle-plugin

And much more!● Slack: https://github.com/Mindera/gradle-slack-plugin● Upload to GooglePlay: https://github.com/Triple-T/gradle-play-publisher● Git: https://github.com/ajoberstar/gradle-git● Upload your lib to maven repos

…..

● Turn on your coffee machine: Not done yet :)● Etc etc etc

What did John learn today?

● Gradle is a build tool written that runs on Groovy, sky is the limit

Know your build tool, it will help you a lot

Use Build Types to configure Environments

Use Flavors to create App Versions

Great Plugins out there to make you more productive and happy!