The*_*ppo 16 android gradle android-gradle-plugin
我已经创建了一个Android应用程序,需要构建多种(30多种)风格.
我的想法是productFlavors直接从我的src目录中的文件夹结构生成不同的,因为配置总是非常相似(基本上只是另一个packageName,一个新的启动器图标和一些字符串更改).
该src文件夹是这样的:
??? src
??? flavor1
? ??? flavor2.keystore
? ??? res
??? flavor2
? ??? res
? ??? flavor2.keystore
??? main
??? AndroidManifest.xml
??? java
??? res
Run Code Online (Sandbox Code Playgroud)
如果我必须手动创建gradle属性,它看起来会像这样:
android {
....
productFlavors {
flavor1 {
packageName 'com.example.flavor1'
}
flavor2 {
packageName 'com.example.flavor2'
}
}
}
Run Code Online (Sandbox Code Playgroud)
每次我尝试productFlavors在创建后更改配置时,我都会收到错误或者无提示地忽略更改/添加.
这可能是我造成的问题,因为我的Gradle/Groovy体验非常有限,或者这是不可能的.
我大多得到错误,说GroupableProductFlavorDsl_Decorated不能按我想要的方式操纵.
我想要存档的内容应该是这样的:
android {
....
def flavors = getMyFlavorsFromFileSystem()
productFlavors {
}
flavors.each { name, config ->
productFlavors[name] << config
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我知道这个问题基本上是一个旧问题的重复,遗憾的是从来没有回答过.由于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.
*/
Run Code Online (Sandbox Code Playgroud)
变式2:
android {
productFlavors {
}
productFlavors['flavor1'] = {
packageName "com.example.flavor1"
}
productFlavors['flavor2'] = {
packageName "com.example.flavor2"
}
}
/*
no error, but does not work
*/
Run Code Online (Sandbox Code Playgroud)
变式3:
android {
productFlavors {
}
productFlavors['flavor1'] = [packageName: "com.example.flavor1"]
productFlavors['flavor2'] = [packageName: "com.example.flavor2"]
}
/*
no error, but does not work
*/
Run Code Online (Sandbox Code Playgroud)
所有这些都是一个要点.
The*_*ppo 19
通过反复试验解决:
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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道已经有了答案,但我将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
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
| 归档时间: |
|
| 查看次数: |
4462 次 |
| 最近记录: |