Android 使用gradle DSL在多模块项目中声明风味依赖项

Android 使用gradle DSL在多模块项目中声明风味依赖项,android,android-productflavors,gradle-kotlin-dsl,Android,Android Productflavors,Gradle Kotlin Dsl,假设: 模块M(Android库)具有M1和M2 功能模块F取决于模块M 应用程序A取决于功能模块F,并且具有A1和A2 (与M中的尺寸不同) 此外,AppAflavorA1 取决于M1,A2取决于M2 是否可以在Gradle Kotlin DSL中配置此类依赖项?特别是考虑到模块F对A1和A2口味一无所知 编辑一些额外信息:在我的特殊情况下,M1和M2仅用于引入特定资产。因此F并不关心这些,因此一般依赖于M我能够用缺失维度策略解决您的问题 以下是简短的脚本: 模块/build.gradle

假设:

  • 模块M(Android库)具有M1M2
  • 功能模块F取决于模块M
  • 应用程序A取决于功能模块F,并且具有A1A2 (与M中的尺寸不同)
  • 此外,AppAflavorA1 取决于M1A2取决于M2
是否可以在Gradle Kotlin DSL中配置此类依赖项?特别是考虑到模块FA1A2口味一无所知


编辑一些额外信息:在我的特殊情况下,M1M2仅用于引入特定资产。因此F并不关心这些,因此一般依赖于M

我能够用
缺失维度策略解决您的问题

以下是简短的脚本:

模块/build.gradle.kts

android{
尺寸(“模块尺寸”)
产品风味{
创建(“模块1”){
setDimension(“模块维度”)
}
创建(“模块2”){
setDimension(“模块维度”)
}
}
}
feature/build.gradle.kts

android{
尺寸(“特征尺寸”)
产品风味{
创建(“功能1”){
设置尺寸(“特征尺寸”)
//告诉gradle将“module”模块的“module1”风格用于此风格。
缺失维度策略(“模块维度”、“模块1”)
}
创建(“功能2”){
设置尺寸(“特征尺寸”)
缺失维度策略(“模块维度”、“模块2”)
}
}
}
依赖关系{
实施(项目(“:模块”))
}
我不得不在F模块(我猜是android库模块)中引入flavorsF1F2。您说“功能模块F取决于模块M”,但是M的味道是什么?我猜这和应用程序所依赖的味道是一样的。在任何情况下,如果在功能模块中不提供特定于味道的代码,结果都是一样的

app/build.gradle.kts

android{
维度(“应用程序维度”)
产品风味{
创建(“app1”){
setDimension(“应用程序维度”)
缺失维度策略(“模块维度”、“模块1”)
缺失维度策略(“特征维度”、“特征1”)
}
创建(“app2”){
setDimension(“应用程序维度”)
缺失维度策略(“模块维度”、“模块2”)
缺失维度策略(“特征维度”、“特征2”)
}
}
}
依赖关系{
实施(项目(“:模块”))
实施(项目(“:功能”))
}
如果F只依赖于M,那么您可以将F的口味和口味维度重命名为与M口味相同,从而稍微简化此操作。这样可以避免在F中指定
missingDimensionStrategy
,并且在A中只使用其中一个而不是两个。这是因为当不同模块的风格匹配时,构建系统会自动解析正确的风格

您将看到,当您更改A的味道时,Android Studio会自动为FM选择正确的味道

正如您所问,FA1A2一无所知。我希望这能回答你的问题。如果没有,请留下评论

面临同样的问题
您只需将您的口味描述从:app gradle复制到:module gradle并更改路径
我的文件:
应用程序:

登录模块:

谢谢!我在问题中添加了一些额外的信息。一旦我添加了模块风格,我就会得到这样一句话:“无法解析''的依赖关系:myfeature@debugUnitTest/compileClasspath':无法解析project:mymodule“看起来我需要在M和A之间的每个级别(在我的示例中为F,但在我的实际项目中为5个级别)指定在
feature/build.gradle.kts
中显示的内容”我得到的最好结果是在模块层次结构中复制M1/M2风格,然后在顶层(应用程序)应用missingDimensionStrategy。这似乎是可行的,但在AndroidStudio中,我得到了变量选择冲突,因为F中的变量(F2)特定依赖项依赖于M2,但选择了M1。换句话说,它在抱怨一种不可能的变异冲突。嗯,我明白了。我刚刚看到了您的编辑,我认为最好的解决方案是将M中的资产分离到一个额外的非风格模块中,这将由M和F共同决定。也许,尽管我可以预见将来需要在其他模块中使用M维度。从概念上讲,A1取决于味道M1,A2和A3取决于M2。对于资产,目前我只是在应用程序级gradle中指定源集,如:
sourceset.getByName(“a1”){assets.srcDir(../mymodule/src/m1/assets”)}