Tworzenie BuildVariants poprzez Gradle krok po kroku

Podczas tworzenia aplikacji nieraz zdarza się, że w pewnym momencie chcemy uzyskać kilka wersji naszej aplikacji, które różnią się mniej lub bardziej istotnymi detalami. Aby w łatwy sposób stworzyć różne wersje aplikacji, wystarczy dokonać kilku zmian w Gradle.
Wersje aplikacji z Gradle – jakie mamy możliwości?
Android Studio wraz z Gradle wspiera tworzenie różnych wersji aplikacji poprzez dodawanie kolejnych BuildTypes i ProductFlavors. Ale zanim powiemy sobie więcej o tym, warto wspomnieć o jakich różnych wersjach mowa. Możemy np. chcieć uzyskać wersję, które różnią się applicationId, minimalną wspieraną wersją SDK, podpisane bądź nie. Nasze wersje mogą się również różnić wewnętrznie wykorzystywanymi parametrami, jak choćby wykorzystywany url do API.
BuildTypes – różne rodzaje
Przy tworzeniu projektu w AndroidStudio w Gradle mamy domyślnie 2 rodzaje dla BuildTypes: debug i release. Te typy odnoszą się do szeregu ustawień podczas budowania projektu. To jednocześnie dobre miejsce do zdefiniowania np. lokalizacji i nazwy generowanych buildów:
buildTypes {
release {
applicationVariants.all { variant ->
variant.outputs.each { output ->
def file = output.outputFile
output.outputFile = new File(file.parent, "releaseBuildHeader" + defaultConfig.versionName + ".apk")
}
}
}
debug { (...) }
}
ProductFlavors
ProductFlavors z kolei umożliwia nam definiowanie parametrów wykorzystywanych w kodzie aplikacji. Można tu jednocześnie np. rozróżniać minSdkVersion. Poniżej przedstawiony przykład pokazuje, jak odróżnić między sobą wersje poprzez różne adresy URL do API, z których jedno wymaga certyfikatu, a drugie nie:
productFlavors {
live {
applicationId 'pl.holdapp.testapp'
buildConfigField 'String', 'API_URL', '"https://some-api-url.com"'
buildConfigField 'boolean', 'NEED_CERTIFICATE', "false"
}
dev {
applicationId 'pl.holdapp.testapp.dev'
buildConfigField 'String', 'API_URL', '"https://another-api-url.com"'
buildConfigField 'boolean', 'NEED_CERTIFICATE', "true"
}
}
Jak widać posługujemy się tutaj buildConfigField, gdzie podajemy kolejno ‘typ definiowanej stałej’, ‘nazwę’ oraz ‘wartość’. No dobrze, lecz zostało jeszcze pytanie, jak z tej wartości skorzystać wewnątrz kodu naszej aplikacji? Jak się okazuje, jest to równie proste. Wystarczy w kodzie odwołać się do stałej w następujący sposób:
if (BuildConfig.NEED_CERTIFICATE)
okHttpBuilder.sslSocketFactory((sslContext.getSocketFactory()));
W efekcie posiadanych BuildTypes i ProductFlavors po zsynchronizowaniu projektu (po zmianach wprowadzonych w Gradle), utworzyły nam się cztery BuildVariants:
W efekcie możemy swobodnie przełączać się między wariantami, aby utworzyć odpowiednią wersję aplikacji. I to przy minimalnym wysiłku. To bardzo praktyczne i pomocne rozwiązanie, które może zaoszczędzić sporo czasu.