19 Kwiecień

Tworzenie BuildVariants poprzez Gradle

Podczas tworzenia aplikacji nieraz zdarza się, że w pewnym momencie chcemy uzyskać kilka wersji naszej aplikacji, które różnią się pewnymi mniej lub bardziej istotnymi detalami. Aby uzyskać w łatwy sposób różne wersje aplikacji wystarczy dokonać kilku zmian w Gradle.

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

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 poróżnić 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:

Podsumowanie

W efekcie możemy swobodnie przełączać się między wariantami, aby utworzyć odpowiednią wersję aplikacji właściwie zerowym nakładem pracy. Jest to bardzo praktyczne i pomocne rozwiązanie, które może zaoszczędzić sporo jakże cennego developerskiego czasu. ;)