Источники и исходные структуры проекта Gradle productflavors

Сегодня я начал конвертировать наш проект, чтобы использовать систему построения градиентов. Я не могу изменить структуру проекта, и у меня разные вкусы, поэтому мне было интересно, как я могу переопределить набор «dev» и «prod», потому что это, по-видимому, не работает:

buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.4.2' } } apply plugin: 'android' android { compileSdkVersion 17 buildToolsVersion "17" dependencies { compile project(':ABS') compile project(':google-play-services_lib') compile project(':MergeAdapter') compile fileTree(dir: 'libs', include: '*.jar') } signingConfigs { release { storeFile file("myapp.keystore") storePassword "**********" keyAlias "**********" keyPassword "**********" } } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aild.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } dev { java.srcDirs = ['src-dev'] } prod { java.srcDirs = ['src-prod'] } instrumentTest.setRoot('tests') } productFlavors { dev { packageName "com.myapp.dev" } prod { packageName "com.myapp" } } buildTypes { release { signingConfig signingConfigs.release } } } 

Это дает мне следующую ошибку:

 Cannot add a AndroidSourceSet with name 'dev' as a AndroidSourceSet with that name already exists. 

Дело в том, что я не могу использовать новую структуру проекта и не зацикливаюсь на этом, поэтому как я могу переопределить исходный каталог здесь, поэтому он включает в себя версию dev, src-dev и версию prod src-prod ( Вместо src / main / java и src / dev / java или src / prod / java)

Спасибо!

EDIT: каталоги src-prod и src-dev содержат только классы с константами, которые используются для обозначения разных сред. Я сделаю то же самое с активами (другой значок для dev env)

Вы должны сначала объявить свои вкусы, а затем настроить исходные наборы.

Случается, что при настройке sourceSets он создал android.sourceSets.dev, но затем при создании файла android.productFlavors.dev он пытается создать соответствующий файл android.sourceSets.dev и не удается (потому что он уже существует).

Мы не можем действительно знать, что уже созданный sourceSet означает одно и то же, поэтому мы терпим неудачу, а не потенциально используем sourceSet для этого вкуса, когда вы подразумеваете, что он используется для чего-то другого.

Спасибо, это работает для меня.

В моем проекте старого стиля мне нужны были два варианта res для Amazon и Samsung. Теперь есть три папки res, содержащие файл flavors.xml, который имеет несколько булевых флагов.

 res/values/flavors.xml res-samsung/values/flavors.xml res-amazon/values/flavors.xml 

Файл градиента сначала определяет ароматы:

 productFlavors { amazon { } samsung { } } 

Затем в закрытии sourceSet я не добавляю, а просто меняю каталоги для неявно созданных наборов-источников:

 sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } samsung.res.srcDirs = ['res-samsung'] amazon.res.srcDirs = ['res-amazon'] instrumentTest.setRoot('tests') } 

Задачи mergeXXXResources от Gradle затем поддерживают содержимое папки res-xxx, и в результате у меня есть нужные логические флаги в подходящих APK.