Cómo definir diferentes dependencias para diferentes sabores de productos

153

Estoy convirtiendo una de mis aplicaciones a Gradle y me gustaría utilizar las nuevas funciones de creación de sabor para tener un sabor basado en anuncios pagos y gratuitos.

Solo quiero que la versión basada en anuncios dependa del SDK de admob.

Mi archivo de compilación se ve así:

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

¿Hay alguna manera de configurar la dependencia en la versión gratuita del producto para tener su propia carpeta libs que se fusiona con la carpeta principal libs que contiene bibliotecas generales para ambas versiones?

Si esto es posible, ¿cómo definiría esta carpeta?

Janusz
fuente

Respuestas:

190

Para definir una dependencia específica de sabor, puede usarla en proCompilelugar de compileen su sección de dependencia. Cuando ejecuta propiedades de gradle, obtiene una visión general de las configuraciones creadas automáticamente.

El archivo de compilación correcto se ve así:

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
fuente
2
Estoy intentando esto y obtengo este error, Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(El sabor al que estoy tratando de agregar una dependencia es "vidrio".)
nmr
19
Ahh, parece que tienes que mover el dependenciesbloque debajo del androidbloque. Que intuitivo.
RMN
14
Tenga en cuenta que los xxxCompilecierres que genera Gradle no funcionarán si el nombre del sabor comienza con una letra mayúscula.
Jarett Millard
2
"packageName" debe ser "applicationId"
Apperside
77
¿Cómo manejas no llamar a las clases de anuncios?
Jared Burrows
26

Avance rápido hasta mediados de 2018. Necesitarás agregar 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'
}

Además, tome nota:

La configuración 'compilar' está obsoleta y ha sido reemplazada por 'implementación' y 'api'. Se eliminará a fines de 2018. Para obtener más información, consulte: http://d.android.com/r/tools/update-dependency-configurations.html

usuario1506104
fuente
¿Sabes cómo hacerlo con buildVariants? como proDebugImplementation.
Leandro Ocampo
1
agregue una pregunta separada para esto. vincúlelo aquí en la sección de comentarios. agregue detalles completos de lo que está tratando de lograr. :)
user1506104
11

Necesita agregar manualmente la configuración para cada sabor. Ejemplo

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
fuente
1
¿Cómo seguir desde allí? ¿Cómo activar las diferentes configuraciones? ¿Esto se aplica solo a la compilación de Android? ¿Es posible eso con versiones que no son de Android?
koppor
9

Editar: ¡Recomiendo usar una de las otras técnicas!

Una alternativa a la respuesta aceptada es esta:

    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
fuente
2
eso no le permite crear múltiples sabores a la vez, lo que es un factor decisivo para la mayoría de nosotros. Además, podría no funcionar bien con Android Studio también
Rene Groeschke
3
esto está en el bloque de dependencias?
user1743524
2
¿Es este bloque de dependencia?
Karacago
hmm ... no escala bien con 10 o 50 sabores ¿verdad?
Ewoks
@Ewoks, tengo que hacer muchos sabores, ¿tienes alguna idea mejor?
Vikash Parajuli
6

Sencillo:

dependencies {

    ....
    ....

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

    ....
    ....
}

o solo:

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