Ответ 1
Я боролся с той же проблемой. Сначала я использовал две ветки в моем исходном контроле, но это было болью, когда они синхронизировались. Gradle - очень гибкая система сборки, но соглашения по умолчанию не всегда достаточно. Вот как я, наконец, разрешил это в моей базе кода.
В итоге я получил, по существу, следующую структуру каталогов (упрощенную):
+ src
+ main
| + res
| | + values
| | - strings.xml
| + java
| ...
+ debug
| + free
| | + res
| | + values
| | - strings.xml
| + paid
| + res
| + values
| - strings.xml
+ free
| + res
| | + values
| | - strings.xml
| + java
| ...
+ paid
+ res
| + values
| - strings.xml
+ java
...
В основной папке я держу все, что является общим для обоих вкусов. В бесплатной папке я сохраняю все, что уникально для бесплатной версии (то же самое для платных). Файлы в папке с ароматом будут наложены поверх основного.
Правила оверлея по умолчанию будут обрабатывать флаги "бесплатно" и "оплачивать", используя папки под "src" с одинаковыми именами. Проблема для меня началась с наложения типов сборки.
Если я создал папку для отладки с той же структурой, что и папки с ароматом, она будет наложена поверх используемой в настоящее время папки с ароматом. Это привело к тому же debug-name для обоих вкусов, но мне нужны разные имена отладки в зависимости от вкуса. После некоторых исследований я придумал следующую модификацию моего файла сборки.
...
android {
buildTypes {
debug {
...
}
release {
...
}
}
productFlavors {
free {}
paid {}
}
}
android.applicationVariants.all { variant ->
if (variant.buildType.name == "release") {
...
}
else if (variant.buildType.name == "debug") {
switch (variant.name) {
case "FreeDebug":
variant.mergeResources.doFirst {
android.sourceSets.debug.setRoot("src/debug/free")
}
break;
case "PaidDebug":
variant.mergeResources.doFirst {
android.sourceSets.debug.setRoot("src/debug/paid")
}
break;
}
}
}
...
Теперь вариант сборки будет создан путем первого наложения следующих папок:
PaidRelease -> /src/main + /src/paid
PaidDebug -> /src/main + /src/paid + /src/debug/paid
FreeRelease -> /src/main + /src/free
FreeDebug -> /src/main + /src/free + /src/debug/free