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?


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'
}

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


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'
}

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.+'
    }

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'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.