我创建了一个Android应用程序,需要在许多(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
}
}
**注意:**我知道这个问题基本上是一个老问题的duplicate,遗憾的是这个问题从未得到回答。由于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。
4条答案
按热度按时间rlcwz9us1#
通过反复试验解决:
oipij1gg2#
我知道这个问题已经有了答案,但我把邹春义的方法和TheHippo结合起来,并加入了我自己的方法。
基本上,在处理flavors时,我们通常使用包含资源的/app/src/下的不同目录。由于目录名与包名相同,因此我只列出了该文件夹下的目录(不包括“main”和“androidTest”)。
下面是我完整的工作脚本:
编辑:
2guxujil3#
由于问题的作者不想分享他阅读文件的代码,我将写我所做的。我把所有的变量名放在一个名为“app/build_variants. txt”的文件中,每个变量一行,如下所示:
在“app/build.gradle”中:
这将产生与以下代码相同的结果:
这里的关键是
new File('app/build_variants.txt').eachLine { "$it" { resValue "string", "build_variant_name", "$it" } }
行。它读取文件“app/build_variants.txt”,并为每一行生成一个产品风味,名称在它读取的行中。$it
是它传入的行。它只是groovy的闭包语法。如果你想更深入地理解。我强烈推荐观看@丹尼尔Lew关于groovy和gradle的视频。它太棒了!tquggr8v4#
这个答案很晚才给出,但可能对某些人有用。我们有200多种口味,我们只通过一个.json文件来管理它们。
1.在app文件夹中创建 keystores 和 projects_info 文件夹。现在在projects_info文件夹中创建
projects_info.json
文件,并插入每种风格的信息。src
文件夹中创建不同风格的文件夹,并放置相应的代码/资源。1.将此代码添加到应用级别的
build.gradle
文件中,并将项目与gradle同步。