Comment définir différentes dépendances pour différentes saveurs de produits

153

Je convertis l'une de mes applications en Gradle et j'aimerais utiliser les nouvelles fonctionnalités de création de saveur pour avoir une saveur payante et gratuite basée sur les publicités.

Je souhaite que seule la version basée sur les annonces dépende du SDK admob.

Mon fichier de construction ressemble à ceci:

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

Existe-t-il un moyen de configurer la dépendance dans la version gratuite du produit pour avoir son propre dossier libs qui est fusionné avec le dossier libs principal qui contient les bibliothèques générales pour les deux versions?

Si cela est possible, comment définirais-je ce dossier?

Janusz
la source

Réponses:

190

Pour définir une dépendance spécifique à une saveur, vous pouvez utiliser à la proCompileplace de compiledans votre section de dépendance. Lorsque vous exécutez les propriétés de gradle, vous obtenez une vue d'ensemble des configurations créées automatiquement.

Le fichier de construction correct ressemble à ceci:

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'
}
René Groeschke
la source
2
J'essaye ceci et j'obtiens cette erreur, Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(La saveur à laquelle j'essaye d'ajouter une dépendance est "verre".)
nmr
19
Ahh, on dirait que vous devez déplacer le dependenciesbloc sous le androidbloc. Comme c'est intuitif.
nmr
14
Notez que les xxxCompilefermetures générées par Gradle ne fonctionneront pas si le nom de la saveur commence par une majuscule.
Jarett Millard
2
"packageName" devrait être "applicationId"
Apperside
7
Comment gérez-vous le fait de ne pas appeler les classes d'annonces?
Jared Burrows
27

Avance rapide jusqu'à mi-2018. Vous devrez ajouter 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'
}

Notez également:

La configuration 'compile' est obsolète et a été remplacée par 'implementation' et 'api'. Il sera supprimé à la fin de 2018. Pour plus d'informations, voir: http://d.android.com/r/tools/update-dependency-configurations.html

user1506104
la source
Savez-vous comment le faire avec buildVariants à la place? comme proDebugImplementation.
Leandro Ocampo
1
veuillez ajouter une question distincte pour cela. liez-le ici dans la section des commentaires. veuillez ajouter des détails complets sur ce que vous essayez d'accomplir. :)
user1506104
11

Vous devez ajouter manuellement la configuration pour chaque saveur. Exemple

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
la source
1
Comment partir de là? Comment activer les différentes configurations? Cela s'applique-t-il uniquement à la version Android? Est-ce possible avec des versions non Android?
koppor
9

Edit: je recommande d'utiliser l'une des autres techniques!

Une alternative à la réponse acceptée est la suivante:

    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
la source
2
cela ne vous permet pas de créer plusieurs saveurs à la fois, ce qui est en quelque sorte un facteur décisif pour la plupart d'entre nous. De plus, cela pourrait ne pas fonctionner correctement avec Android Studio
Rene Groeschke
3
c'est dans le bloc des dépendances?
user1743524
2
Ce bloc est-il en dépendance?
Karacago
hmm ... ne s'adapte pas bien avec 10 ou 50 saveurs, n'est-ce pas?
Ewoks
@Ewoks Je dois faire plein de saveurs, avez-vous une meilleure idée?
Vikash Parajuli
6

Facile:

dependencies {

    ....
    ....

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

    ....
    ....
}

ou juste:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'
nnyerges
la source