a gradle story

51
A Gradle Story Eduardo Bonet

Upload: eduardo-felipe-ewert-bonet

Post on 25-Jan-2017

551 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: A Gradle Story

A Gradle StoryEduardo Bonet

Page 2: A Gradle Story

$ whoamiBonet

Control and Automation Engineer

Master Student in Computer Science

Full Stack / Data Scientist Jr

Android Hobbyist

Page 3: A Gradle Story

Agenda● What is Gradle?

● Build Types and Variables

● Flavors

● Cool Tasks

Page 4: A Gradle Story

Why Gradle?Building and packaging an android app is complicated

Gradle is a build tool powered by Groovy

You CODE configurations

It's magical!

Page 5: A Gradle Story

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.

Page 6: A Gradle Story

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.

Page 7: A Gradle Story
Page 8: A Gradle Story
Page 9: A Gradle Story

Error Prone!

Page 10: A Gradle Story

Gradle Build Variables

Page 11: A Gradle Story

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

build.gradle

Page 12: A Gradle Story
Page 13: A Gradle Story

BuildConfig already contains lots of goodies

Page 14: A Gradle Story

Installing different versions of the app

build.gradle

Page 15: A Gradle Story

Installing different versions of the app

Page 16: A Gradle Story

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?

Page 17: A Gradle Story

Vanilla or Chocolate? Product Flavors

Page 18: A Gradle Story

Flavors - Multiple app versions

build.gradle

Page 19: A Gradle Story

Flavors - Multiple app versions

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

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

Page 20: A Gradle Story

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

Page 21: A Gradle Story

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

Page 22: A Gradle Story

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.

Page 23: A Gradle Story
Page 24: A Gradle Story
Page 25: A Gradle Story
Page 26: A Gradle Story

src/ pro /java/johnsdadbakery/AwesomeCakeRepository.java

Page 27: A Gradle Story

src/ free /java/johnsdadbakery/AwesomeCakeRepository.java

Page 28: A Gradle Story

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

Page 29: A Gradle Story

src/java/main/johnsdadbakery/ LocalCakeRepoBuilder.java

Page 30: A Gradle Story

src/java/ main /johnsdadbakery/ RetrofitCakeRepoBuilder.java

Page 31: A Gradle Story

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

src/java/main/johnsdadbakery/ InjectorInterface.java

Page 32: A Gradle Story

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

src/java/ free /johnsdadbakery/Injector.java

Page 33: A Gradle Story

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

src/java/ pro /johnsdadbakery/Injector.java

Page 34: A Gradle Story

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

Page 35: A Gradle Story

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?

Page 36: A Gradle Story

Gradle, do the thing!Signing Configs

Page 37: A Gradle Story
Page 38: A Gradle Story

PASSWORD ON REPO

Page 39: A Gradle Story

build.gradle

signing.props

Signing Config - Better

Page 40: A Gradle Story

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.

Page 41: A Gradle Story

● 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

Page 42: A Gradle Story

Screenshot ALL THE THINGS

Page 43: A Gradle Story

Gradle make a SandwichCool Gradle Plugins

Page 45: A Gradle Story

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

Page 47: A Gradle Story

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

Page 48: A Gradle Story

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!

Page 50: A Gradle Story