如何为不同的产品口味定义不同的依赖关系


153

我将其中一个应用程序转换为Gradle,并希望使用新的构建风格功能来获得付费和免费的基于广告的风格。

我只希望基于广告的版本依赖admob SDK。

我的构建文件如下所示:

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

有没有一种方法可以将免费产品口味中的依赖项配置为拥有自己的libs文件夹,并与包含这两种口味的通用库的主libs文件夹合并?

如果可能的话,我将如何定义该文件夹?


Answers:


190

要定义特定于风味的依赖项,可以在依赖项部分中使用proCompile代替compile。运行gradle属性时,您将获得自动创建的配置的概述。

正确的构建文件如下所示:

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
我正在尝试执行此操作并收到此错误,Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!(我尝试向其添加依赖项的样式是“ glass”。)
nmr 2014年

19
嗯,看来您必须将dependencies块移动到块下方android。多么直观。
nmr 2014年

14
请注意,xxxCompile如果风味名称以大写字母开头,则Gradle生成的闭包将不起作用。
杰瑞特·米拉德

2
“ packageName”应为“ applicationId”
Apperside 2015年

7
您如何处理不调用广告类的问题?
Jared Burrows,2015年

26

快进到2018年中。您将需要添加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'
}

另外,请注意:

配置“编译”已过时,已被“实现”和“ api”替换。它将在2018年底删除。有关更多信息,请参见:http : //d.android.com/r/tools/update-dependency-configurations.html


您知道如何用buildVariants来做到吗?像proDebugImplementation。
Leandro Ocampo

1
请为此添加一个单独的问题。在评论部分将其链接到此处。请添加您要实现的目标的完整详细信息。:)
user1506104

11

您需要为每种口味手动添加配置。例

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
如何从那里继续?如何激活不同的配置?这仅适用于Android版本吗?非Android版本有可能吗?
koppor

9

编辑:我建议使用其他技术之一!

可接受答案的替代方法是:

    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
不允许您一次建立多种口味,这对我们大多数人来说都是一个破坏交易的因素。此外,它可能也无法与android studio一起很好地工作
Rene Groeschke 2015年

3
这在依赖项块中?
user1743524

2
这是依赖吗?
卡拉卡戈

嗯...不能很好地缩放10或50种口味吗?
Ewoks

@Ewoks我有很多口味,您有更好的主意吗?
Vikash Parajuli

6

简单:

dependencies {

    ....
    ....

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

    ....
    ....
}

要不就:

FreeImplementation 'com.google.android.gms:play-services-ads:17.2.0'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.