Jak definiować różne zależności dla różnych smaków produktów

153

Konwertuję jedną z moich aplikacji na Gradle i chciałbym użyć funkcji nowej wersji kompilacji, aby mieć płatną i bezpłatną wersję opartą na reklamach.

Chcę, aby tylko wersja oparta na reklamach była zależna od pakietu AdMob SDK.

Mój plik kompilacji wygląda następująco:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.5.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 18
    buildToolsVersion "18.0.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 18
    }

    productFlavors {
        Pro {
            packageName "de.janusz.journeyman.zinsrechner.pro"
        }
        Free { 
            dependencies {

            }
        }
    }
}

dependencies {
    compile 'com.android.support:support-v4:18.0.+'
    compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
    compile fileTree(dir: 'libs', include: '*.jar')
}

Czy istnieje sposób skonfigurowania zależności w wersji darmowego produktu tak, aby miała własny folder libs, który jest scalany z głównym folderem libs zawierającym biblioteki ogólne dla obu wersji?

Jeśli to możliwe, jak zdefiniowałbym ten folder?

Janusz
źródło
odwiedź ten wątek: stackoverflow.com/questions/24860659/…
Ali

Odpowiedzi:

190

Aby zdefiniować zależność specyficzną dla smaku, możesz użyć proCompilezamiast compilew sekcji zależności. Po uruchomieniu właściwości gradle otrzymasz przegląd automatycznie utworzonych konfiguracji.

Prawidłowy plik kompilacji wygląda następująco:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}
apply plugin: 'com.android.application'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 22
    }

    productFlavors {
        pro {
            packageName "de.janusz.journeyman.zinsrechner.pro"
        }
        free { }
    }
}

dependencies {
    compile 'com.android.support:support-v4:22.2.0'
    freeCompile 'com.google.android.gms:play-services-ads:7.5.0'
}
Rene Groeschke
źródło
2
Próbuję tego i otrzymuję ten błąd Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(Smak, do którego próbuję dodać zależność, to „szkło”).
nmr
19
Ach, wygląda na to, że musisz przesunąć dependenciesblok pod androidblok. Jak intuicyjnie.
NMR
14
Zwróć uwagę, że xxxCompilezamknięcia generowane przez Gradle nie będą działać, jeśli nazwa smaku zaczyna się od dużej litery.
Jarett Millard
2
„PackageName” powinno mieć wartość „applicationId”
Apperside
7
Jak sobie radzisz z niewywołaniem klas reklam?
Jared Burrows
26

Przejdźmy do połowy 2018 roku. Będziesz musiał dodać flavorDimensions.

android {
    ...
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    flavorDimensions "dimensionName"
    productFlavors {
        pro {
            dimension "dimensionName"
        }
        free {
            dimension "dimensionName"
        }
    }
}

dependencies {
    implementation 'com.android.support:support-v4:22.2.0'
    freeImplementation 'com.google.android.gms:play-services-ads:15.0.1'
}

Zwróć też uwagę:

Konfiguracja „kompilacja” jest przestarzała i została zastąpiona przez „implementację” i „api”. Zostanie usunięty pod koniec 2018 roku. Więcej informacji: http://d.android.com/r/tools/update-dependency-configurations.html

user1506104
źródło
Czy wiesz, jak to zrobić za pomocą buildVariants zamiast tego? jak proDebugImplementation.
Leandro Ocampo
1
dodaj do tego osobne pytanie. połącz go tutaj w sekcji komentarzy. podaj pełne szczegóły tego, co próbujesz osiągnąć. :)
user1506104
11

Musisz ręcznie dodać konfigurację dla każdego smaku. Przykład

configurations {
    proCompile
    freeCompile
}

dependencies {
    compile 'com.parse.bolts:bolts-tasks:1.3.0'

    proCompile 'com.android.support:design:23.1.1'
    freeCompile 'com.parse:parse-android:1.12.0'
}
Arkadiusz Konior
źródło
1
Jak od tego zacząć? Jak aktywować różne konfiguracje? Czy dotyczy to tylko wersji Androida? Czy jest to możliwe w przypadku kompilacji innych niż Android?
koppor
9

Edycja: polecam użycie jednej z pozostałych technik!

Alternatywą dla zaakceptowanej odpowiedzi jest:

    ext {
        flavorType = ""
    }


    gradle.startParameter.getTaskNames().each { task ->

        if(task.contains("flavor1")){
            flavorType = "flavor1"
        } else if (task.contains("flavor2")){
            flavorType = "flavor2"
        } else {
            flavorType = "flavor3"
        }

    }

 if(flavorType == 'flavor1' || flavorType == 'flavor2') {
        compile 'com.android.support:support-v4:18.0.+'
    }
Jordy
źródło
2
To nie pozwala na budowanie wielu smaków jednocześnie, co dla większości z nas jest pewnym przełomem. Co więcej, może nie działać dobrze również ze studiem Android
Rene Groeschke,
3
to jest w bloku zależności?
user1743524
2
Czy ten blok jest zależny?
Karacago,
hmm ... nie skaluje się dobrze z 10 lub 50 smakami, prawda?
Ewoks
@Ewoks Mam ochotę stworzyć wiele smaków, czy masz lepszy pomysł?
Vikash Parajuli,
6

Prosty:

dependencies {

    ....
    ....

    gradle.startParameter.getTaskNames().each { task ->
        if(task.contains("free")) {
             implementation 'com.google.android.gms:play-services-ads:17.2.0'
        }
    }

    ....
    ....
}

Lub tylko:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'
nnyerges
źródło