14

I've got 2 flavors of an app that each have their own google maps (v1) key for debug and release (meaning 4 keys total). So I'd like to know if I can specify sourceSets based on the buildType and productFlavor. Essentially, I'm wondering how I can achieve something like this:

src
├── debug
│   └── flavor1
│       └── res
│           └── values
│               └── gmaps_key.xml
├── release
│   └──flavor1
│       └── res
│           └── values
│               └── gmaps_key.xml

Where gradle will use the src/<currentBuldType>/<currentProductFlavor>/* as part of its sourceSet.

Essentially I want it so that if I run gradle assembleFlavor1Debug it will include everything under src/main/*, src/flavor1/*, and src/debug/flavor1/*.

My build.gradle is super simple:

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

Any thoughts? Or maybe a better approach to this?

4

2 回答 2

17

由于对我的答案的评论,我碰巧回到了这个问题,并意识到这个答案是多余的(仍然比接受的答案更好,更是如此)。对于每个 productFlavor 和 buildType,组合和单独的源集已经存在。即src/{buildType}src/{productFlavor}并且src/{productFlavor}{buildType}已经是可用的源文件夹。

因此,从本质上讲,OP 所需要的只是将资源放入与 OP 设想的资源src/flavor1Debug相当的资源中。src/debug/flavor1

旧答案: 我已经做过类似的事情,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用户指南, usingsrcDir将目录添加到默认源并srcDirs替换它们。

于 2013-08-31T04:28:24.610 回答
5

对于 Google Maps API 集成,您可以在此处查看我的 gradle 示例代码:https ://github.com/shakalaca/learning_gradle_android/tree/master/07_tricks

基本上android.applicationVariants.all在这个mergeResources阶段做一个小技巧,把 API key 放在 strings.xml 中不同的 flaver/buildtype 组合文件夹下。

于 2013-09-05T08:04:52.850 回答