Snippet: Zmniejsz ilość wariantów budowania swojej aplikacji.

Zazwyczaj w projektach zachodzi potrzeba budowania aplikacji z różnymi parametrami w zależności od wersji np. z różnymi adresami serwera dla wersji testowej i produkcyjnej. Może wtedy kusić użycie androidowych Flavorów:

productFlavors{
    production{
        dimension "env"
        buildConfigField "String", "BACKEND_URL", "http://androidcoder.pl/api"
    }
    testing{
        dimension "env"
        buildConfigField "String", "BACKEND_URL", "http://test.androidcoder.pl/api"
    }
}

Niesie to za sobą jednak pewne konsekwencje. Dodanie Flavorów powoduje powstanie 4 wariantów: productionDebug, productionRelease, testingRelease, testingDebug.

    productFlavors{
        production{
            dimension "env"
            buildConfigField "String", "BACKEND_URL", "http://androidcoder.pl"
        }
        testing{
            dimension "env"
            buildConfigField "String", "BACKEND_URL", "http://androidcoder.pl"
        }
        
        full{
            dimension "type"
        }
        
        free{
            dimension "type"
        }
    }

Kiedy w aplikacji pojawi się nowy wymiar np. wersja płatna i bezpłatna, robi się poważnie, ponieważ powstaje aż 8 wariantów: productionFullDebug, productionFullRelease, testingFullRelease, testingFullDebug,productionFreeDebug, productionFreeRelease, testingFreeRelease, testingFreeDebug. Każdorazowe dodanie nowego środowiska zwiększy liczbę wariantów o 4.

Aby zredukować ich ilość, trzeba zrezygnować z któregoś z wymiaru. Używanie Flavorów do ustawiania środowisk jest lekką przesadą. Każdorazowe przełączanie się pomiędzy środowiskami powoduje przełączenie źródeł oraz przebudowanie aplikacji. Jest to zbyt czasochłonne rozwiązanie tylko do podmiany kilku linków. Dlatego trzeba zrezygnować z wymiaru „env”.

Czym można zastąpić Flavor? Do tego świetnie nadaje się wstrzykiwanie parametrów do projektu. Gradle pozwala na dodanie parametrów z linii komend poprzez parametr -P lub --project-prop, np. ./gradlew assembleDebug -Penv=test gdzie -Penv dostarcza typ środowiska, z jakim ma zostać zbudowana aplikacja. W pliku gradle możesz bez problemu pobrać parametr za pomocą metody project.findProperty("env").

Przykładowa implementacja wyboru środowiska za pomocą parametrów wygląda tak:

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

def getEnvironment() {
    def environments = [
            test        : "http://test.androidcoder.pl",
            production  : "http://androidcoder.pl"
    ]
    def defaultEnvironment = "test"
    def environment = project.findProperty("env") ?: defaultEnvironment
    return environments[environment]
}
android {
    ...
    defaultConfig {
        ...
        buildConfigField "String", "BACKEND_URL", "\"${getEnvironment()}\""
    }
}

Funkcja getEnvironment() zwraca środowisko w zależności od parametru env przekazanego w linii komend. Aby było możliwe budowanie bez parametrów dodałem domyślne środowisko defaultEnvironment="test" dzięki czemu bez przeszkód możesz zbudować aplikację przez IDE.

Aby zbudować aplikację dla środowiska testowego, należy uruchomić ./gradlew assembleDebug -Penv=test lub bez parametru -Penv=test i skorzystać z wartości domyślnej: ./gradlew assembleDebug.

Źródła

Dokumentacja parametrów Gradle: https://docs.gradle.org/current/userguide/build_environment.html#sec:project_properties

Jeśli uważasz treść za wartościową to podziel się nią z innymi. Dziękuję.

Mateusz Chrustny

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *