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 matchingFallbacks
和missingDimensionStrategy
。 现在,声明模块风格之间的依赖关系更为简单。
…在这个精确的情况下,使用gradle3.0,由于风格共享相同的名称,gradle会神奇地映射它们,不需要configuration。