Android Gradle中基于多风味库的多风味应用

我的应用程序有几个市场的应用程序计费系统的味道。

我有一个共享我所有项目的基本代码的库。 所以我决定把这些支付系统作为产品口味添加到这个库中。

问题是可以android库有产品口味?

如果是这样,我怎么能包括不同口味的应用程序的风味?

我搜查了很多,我找不到这种情况。 唯一接近的东西是我在http://tools.android.com/tech-docs/new-build-system/user-guide :

dependencies { flavor1Compile project(path: ':lib1', configuration: 'flavor1Release') flavor2Compile project(path: ':lib1', configuration: 'flavor2Release') } 

我改变了configuration到不同的东西,但它没有工作!

我正在使用android studio 0.8.2。

最后我发现如何做到这一点,我将在这里解释它面对同样的问题的其他人:

关键部分是在library build.gradle中将publishNonDefault设置为true,然后必须按照用户指南的build议定义依赖关系。

整个项目将是这样的:

库build.gradle:

 apply plugin: 'com.android.library' android { .... publishNonDefault true productFlavors { market1 {} market2 {} } } 

项目build.gradle:

 apply plugin: 'com.android.application' android { .... productFlavors { market1 {} market2 {} } } dependencies { .... market1Compile project(path: ':lib', configuration: 'market1Release') market2Compile project(path: ':lib', configuration: 'market2Release') } 

现在,您可以select应用程序风格和构build变体面板,并将相应地select库,所有构build和运行将基于所选的风味来完成。

如果你有多个基于库的应用程序模块Android Studio会抱怨Variantselect冲突,没关系,只要忽略它。

在这里输入图像描述

阿里回答有一个问题。 我们在构build变体中失去了一个非常重要的维度。 如果我们想要所有的选项(在我的例子中是4(2 x 2)以下),我们只需要在主模块build.gradle文件中添加自定义configuration ,以便能够在Build Variants使用所有多风格的多buildType。 我们还必须在库模块build.gradle文件中设置publishNonDefault为true

示例解决scheme

Lib build.gradle

 android { publishNonDefault true buildTypes { release { } debug { } } productFlavors { free { } paid { } } } 

应用程序build.gradle

 android { buildTypes { debug { } release { } } productFlavors { free { } paid { } } } configurations { freeDebugCompile paidDebugCompile freeReleaseCompile paidReleaseCompile } dependencies { freeDebugCompile project(path: ':lib', configuration: 'freeDebug') paidDebugCompile project(path: ':lib', configuration: 'paidDebug') freeReleaseCompile project(path: ':lib', configuration: 'freeRelease') paidReleaseCompile project(path: ':lib', configuration: 'paidRelease') } 

目前这是不可能的,但如果我正确地记得它想要添加的function。 (编辑2: 链接 , 链接 2)

编辑:目前,我正在使用defaultPublishConfig选项来声明哪个库变体得到发布:

 android { defaultPublishConfig fullRelease defaultPublishConfig demoRelease } 

你也可以使用它来具有风味相关的编译:

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

要获得在AAR库上的风格,你需要在你的Android库模块的build.gradle文件中定义defaultPublishConfig。

有关更多信息,请参阅: 库出版物 。

图书馆出版物

默认情况下,库只发布其版本变体。 所有引用这个库的项目都将使用这个变体,不pipe他们自己构build哪个变体。 由于我们正在努力消除的Gradle限制,这是一个暂时的限制。 您可以控制发布哪个变体:

android {defaultPublishConfig“debug”}

请注意,此发布configuration名称引用完整的变体名称。 发布和debugging只适用于没有风味的情况。 如果您想在使用flavor时更改默认发布的变体,则可以这样写:

android {defaultPublishConfig“flavor1Debug”}

我知道这个主题已经closures,但只是一个更新与Gradle 3.0,请参阅: https : //developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#variant_aware和grep matchingFallbacksmissingDimensionStrategy 。 现在,声明模块风格之间的依赖关系更为简单。

…在这个精确的情况下,使用gradle3.0,由于风格共享相同的名称,gradle会神奇地映射它们,不需要configuration。