我已经创建了一个Android应用程序,需要构建多种(30多种)风格.
我的想法是productFlavors
直接从我的src
目录中的文件夹结构生成不同的,因为配置总是非常相似(基本上只是另一个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 */
所有这些都是一个要点.
通过反复试验解决:
android { // let's assume these are return by a function which reads the filesystem def myFlavors = [ flavor1: [ packageName: "com.example.flavor1" ], flavor2: [ packageName: "com.example.flavor2" ] ] productFlavors { myFlavors.each { name, config -> "$name" { packageName config.packageName } } } }
我知道已经有了答案,但我将Chris.Zou的方法与TheHippo结合起来.并添加我自己的方法来做到这一点.
基本上,在处理flavor时,我们通常使用包含资源的/ app/src /下的不同目录.由于目录名称等于包名称,我只列出该文件夹下的目录(不包括"main"和"androidTest").
所以这是我完整的,有效的gradle脚本:
def map = [:] new File("./app/src").eachFile() { file-> def fileName = file.getName() if( fileName == "main" || fileName == "androidTest") { return } map.put(fileName, 'com.mypackagename.' + fileName ) } productFlavors { map.each { flavorName, packagename -> "$flavorName" { applicationId packagename } } }
编辑:
还想补充一点,com.mypackagename基本上是所有风味的根路径.
我有一个单独的脚本,将flavor目录复制粘贴到/ app/src /文件夹.