Как я могу указать для каждого аромата buildType sourceSets?

У меня есть 2 варианта приложения, каждое из которых имеет свой собственный ключ google maps (v1) для отладки и выпуска (то есть всего 4 ключа). Поэтому я хотел бы знать, могу ли я указать исходные наборы на основе buildType и productFlavor. По сути, мне интересно, как я могу достичь чего-то вроде этого:

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 ответа

Решение

Для интеграции Google Maps API вы можете проверить мой пример кода здесь: https://github.com/shakalaca/learning_gradle_android/tree/master/07_tricks

В основном сделать небольшой трюк в android.applicationVariants.all в течение mergeResources этап и поместите ключ API в strings.xml в другую папку комбинации flaver/buildtype.

Я случайно вернулся к этому из-за комментария к моему ответу и понял, что этот ответ является излишним (все же лучше, чем принятый, который тем более). Для каждого productFlavor и buildType комбинация и отдельные исходные наборы уже существуют. т.е. src/{buildType}, src/{productFlavor} а также src/{productFlavor}{buildType} уже доступны исходные папки.

По сути, все, что было необходимо для ФП, - это 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, используя srcDir добавляет каталог к ​​источникам по умолчанию и srcDirs заменяет их.

Другие вопросы по тегам