如何指定每个flavor buildType sourceSets?

smo*_*oak 14 android gradle

我有两种版本的应用程序,每个应用程序都有自己的谷歌地图(v1)密钥用于调试和发布(总共4个密钥).所以我想知道我是否可以根据buildType和productFlavor指定sourceSets.从本质上讲,我想知道如何实现这样的目标:

src
??? debug
?   ??? flavor1
?       ??? res
?           ??? values
?               ??? gmaps_key.xml
??? release
?   ???flavor1
?       ??? res
?           ??? values
?               ??? gmaps_key.xml
Run Code Online (Sandbox Code Playgroud)

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'
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Saa*_*ooq 15

我碰巧回到这里是因为对我的回答发表评论,并意识到这个答案是多余的(仍然比被接受的答案更好).对于每个productFlavor和buildType,组合和各个源集已经存在.ie src/{buildType},src/{productFlavor}并且src/{productFlavor}{buildType}已经是可用的源文件夹.

所以基本上,这是需要的OP一切都投入在资源src/flavor1Debug这相当于给src/debug/flavor1了OP设想.

老回答: 我做过类似的事情,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'
                    }

            }
        }
}
Run Code Online (Sandbox Code Playgroud)

我没有测试过这个.我想你可能需要使用android.sourceSets而不仅仅是sourceSets.

我还需要为其定义单独的资源,productFlavors因此我在构建文件的后期使用了单独的语句.像这样:

android.sourceSets.flavor1 {
    res.srcDirs = ['flavor_resources/flavor1/res']
}
Run Code Online (Sandbox Code Playgroud)

android.sourceSets.flavor1.debug如果需要,您应该可以使用.

另请注意,根据Android Gradle 用户指南,使用srcDir将目录添加到默认源并srcDirs替换它们.


sha*_*aca 5

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

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