我的应用程序针对多个市场应用内结算系统提供了多种风格。
我有一个库,它共享我所有项目的基本代码。所以我决定将这些支付系统作为产品口味添加到这个库中。
问题是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')
}
我将配置改为不同的东西,但它没有用!
我使用的是android studio 0.8.2。
答案 0 :(得分:133)
最后我发现了如何做到这一点,我将在这里为面临同样问题的其他人解释:
关键部分是在库build.gradle中将publishNonDefault设置为true,然后您必须按用户指南的建议定义依赖项。
整个项目将是这样的:
图书馆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')
}
现在您可以选择应用程序风格和“构建变体”面板,并相应地选择库,所有构建和运行都将根据所选的风格完成。
如果你有多个基于库的app模块,Android Studio会抱怨Variant选择冲突,没关系,只需忽略它。
答案 1 :(得分:34)
Ali回答有一个问题。我们在构建变体中失去了一个非常重要的维度。如果我们想要所有选项(在我的示例中低于4(2 x 2)),我们只需在主模块build.gradle 文件中添加自定义配置即可在addBorder:forView
中使用所有多风味的multi-buildType。我们还必须在库模块build.gradle 文件中设置 publishNonDefault true 。
示例解决方案:
Lib build.gradle
Build Variants
App build.gradle
android {
publishNonDefault true
buildTypes {
release {
}
debug {
}
}
productFlavors {
free {
}
paid {
}
}
}
答案 2 :(得分:14)
Android插件3.0.0及更高版本的更新
根据官方Android文档 - Migrate dependency configurations for local modules,
使用变体感知依赖项解析,您不再需要为本地模块依赖项使用特定于变体的配置(例如freeDebugImplementation) - 插件会为您处理此事
您应该按如下方式配置依赖项:
dependencies {
// This is the old method and no longer works for local
// library modules:
// debugImplementation project(path: ':library', configuration: 'debug')
// releaseImplementation project(path: ':library', configuration: 'release')
// Instead, simply use the following to take advantage of
// variant-aware dependency resolution. You can learn more about
// the 'implementation' configuration in the section about
// new dependency configurations.
implementation project(':library')
// You can, however, keep using variant-specific configurations when
// targeting external dependencies. The following line adds 'app-magic'
// as a dependency to only the "debug" version of your module.
debugImplementation 'com.example.android:app-magic:12.3'
}
所以在阿里的回答中,改变
dependencies {
....
market1Compile project(path: ':lib', configuration: 'market1Release')
market2Compile project(path: ':lib', configuration: 'market2Release')
}
到
implementation project(':lib')
插件将自动处理变体特定配置。希望其他人将Android Studio插件升级到3.0.0及更高版本会有所帮助。
答案 3 :(得分:2)
要获得AAR库上的风格,您需要在Android库模块的build.gradle文件中定义defaultPublishConfig。
有关详细信息,请参阅:Library Publication。
图书馆出版
默认情况下,库仅发布其版本变体。这个变种 将被引用库的所有项目使用,无论哪个 变种他们自己建立。由于这是暂时的限制 我们正在努力消除的Gradle限制。您可以 控制哪个变体发布:
android { defaultPublishConfig“debug”}
请注意,此发布配置名称引用了完整名称 变体名称。发布和调试仅在没有时才适用 口味。如果您想要更改默认发布的变体 使用flavor,你会写:
android { defaultPublishConfig“flavor1Debug”}
答案 4 :(得分:1)
目前它是不可能的,尽管如果我没记错它想要添加的功能。 (编辑2:link,link2)
编辑:
目前我正在使用defaultPublishConfig
选项声明哪些库变体已发布:
android {
defaultPublishConfig fullRelease
defaultPublishConfig demoRelease
}
答案 5 :(得分:1)
我知道此主题已关闭,但只是使用gradle 3.0进行更新,请参阅:https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#variant_aware和grep matchingFallbacks
以及missingDimensionStrategy
。
现在,声明模块风格之间的依赖关系变得更加简单。
...在这个精确的情况下使用gradle3.0,由于风味共享相同的名称,gradle会神奇地映射它们,不需要配置。
答案 6 :(得分:1)
我还遇到了为各种选项编译模块的问题。
我发现了什么:
看起来我们不需要将publishNonDefault true
添加到lib的build.gradle
文件中,因为 Gradle 3.0.1 。
反编译一个类BaseExtension
后发现了这个:
public void setPublishNonDefault(boolean publishNonDefault) {
this.logger.warn("publishNonDefault is deprecated and has no effect anymore. All variants are now published.");
}
而不是:
dependencies {
...
Compile project(path: ':lib', configuration: 'config1Debug')
}
我们应该使用:
dependencies {
...
implementation project(':lib')
}
唯一重要的是在configurations {...}
添加build.gradle
部分。
因此,应用程序build.gradle
文件的最终变体是:
buildTypes {
debug {
...
}
release {
...
}
}
flavorDimensions "productType", "serverType"
productFlavors {
Free {
dimension "productType"
...
}
Paid {
dimension "productType"
...
}
Test {
dimension "serverType"
...
}
Prod {
dimension "serverType"
...
}
}
configurations {
FreeTestDebug
FreeTestRelease
FreeProdDebug
FreeProdRelease
PaidTestDebug
PaidTestRelease
PaidProdDebug
PaidProdRelease
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':lib')
...
}
此外,您可以使用Filter variants来限制构建变体。
P.S。不要忘记在settings.gradle
文件中包含模块,例如:
include ':app'
include ':lib'
project(':lib').projectDir = new File('app/libs/lib')
答案 7 :(得分:1)
我的Android插件是3.4.0,我发现它现在不需要配置。所有您需要确保应用程序中的flavorDimensions和productFlavors在库中包含一个具有相同flavorDimensions和productFlavors的productFlavor。 :
在图书馆的build.gradle中
apply plugin: 'com.android.library'
android {
....
flavorDimensions "mylibFlavor"
productFlavors {
market1
market2
}
}
应用程序的build.gradle:
apply plugin: 'com.android.application'
android {
....
flavorDimensions "mylibFlavor", "appFlavor"
productFlavors {
market1 {
dimension "mylibFlavor"
}
market2 {
dimension "mylibFlavor"
}
common1 {
dimension "appFlavor"
}
common2 {
dimension "appFlavor"
}
}
}
dependencies {
....
implementation project(path: ':mylibrary')
}
答案 8 :(得分:0)