我创建了一个Android App,需要构建多个(30+)口味。
我的想法是直接从src
目录中的文件夹结构生成不同的productFlavors
,因为配置总是非常相似的(基本上只是另一个packageName、一个新的启动图标和一些字符串的更改)。
src
文件夹的结构如下:
└── src
├── flavor1
│ ├── flavor2.keystore
│ ├── res
├── flavor2
│ ├── res
│ ├── flavor2.keystore
└── main
├── AndroidManifest.xml
├── java
└── res
如果我必须手动创建Gradle属性,它看起来会像这样:
android {
....
productFlavors {
flavor1 {
packageName 'com.example.flavor1'
}
flavor2 {
packageName 'com.example.flavor2'
}
}
}
每当我尝试在创建productFlavors
配置后更改它时,要么会出现错误,要么更改/添加会被无声地忽略。这可能是由于我的Gradle/Groovy经验非常有限,或者这是不可能实现的。
我大多数时候会遇到错误,提示无法按我想要的方式操作
GroupableProductFlavorDsl_Decorated
。我想要实现的目标应该类似于这样:
android {
....
def flavors = getMyFlavorsFromFileSystem()
productFlavors {
}
flavors.each { name, config ->
productFlavors[name] << config
}
}
注意: 我知道这个问题基本上是一个旧问题的重复,而那个问题很遗憾从未得到答案。由于Gradle在Android世界中有点新,我希望能够得到更多答案,因为现在有更多的开发人员正在使用Gradle。
更新:
下面是我尝试的一些非常简单的方法:
变体1:
android {
productFlavors {
}
productFlavors['flavor1'] << {
packageName "com.example.flavor1"
}
productFlavors['flavor2'] << {
packageName "com.example.flavor2"
}
}
/*
A problem occurred evaluating root project 'MyProject'.
> GroupableProductFlavorDsl with name 'flavor1' not found.
*/
变体2:
android {
productFlavors {
}
productFlavors['flavor1'] = {
packageName "com.example.flavor1"
}
productFlavors['flavor2'] = {
packageName "com.example.flavor2"
}
}
/*
no error, but does not work
*/
变体3:
android {
productFlavors {
}
productFlavors['flavor1'] = [packageName: "com.example.flavor1"]
productFlavors['flavor2'] = [packageName: "com.example.flavor2"]
}
/*
no error, but does not work
*/
他们都被放在一个Gist上。