Slide 1

Slide 1 text

GRADLE WITH KOTLIN Manpreet Android @ Hotstar @manpreetsgarha

Slide 2

Slide 2 text

Introduction to Gradle • Build automation system • Default for Android projects • Built-in dependency management

Slide 3

Slide 3 text

Groovy based DSL apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { compileSdkVersion 28 defaultConfig { applicationId "com.manpreets.gdgdevfest" minSdkVersion 15 targetSdkVersion 28 versionCode 1 versionName "1.0" } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" }

Slide 4

Slide 4 text

Why Groovy for Gradle? • Dynamic language • Beautiful DSL • Java byte-code

Slide 5

Slide 5 text

Let’s look into some groovy void sum(a, b) { return a + b } sum(6,7) sum 6,7

Slide 6

Slide 6 text

[firstName:'Manpreet', lastName:'Singh', age:25] firstName :'Manpreet'

Slide 7

Slide 7 text

apply plugin: 'com.android.application' apply plugin: 'kotlin-android' project.apply(["plugin": "com.android.application"]) project.apply(["plugin": "kotlin-android"])

Slide 8

Slide 8 text

android { compileSdkVersion 28 defaultConfig { applicationId "com.manpreets.gdgdevfest" minSdkVersion 15 targetSdkVersion 28 versionCode 1 versionName "1.0" } } android({ BaseExtension be -> be.compileSdkVersion(28) be.defaultConfig({ DefaultConfig df -> df.applicationId("com.manpreets.gdgdevfest") df.minSdkVersion(15) df.targetSdkVersion(28) df.versionCode(1) df.versionName("1.0") }) })

Slide 9

Slide 9 text

What’s missing? • Documentation and navigation sources • Feedback loop in the IDE • Auto-complete! • Understanding of groovy • Extension of build logic

Slide 10

Slide 10 text

plugins { id("com.android.application") id("kotlin-android") } android { compileSdkVersion(28) defaultConfig { applicationId = "com.manpreets.gdgdevfest" minSdkVersion(15) targetSdkVersion(28) versionCode = 1 versionName = "1.0" } } dependencies { implementation(fileTree(mapOf("dir" to "libs", "include" to mutableListOf("*.jar")))) implementation(kotlin("stdlib-jdk7", KotlinCompilerVersion.VERSION)) } gradle/Kotlin-DSL

Slide 11

Slide 11 text

How? • Higher order functions • Use of lambdas outside of method parenthesis • Extension function • Operator overloading

Slide 12

Slide 12 text

android { compileSdkVersion = 28 defaultConfig { applicationId = "com.manpreets.gdgdevfest" ndkOptions { abiFilter = "armeabi-v7a" } } }

Slide 13

Slide 13 text

class BaseAndroid(var compileSdkVersion: Int = 23, var defaultConfig: DefaultConfig = DefaultConfig()) android { compileSdkVersion = 28 .. } fun android(android: BaseAndroid.() -> Unit) = BaseAndroid().apply(android)

Slide 14

Slide 14 text

android { compileSdkVersion = 28 defaultConfig { applicationId = "com.manpreets.gdgdevfest" .. } } class BaseAndroid(var compileSdkVersion: Int = 23, var defaultConfig: DefaultConfig = DefaultConfig())

Slide 15

Slide 15 text

class HelloGDG { operator fun invoke(msg: String) { print(msg) } } var helloGDG = HelloGDG() helloGDG("Hello")

Slide 16

Slide 16 text

class BaseAndroid(var compileSdkVersion: Int = 23, var defaultConfig: DefaultConfig = DefaultConfig()) android { .. defaultConfig { applicationId = "com.manpreets.gdgdevfest" .. } } class DefaultConfig(var applicationId: String = "default", var ndkOptions: NdkOptions = NdkOptions()) { operator fun invoke(defaultConfig: DefaultConfig.() -> Unit) { this.apply(defaultConfig) } }

Slide 17

Slide 17 text

class NdkOptions(var abiFilter: String = "") { operator fun invoke(f: NdkOptions.() -> Unit) { this.apply(f) } } class DefaultConfig(var applicationId: String = "default", var ndkOptions: NdkOptions = NdkOptions()) { operator fun invoke(defaultConfig: DefaultConfig.() -> Unit) { this.apply(defaultConfig) } } defaultConfig { applicationId = "com.manpreets.gdgdevfest" ndkOptions { abiFilter = "armeabi-v7a" } }

Slide 18

Slide 18 text

android { compileSdkVersion = 28 defaultConfig { applicationId = "com.manpreets.gdgdevfest" ndkOptions { abiFilter = "armeabi-v7a" } } } class BaseAndroid(var compileSdkVersion: Int = 23, var defaultConfig: DefaultConfig = DefaultConfig()) class DefaultConfig(var applicationId: String = "default", var ndkOptions: NdkOptions = NdkOptions()) class NdkOptions(var abiFilter: String = "")

Slide 19

Slide 19 text

Let’s convert all our .gradle files to .gradle.kts [DEMO]

Slide 20

Slide 20 text

Summary • Use buildSrc • Use Action • Legacy support • Not stable yet • Slower • https://github.com/manpreetsgarha/gdgdevfest • https://github.com/gradle/kotlin-dsl • https://guides.gradle.org/migrating-build-logic-from-groovy-to-kotlin • https://docs.gradle.org/5.0-milestone-1/userguide/userguide.html

Slide 21

Slide 21 text

Questions? twitter.com/manpreetsgarha