Come definire dipendenze diverse per gusti di prodotti diversi


153

Sto convertendo una delle mie app in Gradle e vorrei utilizzare le nuove funzionalità di stile build per avere un sapore a pagamento e uno basato su annunci gratuiti.

Voglio solo che la versione basata sugli annunci dipenda dall'addb SDK.

Il mio file di build è simile al seguente:

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

C'è un modo per configurare la dipendenza nel sapore del prodotto gratuito in modo che abbia la propria cartella libs che viene unita alla cartella libs principale che contiene librerie generali per entrambi i gusti?

Se ciò fosse possibile, come definirei questa cartella?


visita questa discussione: stackoverflow.com/questions/24860659/…
Ali

Risposte:


190

Per definire una dipendenza specifica per sapore che puoi usare al proCompileposto dicompile nella sezione Dipendenza. Quando si eseguono le proprietà gradle si ottiene una panoramica delle configurazioni create automaticamente.

Il file di build corretto è simile al seguente:

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
Sto provando questo e ricevendo questo errore, Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(Il sapore a cui sto provando ad aggiungere una dipendenza è "glass".)
nmr

19
Ahh, sembra che tu debba spostare il dependenciesblocco sotto il androidblocco. Quanto intuitivo.
nmr

14
Si noti che le xxxCompilechiusure generate da Gradle non funzioneranno se il nome del sapore inizia con una lettera maiuscola.
Jarett Millard,

2
"nomepacchetto" dovrebbe essere "applicationId"
Apperside

7
Come gestisci non chiamare le classi di annunci?
Jared Burrows,

27

Avanzamento rapido fino a metà 2018. Dovrai aggiungere 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'
}

Inoltre, prendi nota:

La configurazione "compilazione" è obsoleta ed è stata sostituita con "implementazione" e "api". Sarà rimosso alla fine del 2018. Per ulteriori informazioni, consultare: http://d.android.com/r/tools/update-dependency-configurations.html


Sai come farlo con buildVariants invece? come proDebugImplementation.
Leandro Ocampo,

1
si prega di aggiungere una domanda separata per questo. collegalo qui nella sezione commenti. aggiungi i dettagli completi di ciò che stai cercando di ottenere. :)
user1506104

11

È necessario aggiungere manualmente la configurazione per ogni sapore. Esempio

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
Come andare avanti da lì? Come attivare le diverse configurazioni? Questo vale solo per la build Android? È possibile farlo con build non Android?
koppor,

9

Modifica: ti consiglio di usare una delle altre tecniche!

Un'alternativa alla risposta accettata è questa:

    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
ciò non ti consente di creare più sapori contemporaneamente, il che è un po 'un rompicapo per la maggior parte di noi. Inoltre, potrebbe non funzionare bene anche con Android Studio
Rene Groeschke,

3
questo è nel blocco delle dipendenze?
user1743524

2
Questo blocco è in dipendenza?
Karacago,

hmm ... non si adatta bene con 10 o 50 gusti vero?
Ewoks,

@Ewoks Devo fare molti gusti, hai qualche idea migliore?
Vikash Parajuli,

6

Semplice:

dependencies {

    ....
    ....

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

    ....
    ....
}

o semplicemente:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.