如何为不同的产品风格定义不同的依赖关系
Posted
技术标签:
【中文标题】如何为不同的产品风格定义不同的依赖关系【英文标题】:How to define different dependencies for different product flavors 【发布时间】:2013-08-14 08:29:35 【问题描述】:我正在将我的一个应用程序转换为 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 文件夹合并?
如果可以的话,我将如何定义这个文件夹?
【问题讨论】:
访问此主题:***.com/questions/24860659/… 【参考方案1】:要定义特定风格的依赖项,您可以在依赖项部分使用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'
【讨论】:
我正在尝试这个并得到这个错误,Error:(28, 0) Build script error, unsupported Gradle DSL method found: 'glassCompile()'!
(我试图添加依赖的味道是“玻璃”。)
啊,看来您必须将 dependencies
块移到 android
块下方。多么直观。
请注意,如果风味名称以大写字母开头,Gradle 生成的 xxxCompile
闭包将不起作用。
“packageName”应该是“applicationId”
如何处理不调用 Ad 类?【参考方案2】:
快进到 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。 请为此添加一个单独的问题。在评论部分链接它。请添加您要实现的目标的完整详细信息。 :)【参考方案3】:您需要为每种风味手动添加配置。示例
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'
【讨论】:
如何从那里继续?如何激活不同的配置?这是否仅适用于 Android 版本?非 Android 版本有可能吗?【参考方案4】:简单:
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'
【讨论】:
【参考方案5】:编辑:我建议使用其他技术之一!
接受的答案的替代方案是:
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.+'
【讨论】:
这不允许您一次构建多种口味,这对我们大多数人来说是一种破坏交易的方式。此外,它可能也不适用于 android studio 这是在依赖块中吗? 这个块是否依赖? 嗯...不能很好地扩展 10 或 50 种口味,是吗? @Ewoks 我想做很多口味,你有什么更好的主意吗?【参考方案6】:如果您将 Gradle 与 Kotlin 一起使用,则可以添加自定义风格的依赖项,如下所示:
dependencies
"freeImplementation"("com.google.android.gms:play-services-ads:7.5.0")
【讨论】:
以上是关于如何为不同的产品风格定义不同的依赖关系的主要内容,如果未能解决你的问题,请参考以下文章