web-dev-qa-db-fra.com

Comment définir différentes dépendances pour différents types de produits

Je suis en train de convertir l'une de mes applications vers Gradle et souhaite utiliser les nouvelles fonctionnalités de version pour créer une version payante et gratuite.

Je veux que seule la version basée sur la publicité dépende du SDK d'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 de produit libre pour avoir son propre dossier libs fusionné avec le dossier principal libs contenant les bibliothèques générales des deux versions?

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

134
Janusz

Pour définir une dépendance spécifique à une saveur, vous pouvez utiliser proCompile au lieu de compile dans votre section de dépendance. Lorsque vous exécutez des propriétés de dégradé, 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'
}
168
Rene Groeschke

Avance rapide jusqu'à la 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'
}

Aussi, prenez note:

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

15
user1506104

Vous devez ajouter manuellement la configuration pour chaque type. 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'
}
10
Arkadiusz Konior

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

Simple:

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'
1
nnyerges