我有2种应用程序,每种都有自己的谷歌地图(v1)密钥用于调试和发布(总共4个密钥)。所以我想知道我是否可以根据buildType和productFlavor指定sourceSets。基本上,我想知道如何实现这样的目标:
src
├── debug
│ └── flavor1
│ └── res
│ └── values
│ └── gmaps_key.xml
├── release
│ └──flavor1
│ └── res
│ └── values
│ └── gmaps_key.xml
gradle将使用src/<currentBuldType>/<currentProductFlavor>/*
作为其sourceSet的一部分。
基本上我想要它,这样如果我运行gradle assembleFlavor1Debug
,它将包含src/main/*
,src/flavor1/*
和src/debug/flavor1/*
下的所有内容。
我的build.gradle非常简单:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.0'
}
}
apply plugin: 'android'
android {
compileSdkVersion 8
productFlavors {
flavor1 {
packageName 'com.flavor1'
}
flavor2 {
packageName 'com.flavor2'
}
}
}
有什么想法?或者更好的方法呢?
答案 0 :(得分:15)
我碰巧回到这里是因为对我的回答发表评论,并意识到这个答案是多余的(仍然比被接受的答案更好)。对于每个productFlavor和buildType,组合和各个源集已经存在。即src/{buildType}
,src/{productFlavor}
和src/{productFlavor}{buildType}
已经是可用的源文件夹。
基本上,OP所需要的只是将资源放在src/flavor1Debug
中,这相当于OP所设想的src/debug/flavor1
。
OLD ANSWER:
我已经使用buildConfig
做了类似的事情,但希望它可以与sourceSets
一起使用。
基本上,您可以在变量的productFlavors
级别定义常用内容,并在向下移动时继续添加内容。
productFlavors {
def common = 'src/main'
flavor1 {
def flavor = 'src/main/flavor1'
buildTypes {
debug {
sourceSets {
res.srcDirs = [ common + ',' + flavor + ',' + 'src/main/debug'
}
}
release {
sourceSets {
res.srcDirs = [ common + ',' + flavor + ',' + 'src/main/release'
}
}
}
}
我没有测试过这个。我想您可能需要使用android.sourceSets
而不仅仅是sourceSets
。
我还需要为productFlavors
定义单独的资源,所以我在构建文件的后期使用了单独的语句。像这样:
android.sourceSets.flavor1 {
res.srcDirs = ['flavor_resources/flavor1/res']
}
如果需要,您应该可以使用android.sourceSets.flavor1.debug
。
另请注意,根据Android Gradle user guide,使用srcDir
将目录添加到默认来源,srcDirs
替换它们。
答案 1 :(得分:4)
对于Google Maps API集成,您可以在此处查看我的gradle示例代码:https://github.com/shakalaca/learning_gradle_android/tree/master/07_tricks
在android.applicationVariants.all
阶段基本上在mergeResources
中做一个小技巧,并将API密钥放在strings.xml下不同的flaver / buildtype组合文件夹下。