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

我正在转换我的一个应用程序到 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 文件夹,该文件夹与包含两种风格的通用库的 main libs 文件夹合并在一起?

如果这是可能的,我将如何定义这个文件夹?

57681 次浏览

要定义特定于风味的依赖项,可以在依赖项部分中使用 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'
}

编辑: 我推荐使用其他技术之一!

除了公认的答案之外,还有一种选择:

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

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

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

快进到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'
}

此外,请注意:

配置“编译”已过时,已替换为 「实施」及「应用系统配置」。有关的「应用系统配置」将于2018年年底删除 更多资料见: Http://d.android.com/r/tools/update-dependency-configurations.html

简单:

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'

如果在 Kotlin 中使用 Gradle,则可以添加自定义风格的依赖项,如下所示:

dependencies {
"freeImplementation"("com.google.android.gms:play-services-ads:7.5.0")
}