Подтвердить что ты не робот

Как я могу указать атрибут buildType sourceSets?

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

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

Где gradle будет использовать src/<currentBuldType>/<currentProductFlavor>/* как часть своего исходного набора.

По сути, я хочу, чтобы, если я запустил gradle assembleFlavor1Debug, он будет включать все под src/main/*, src/flavor1/* и src/debug/flavor1/*.

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

Любые мысли? Или, может быть, лучший подход к этому?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Таким образом, все, что было необходимо для OP, заключалось в том, чтобы поместить ресурсы в src/flavor1Debug, что эквивалентно src/debug/flavor1, который предполагает OP.

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, если вам нужно.

Также обратите внимание, что в соответствии с руководством пользователя Gradle с помощью srcDir добавляется каталог к ​​источникам по умолчанию и srcDirs заменяет их.