Como definir diferentes dependências para diferentes tipos de produtos


153

Estou convertendo um dos meus aplicativos para Gradle e gostaria de usar os novos recursos de sabor de compilação para ter um sabor pago e baseado em anúncio gratuito.

Quero que apenas a versão baseada em anúncio dependa do SDK da admob.

Meu arquivo de compilação fica assim:

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 uma maneira de configurar a dependência no sabor do produto gratuito para ter sua própria pasta libs que é mesclada com a pasta libs principal que contém bibliotecas gerais para ambos os tipos?

Se isso for possível, como eu definiria esta pasta?


Respostas:


190

Para definir uma dependência específica de sabor, você pode usar em proCompilevez de compilena sua seção de dependência. Ao executar propriedades gradle, você obtém uma visão geral das configurações criadas automaticamente.

O arquivo de compilação correto se parece com isso:

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
Eu estou tentando isso e recebendo este erro, Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(O sabor que eu estou tentando adicionar uma dependência para é "vidro".)
RMN

19
Ahh, parece que você precisa mover o dependenciesbloco abaixo dele android. Quão intuitivo.
RMN

14
Observe que os xxxCompilefechamentos gerados por Gradle não funcionarão se o nome do sabor começar com uma letra maiúscula.
Jarett Millard

2
"packageName" deve ser "applicationId"
Apperside 14/04

7
Como você lida com a não chamada das classes de anúncios?
Jared Burrows

26

Avanço rápido para meados de 2018. Você precisará adicionar 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'
}

Além disso, observe:

A configuração 'compilar' é obsoleta e foi substituída por 'implementação' e 'api'. Ele será removido no final de 2018. Para obter mais informações, consulte: http://d.android.com/r/tools/update-dependency-configurations.html


Você sabe como fazer isso com o buildVariants? como proDebugImplementation.
Leandro Ocampo

1
adicione uma pergunta separada para isso. vincule-o aqui na seção de comentários. adicione detalhes completos do que você está tentando alcançar. :)
user1506104

11

Você precisa adicionar manualmente a configuração para cada sabor. Exemplo

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
Como continuar a partir daí? Como ativar as diferentes configurações? Isso se aplica apenas à versão do Android? É possível isso com compilações que não são do Android?
koppor

9

Edit: Eu recomendo usar uma das outras técnicas!

Uma alternativa à resposta aceita é 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.+'
    }

2
isso não permite que você crie vários sabores ao mesmo tempo, o que é uma espécie de quebra de acordo para a maioria de nós. Além disso, ele pode não funcionar bem com o estúdio android também
Rene Groeschke

3
isso está no bloco de dependências?
user1743524

2
Esse bloco está em dependência?
Karacago

hmm ... não escala bem com 10 ou 50 sabores, não é?
Ewoks

@ Ewoks eu tenho que fazer muitos sabores, você tem alguma ideia melhor?
Vikash Parajuli 17/07/19

6

Simples:

dependencies {

    ....
    ....

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

    ....
    ....
}

ou apenas:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.