In Half 1 of this tutorial, you discovered learn and construct Gradle recordsdata and handle dependencies in a number of methods. On this half, you’ll study barely extra advanced components of Gradle. By the top, you’ll be capable 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 undertaking by clicking the Obtain Supplies hyperlink on the prime or backside of the tutorial. You’ll choose up the place you left off in Half 1.
This a part of the tutorial will concentrate on use Kotlin script, because it’s now the popular manner of writing Gradle recordsdata. Nonetheless, each little bit of Kotlin script code can have its Groovy equal so you too can study it. If the choice Groovy model doesn’t exist, you’ll be able to assume that the particular little bit of code you’re is an identical 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 pondering of the way to revenue from it :]
One answer is to have a number of variations of your app: a free model and a paid model. Fortuitously, Gradle helps this on the construct degree and means that you can outline the boundaries of various construct sorts. However earlier than you get began, you have to perceive how Gradle means that you can 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 assessment logs and to debug the app, however the launch kind 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
One of the vital configurations of the construct is its signature. With no signature, you received’t be capable to publish your software as a result of it’s essential to confirm you as an proprietor of the particular software. When you don’t have to signal the debug construct – Android Studio does it robotically — 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"
}
}
When you’re utilizing Groovy, add this code as an alternative:
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, should you created a keystore file within the module listing and named it “keystore.jks”, the worth you need to specify shall be equal to the title of the file.
Replace the buildTypes
block to signal your launch construct robotically:
launch {
signingConfig = signingConfigs.getByName("launch")
}
And the Groovy model:
launch {
signingConfig signingConfigs.launch
}
Or, should you’re utilizing Groovy:
Then, make sure to hold keystorePassword.gradle.kts
ignored by your model management system. Different strategies embody retaining the password in an OS-level setting variable, particularly in your distant Steady Integration system, reminiscent of CircleCI.
- When you’ve revealed your app to the Google Play Retailer, subsequent submissions should use the identical keystore file and password, so hold them secure.
- Be certain NOT to commit your keystore passwords to a model management system reminiscent of GitHub. You are able to do so by retaining the password in a separate file from
construct.gradle.kts
, saykeystorePassword.gradle.kts
in aSigning
listing, after which referencing the file from the app module-levelconstruct.gradle.kts
by way of:apply(from = "../Signing/keystorePassword.gradle.kts")
apply from: "../Signing/keystorePassword.gradle"
Be aware: There are two vital concerns associated to your keystore file:
apply(from = "../Signing/keystorePassword.gradle.kts")
apply from: "../Signing/keystorePassword.gradle"
Utilizing Construct Flavors
With a purpose to create a number of variations of your app, you have to use product flavors. Flavors are a approach 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 present:
<string title="app_name">Socializify</string>
Now that the unique app_name
string is not obtainable, 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:
- It’s good 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,free
andpaid
. - Specify the title of the primary product taste –
free
. - It’s necessary to specify the
dimension
parameter worth. Thefree
taste belongs to theappMode
dimension. - Because you need to create separate apps at no cost and paid performance, you want them to have completely different app identifiers. The
applicationIdSuffix
parameter defines a string that’ll be appended to theapplicationId
, giving your app distinctive identifiers. - The
manifestPlaceholders
means that you can modify properties in your AndroidManifest.xml file at construct time. On this case, modify the appliance title relying on its model.
The Groovy equal could 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 undertaking with Gradle once more. After the undertaking sync, run the duties
command, and see should you can spot what’s modified:
./gradlew duties
You’ll get the same record of duties to the one you bought whenever you ran this command the primary time:
... Construct duties ----------- ... assembleDebug - Assembles essential outputs for all Debug variants. assembleFree - Assembles essential outputs for all Free variants. assemblePaid - Assembles essential outputs for all Paid variants. assembleRelease - Assembles essential outputs for all Launch variants. ...
Spot the distinction? Take 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 kind and construct taste.
Run the command:
./gradlew assembleDebug
When the command completes, test 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
It is best to have two builds generated – freeDebug
and paidDebug
.