In Half 1 of this tutorial, you realized learn and construct Gradle recordsdata and handle dependencies in a number of methods. On this half, you’ll find out about barely extra complicated elements of Gradle. By the top, you’ll have the ability to:
- Signal your releases and have completely different construct sorts.
- Create Gradle duties and plugins.
- Create construct flavors for revenue.
Getting Began
Obtain the starter venture by clicking the Obtain Supplies hyperlink on the prime or backside of the tutorial. You’ll decide up the place you left off in Half 1.
This a part of the tutorial will deal with use Kotlin script, because it’s now the popular method of writing Gradle recordsdata. Nonetheless, each little bit of Kotlin script code may have its Groovy equal so it’s also possible to find out about it. If the choice Groovy model doesn’t exist, you possibly can assume that the precise little bit of code you’re is similar for each instances.
Getting Able to Publish: Working with Product Flavors and Construct Varieties
Within the final article, you completed constructing your app. Now, you’re considering of how to revenue from it :]

One resolution is to have a number of variations of your app: a free model and a paid model. Fortuitously, Gradle helps this on the construct stage and lets you outline the boundaries of various construct sorts. However earlier than you get began, that you must perceive how Gradle lets you work with completely different app variations.
Introducing Construct Varieties
By default, there are two construct sorts – debug and launch. The one distinction between them is the worth of the debuggable parameter. In different phrases, you should utilize the debug model to evaluation logs and to debug the app, however the launch sort is used to publish your app to the Google Play Retailer. Configure properties to the construct sorts by including the next code within the android block of your module-level construct.gradle.kts file:
buildTypes {
launch {
}
debug {
}
}
Specify the type-specific settings of your software within the debug and launch blocks.
Studying About Construct Signing
Probably the most essential configurations of the construct is its signature. With no signature, you received’t have the ability to publish your software as a result of it’s essential to confirm you as an proprietor of the precise software. Whilst you don’t have to signal the debug construct – Android Studio does it mechanically — the discharge construct ought to be signed by a developer.
When your keystore is prepared, add the code under within the android block and above the buildTypes block (the order of declaration issues) of the module-level construct.gradle.kts file:
signingConfigs {
create("launch") {
storeFile = file("path to your keystore file")
storePassword = "your retailer password"
keyAlias = "your key alias"
keyPassword = "your key password"
}
}
In the event you’re utilizing Groovy, add this code as a substitute:
signingConfigs {
launch {
storeFile file("path to your keystore file")
storePassword "your retailer password"
keyAlias "your key alias"
keyPassword "your key password"
}
}
Within the signingConfigs block, specify your signature data for the construct sorts. Take note of the keystore file path. Specify it with respect to the module listing. In different phrases, if you happen to created a keystore file within the module listing and named it “keystore.jks”, the worth it’s best to specify might be equal to the title of the file.
Replace the buildTypes block to signal your launch construct mechanically:
launch {
signingConfig = signingConfigs.getByName("launch")
}
And the Groovy model:
launch {
signingConfig signingConfigs.launch
}
Or, if you happen to’re utilizing Groovy:
Then, you should definitely maintain keystorePassword.gradle.kts ignored by your model management system. Different strategies embrace protecting the password in an OS-level atmosphere variable, particularly in your distant Steady Integration system, corresponding to CircleCI.
- When you’ve printed your app to the Google Play Retailer, subsequent submissions should use the identical keystore file and password, so maintain them secure.
- Make certain NOT to commit your keystore passwords to a model management system corresponding to GitHub. You are able to do so by protecting the password in a separate file from
construct.gradle.kts, saykeystorePassword.gradle.ktsin aSigninglisting, after which referencing the file from the app module-levelconstruct.gradle.ktsthrough:apply(from = "../Signing/keystorePassword.gradle.kts")
apply from: "../Signing/keystorePassword.gradle"
Be aware: There are two essential issues associated to your keystore file:
apply(from = "../Signing/keystorePassword.gradle.kts")
apply from: "../Signing/keystorePassword.gradle"
Utilizing Construct Flavors
As a way to create a number of variations of your app, that you must use product flavors. Flavors are a option to differentiate the properties of an app, whether or not it’s free/paid, staging/manufacturing, and so forth.
You’ll distinguish your app flavors with completely different app names. First, add the next names as strings within the strings.xml file:
<string title="app_name_free">Socializify Free</string>
<string title="app_name_paid">Socializify Paid</string>
And take away the prevailing:
<string title="app_name">Socializify</string>
Now that the unique app_name string is not accessible, edit your AndroidManifest.xml file and change android:label="@string/app_name" with android:label="${appName}" contained in the software tag.
Subsequent, add the next code within the android block of your module-level construct.gradle.kts file:
// 1
flavorDimensions.add("appMode")
// 2
productFlavors {
// 3
create("free") {
// 4
dimension = "appMode"
// 5
applicationIdSuffix = ".free"
// 6
manifestPlaceholders["appName"] = "@string/app_name_free"
}
create("paid") {
dimension = "appMode"
applicationIdSuffix = ".paid"
manifestPlaceholders["appName"] = "@string/app_name_paid"
}
}
Right here’s what’s occurring within the code above:
- You have to specify the flavour dimensions to correctly match the construct sorts. On this case, you want just one dimension – the app mode.
- Within the
productFlavors, specify a listing of flavors and their settings. On this case,freeandpaid. - Specify the title of the primary product taste –
free. - It’s obligatory to specify the
dimensionparameter worth. Thefreetaste belongs to theappModedimension. - Because you wish to create separate apps without spending a dime and paid performance, you want them to have completely different app identifiers. The
applicationIdSuffixparameter defines a string that’ll be appended to theapplicationId, giving your app distinctive identifiers. - The
manifestPlaceholderslets you modify properties in your AndroidManifest.xml file at construct time. On this case, modify the appliance title relying on its model.
The Groovy equal can be:
// 1
flavorDimensions = ["appMode"]
// 2
productFlavors {
// 3
free {
// 4
dimension "appMode"
// 5
applicationIdSuffix ".free"
// 6
manifestPlaceholders.appName = "@string/app_name_free"
}
paid {
dimension "appMode"
applicationIdSuffix ".paid"
manifestPlaceholders.appName = "@string/app_name_paid"
}
}
Sync your venture with Gradle once more. After the venture sync, run the duties command, and see if you happen to can spot what’s modified:
./gradlew duties
You’ll get an analogous listing of duties to the one you bought while you ran this command the primary time:
... Construct duties ----------- ... assembleDebug - Assembles foremost outputs for all Debug variants. assembleFree - Assembles foremost outputs for all Free variants. assemblePaid - Assembles foremost outputs for all Paid variants. assembleRelease - Assembles foremost outputs for all Launch variants. ...
Spot the distinction? Have a look at the duties beneath the Construct duties part, and also you’ll see some new ones there. You now have separate instructions for every construct sort and construct taste.
Run the command:
./gradlew assembleDebug
When the command completes, examine the output listing:
ls -R app/construct/outputs/apk
Right here’s what you’ll see:
free paid
app/construct/outputs/apk/free:
debug
app/construct/outputs/apk/free/debug:
app-free-debug.apk output-metadata.json
app/construct/outputs/apk/paid:
debug
app/construct/outputs/apk/paid/debug:
app-paid-debug.apk output-metadata.json
You must have two builds generated – freeDebug and paidDebug.


