Configuring Gradle with "gradle.properties"
Tags: java, kotlin, android, hacktoberfest
Published: 2019-09-26 14:35:06

Using https://gradle.org as your build tool? Read on. 

I found the `gradle.properties` file a nice part of Gradle.

What is hard is to find an overview of this information: you can create your own settings, Gradle has its own, Kotlin its own, Android its own, ...

So I thought I would provide an overview of all of that.

You should not add a setting before you have read the docs to understand what it does. Which is why I added every time the link to the documentation.

# The file `gradle.properties`

The friendly Gradle docs inform you that 

> In Gradle, properties can be defined in the build script, in a gradle.properties file or as parameters on the command line.
> It’s common to declare properties on the command line for ad-hoc scenarios. For example you may want to pass in a specific property value to control runtime behavior just for this one invocation of the build. Properties in a build script can easily become a maintenance headache and convolute the build script logic. The gradle.properties helps with keeping properties separate from the build script and should be explored as viable option. It’s a good location for placing properties that control the build environment.
> https://docs.gradle.org/current/userguide/organizing_gradle_projects.html#declare_properties_in_gradle_properties_file


# Putting there your own settings

First you can use it to put your own settings. For example, if you have an Android project, you can put there

```properties
## gradle.properties

# Common Android settings
android.compileSdkVersion=28
android.applicationId=com.example
android.targetSdkVersion=28
android.minSdkVersion=21
android.versionCode=2
android.versionName=1.2
```

then you can reuse the same `app/build.gradle` snippet all the time

```groovy
android {
    compileSdkVersion rootProject.findProperty("android.compileSdkVersion") as Integer

    defaultConfig {
        targetSdkVersion findProperty("android.targetSdkVersion") as Integer
        minSdkVersion findProperty("android.minSdkVersion") as Integer
        applicationId findProperty("android.applicationId")
        versionCode findProperty("android.minSdkVersion") as Integer
        versionName findProperty("android.versionName")
    }
}
```

# Putting your dependencies versions

This is what my Gradle plugin automatically does for you:

```properties
## gradle.properties

# Dependencies and Plugin versions with their available updates
# Generated by $ ./gradlew refreshVersions
# You can edit the rest of the file, it will be kept intact
# See https://github.com/jmfayard/buildSrcVersions/issues/77
plugin.com.github.ben-manes.versions=0.25.0
plugin.de.fayard.buildSrcVersions=0.6.1
version.com.android.tools.build..gradle=3.5.0
version.play-services-location=17.0.0
version.bottom-navigation-bar=2.1.0
version.lifecycle-extensions=2.0.0
#                # available=2.1.0
version.org.jetbrains.kotlin=1.3.31
#                # available=1.3.50
version.appcompat=1.1.0-rc01
#     # available=1.1.0
version.cardview=1.0.0
version.core-ktx=1.0.2
#    # available=1.1.0
# ....
```

Read the docs at [gradle :refreshVersions" generates gradle.properties with versions and available updates](https://github.com/jmfayard/buildSrcVersions/issues/77) 

# Gradle settings

The top two are especially great to improve your build performance.

```properties
org.gradle.caching=true
org.gradle.parallel=true
org.gradle.caching.debug=false
org.gradle.configureondemand=false
org.gradle.daemon.idletimeout= 10800000
org.gradle.console=auto
#org.gradle.java.home=(path to JDK home)
#org.gradle.warning.mode=(all,none,summary)
#org.gradle.workers.max=(max # of worker processes)
# org.gradle.priority=(low,normal)
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
// https://docs.gradle.org/current/userguide/build_environment.html#sec:configuring_jvm_memory
```

Read the docs at https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties

# Kotlin settings

```properties
kotlin.code.style=official
kotlin.caching.enabled=true
kotlin.incremental=true
kotlin.incremental.js=true
```

Read the docs at  https://kotlinlang.org/docs/reference/using-gradle.html 


```properties
kapt.use.worker.api=true
kapt.incremental.apt=true
```

Read the docs at https://kotlinlang.org/docs/reference/kapt.html

# Android settings

```properties
studio.projectview=true
```

If you think like me that the `Android` view is worse in every respect than the `Project` view and needs to go


```properties
android.enableJetifier=true
android.useAndroidX=true
```

Read the docs at https://developer.android.com/jetpack/androidx


```properties
android.databinding.incremental=true
```

Read the docs at https://developer.android.com/topic/libraries/data-binding/start

```properties
android.enableSeparateAnnotationProcessing=true
```

Read the docs at https://developer.android.com/studio/build/optimize-your-build



# Other Android flags

```
android.enableR8.fullMode=true
android.enableR8.libraries = true
android.enableR8 = true
android.debug.obsoleteApi=true
android.enableBuildCache=true
android.enableGradleWorkers=true
android.useMinimalKeepRules=true
```

Check the code-source at 
https://android.googlesource.com/platform/tools/base/+/mirror-goog-studio-master-dev/build-system/gradle-core/src/main/java/com/android/build/gradle/options/BooleanOption.kt