a gradle story
TRANSCRIPT
![Page 1: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/1.jpg)
A Gradle StoryEduardo Bonet
![Page 2: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/2.jpg)
$ whoamiBonet
Control and Automation Engineer
Master Student in Computer Science
Full Stack / Data Scientist Jr
Android Hobbyist
![Page 3: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/3.jpg)
Agenda● What is Gradle?
● Build Types and Variables
● Flavors
● Cool Tasks
![Page 4: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/4.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/5.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/6.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/7.jpg)
![Page 8: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/8.jpg)
![Page 9: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/9.jpg)
Error Prone!
![Page 10: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/10.jpg)
Gradle Build Variables
![Page 11: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/11.jpg)
John can improve it by moving the variable to build.config
build.gradle
![Page 12: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/12.jpg)
![Page 13: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/13.jpg)
BuildConfig already contains lots of goodies
![Page 14: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/14.jpg)
Installing different versions of the app
build.gradle
![Page 15: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/15.jpg)
Installing different versions of the app
![Page 16: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/16.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/17.jpg)
Vanilla or Chocolate? Product Flavors
![Page 18: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/18.jpg)
Flavors - Multiple app versions
build.gradle
![Page 19: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/19.jpg)
Flavors - Multiple app versions
src/ free /java/res/values/strings.xml
src/ pro /java/res/values/strings.xml
![Page 20: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/20.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/21.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/22.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/23.jpg)
![Page 24: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/24.jpg)
![Page 25: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/25.jpg)
![Page 26: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/26.jpg)
src/ pro /java/johnsdadbakery/AwesomeCakeRepository.java
![Page 27: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/27.jpg)
src/ free /java/johnsdadbakery/AwesomeCakeRepository.java
![Page 28: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/28.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/29.jpg)
src/java/main/johnsdadbakery/ LocalCakeRepoBuilder.java
![Page 30: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/30.jpg)
src/java/ main /johnsdadbakery/ RetrofitCakeRepoBuilder.java
![Page 31: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/31.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/32.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/33.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/34.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/35.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/36.jpg)
Gradle, do the thing!Signing Configs
![Page 37: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/37.jpg)
![Page 38: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/38.jpg)
PASSWORD ON REPO
![Page 39: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/39.jpg)
build.gradle
signing.props
Signing Config - Better
![Page 40: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/40.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/41.jpg)
● 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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/42.jpg)
Screenshot ALL THE THINGS
![Page 43: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/43.jpg)
Gradle make a SandwichCool Gradle Plugins
![Page 44: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/44.jpg)
Am I Pretty? CheckStylehttp://blog.jessitron.com/2012/07/using-checkstyle-in-gradle.html
http://checkstyle.sourceforge.net/config.html
http://www.slideshare.net/marcprengemann/better-code-through-lint-and-checkstyle
![Page 45: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/45.jpg)
OMG Google Play Services! - Dexcount● https://github.com/mihaip/dex-method-counts● https://github.com/KeepSafe/dexcount-gradle-plugin
![Page 46: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/46.jpg)
Retrolambda - A great release task
![Page 47: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/47.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/48.jpg)
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 49: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/49.jpg)
See also● http://blog.brainattica.com/how-to-work-with-flavours-on-android/
● http://tools.android.com/tech-docs/new-build-system/user-guide
● http://gradle.org/
● http://gradleplease.appspot.com/
![Page 50: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/50.jpg)
![Page 51: A Gradle Story](https://reader031.vdocuments.site/reader031/viewer/2022021417/5888d5761a28aba1058b56b5/html5/thumbnails/51.jpg)
Thank you
github.com/ebonetlinkedin.com/in/eduardobonet