非常感谢Scott Barta的建议和解释,他解释了为什么我的解决方案不起作用(这也让我重新考虑了一些事情)。我基本上想出了不同的方法来完成我需要的事情。
除非您需要做的无法通过根据构建类型和Flavors组织Android资源树(即通过约定)实现,否则我建议选择选项2。尽管我为了参考目的保留了选项1,因为它涵盖了产品Flavor属性扩展的有趣主题。
- 自定义基于属性的选项:Product Flavors允许您定义自定义属性,从而扩展产品Flavor。Xavier Ducrohet在此处提供了一个示例:https://dev59.com/UGMm5IYBdhLWcg3wVdx5#17708357
我会提供一个非常简单且类似于上面提供的示例,但在我的情况下,我需要一个字符串属性,而不是布尔属性。
class StringExtension {
String value
StringExtension (String value) {
this.value = value
}
public void setValue(String value) {
this.value = value
}
public String getValue() {
return value
}
}
android {
productFlavors.whenObjectAdded { flavor ->
flavor.extensions.create("myProperty", StringExtension , '')
}
productFlavors {
customerA{
myProperty.value 'customerA'
}
customerB{
myProperty.value 'customerB'
}
}
}
preBuild << {
android.applicationVariants.all { variant ->
variant.productFlavors.each { flavor ->
println "Building customer" + flavor.customerName.value
}
}
}
后来我意识到,上述操作完全是不必要的,因为我只需要我的口味名称(不带构建类型),一旦找到了给我提供口味名称的属性,我就能够按照以下方式修改所有上述代码:
通过访问已经存在的产品口味属性 "name",将口味名称直接用作客户名称。
android {
productFlavors {
customerA{
}
customerB{
}
}
}
preBuild << {
android.applicationVariants.all { variant ->
variant.productFlavors.each { flavor ->
println "Building customer" + flavor.name
}
}
}
以上的描述更加合理,因为我的Android资源目录结构是根据实际的版本命名的。
后者也导致我找到了原问题的最终解决方案:
- 基于资源目录的方法
旨在根据是发布版还是调试版修改每个客户的xml文件夹中的文件。这可以通过相应的文件夹结构来实现。根据原始问题,我们有3个客户,并且每个客户都有一个调试版和一个发布版。前面提到的xml文件对于每个客户和生成类型都是不同的。因此以下是相应的目录结构:
src/
- customerA
//Contains all relevant resource files specific to customer A
- customerB
//Contains all relevant resource files specific to customer B
- customerC
//Contains all relevant resource files specific to customer C
- customerADebug
//Contains debug server-settings file for customer A
- customerBDebug
//Contains debug server-settings file for customer B
- customerCDebug
//Contains debug server-settings file for customer C
- customerARelease
//Contains release server-settings file for customer A
- customerBRelease
//Contains release server-settings file for customer B
- customerCRelease
//Contains release server-settings file for customer C
因此,每种产品风味的主要内容都在与风味同名的文件夹中(例如customerA,customerB等,请参见上面代码段的第一部分)。现在,这个文件(基于不同客户的debug或release构建而有所不同)将被放入相应的文件夹中,如customerADebug--> 包含调试模式下的服务器设置文件等。
当你构建customerA时,如果你构建的是debug或release版本,系统会自动选择正确的文件。
回答我的帖子更新部分:
产品风味名称(不包括buildType):
flavor.name(其中flavor是productFlavor)