Android Gradle中基于多味库的多味应用
我的应用程序在应用程序计费系统的多个市场中具有多种风格 我有一个库,它共享我所有项目的基本代码。所以我决定将这些支付系统作为产品风格添加到这个库中 问题是android库能有产品风格吗 如果是这样,我如何在应用程序的不同风格中包含不同的风格 我搜索了很多,但是我找不到关于这个场景的任何信息。我发现的唯一相似之处是: 我改变了配置,以不同的东西,但它没有工作Android Gradle中基于多味库的多味应用,android,gradle,android-gradle-plugin,Android,Gradle,Android Gradle Plugin,我的应用程序在应用程序计费系统的多个市场中具有多种风格 我有一个库,它共享我所有项目的基本代码。所以我决定将这些支付系统作为产品风格添加到这个库中 问题是android库能有产品风格吗 如果是这样,我如何在应用程序的不同风格中包含不同的风格 我搜索了很多,但是我找不到关于这个场景的任何信息。我发现的唯一相似之处是: 我改变了配置,以不同的东西,但它没有工作 我正在使用android studio 0.8.2。目前这是不可能的,尽管如果我没记错的话,这是他们想要添加的功能。(编辑2:,) 编辑:
我正在使用android studio 0.8.2。目前这是不可能的,尽管如果我没记错的话,这是他们想要添加的功能。(编辑2:,) 编辑: 目前,我正在使用
defaultPublishConfig
选项声明发布了哪个库变量get:
android {
defaultPublishConfig fullRelease
defaultPublishConfig demoRelease
}
最后,我发现了如何做到这一点,我将在这里向面临同样问题的其他人解释: 关键部分是在library build.gradle中将publishNonDefault设置为true,然后必须按照用户指南的建议定义依赖项 整个项目将是这样的: 库构建。渐变:
apply plugin: 'com.android.library'
android {
....
publishNonDefault true
productFlavors {
market1 {}
market2 {}
}
}
apply plugin: 'com.android.application'
android {
....
productFlavors {
market1 {}
market2 {}
}
}
dependencies {
....
market1Compile project(path: ':lib', configuration: 'market1Release')
market2Compile project(path: ':lib', configuration: 'market2Release')
}
项目构建。渐变:
apply plugin: 'com.android.library'
android {
....
publishNonDefault true
productFlavors {
market1 {}
market2 {}
}
}
apply plugin: 'com.android.application'
android {
....
productFlavors {
market1 {}
market2 {}
}
}
dependencies {
....
market1Compile project(path: ':lib', configuration: 'market1Release')
market2Compile project(path: ':lib', configuration: 'market2Release')
}
现在,您可以选择AppFlavor和BuildVariants面板,相应地选择库,所有构建和运行都将基于所选的flavor完成
如果你有多个基于库的应用程序模块,Android Studio会抱怨变量选择冲突,没关系,忽略它
答案有一个问题。我们在构建变体中丢失了一个非常重要的维度。如果我们想拥有所有选项(在我下面的示例中为4(2 x 2)),我们只需在主模块build.gradle文件中添加自定义配置,就可以在
构建变体中使用所有多风格多构建类型。我们还必须在library module build.gradle文件中设置publishNonDefault true
示例解决方案:
Lib build.gradle
android {
publishNonDefault true
buildTypes {
release {
}
debug {
}
}
productFlavors {
free {
}
paid {
}
}
}
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')
}
App build.gradle
android {
publishNonDefault true
buildTypes {
release {
}
debug {
}
}
productFlavors {
free {
}
paid {
}
}
}
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')
}
要使这些风格在AAR库上工作,需要在Android库模块的build.gradle文件中定义defaultPublishConfig
有关详细信息,请参阅:
图书馆出版物
默认情况下,库只发布其版本变体。这种变体
将由引用库的所有项目使用,无论是哪一个项目
他们自己建造的变体。这是由于以下原因造成的临时限制:
我们正在努力消除的渐变限制。你可以
控制发布哪个变量:
android {
defaultPublishConfig fullRelease
defaultPublishConfig demoRelease
}
安卓{
defaultPublishConfig“调试”}
请注意,此发布配置名称引用了完整的
变体名称。发布和调试仅在没有
口味。如果要在
使用flavors,您可以编写:
安卓{
defaultPublishConfig“flavor1Debug”}
我知道这个主题已经结束了,但只是对gradle 3.0的更新,请参见:和grepmatchingFallbacks
和missingDimensionStrategy
。
现在,声明模块风格之间的依赖关系变得更加简单
…在gradle3.0的这种情况下,由于口味共享相同的名称,gradle会神奇地映射它们,不需要配置。Android插件3.0.0及更高版本的更新
根据Android官方文档-
有了变量感知依赖项解析,您不再需要为本地模块依赖项使用特定于变量的配置,例如freeDebugImplementation,插件会为您解决这一问题
您应该按照以下方式配置依赖项:
所以在阿里的回答中,改变
dependencies {
....
market1Compile project(path: ':lib', configuration: 'market1Release')
market2Compile project(path: ':lib', configuration: 'market2Release')
}
到
插件将自动处理特定于变体的配置。希望它能帮助其他人将Android Studio插件升级到3.0.0及更高版本。我在编译各种选项的模块时也遇到了问题
我发现:
看起来我们不需要将publishnondefaulttrue
添加到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')
...
}
此外,还可以使用来限制生成变体
注意:不要忘记在设置.gradle
文件中包含模块,如:
include ':app'
include ':lib'
project(':lib').projectDir = new File('app/libs/lib')
我的Android插件是3.4.0,我发现它现在不需要配置。你只需要确保应用程序中的flavorDimensions和productFlavors在库中包含一个具有相同flavorDimensions和productFlavors的productFlavor。对于示例:
在我图书馆的建筑中
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')
}
同步后,您可以在“生成变体”窗口中切换所有选项:
在这种情况下。如何导入特定生成的依赖项。例如:market1Common1Debug
Market1Common1Debugine实现“androidx.appcompat:1.2.0”
所以,每次我要编译应用程序时,我都必须在库的build.gradle中更改它?嗯,是的……每次你都想用不同的风格编译应用程序。实际上,当我为库模块定义风格时,在应用程序模块中找不到继承的R包。是否将gradle文件同步为?@Delblanco这看起来像是体力劳动,而且非常脆弱(开发人员很懒,忘记修改build.gradle文件)。感谢分享,现在我可以摆脱defaultPublishConfig解决方案。以1.1.0运行时,上述解决方案似乎仍然有效,然而