如何指定每个flavor buildType sourceSets?

时间:2013-08-08 06:33:11

标签: android gradle

我有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'
        }
    }
}

有什么想法?或者更好的方法呢?

2 个答案:

答案 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组合文件夹下。