Я разрабатываю приложение для Android с помощью Android Studio (v 2.1, плагин gradle v 2.1.0). У моего приложения есть различные версии, которые имеют много общего кода, поэтому я решил использовать параметры вкуса и вкусы продукта, чтобы настроить код и ресурсы, когда и где они запрашиваются. Это работало нормально, пока у меня было только два вкусовых измерения. Например, мой app.gradle
был
…
flavorDimensions "fruit", "color"
productFlavors {
apple {
dimension "fruit"
}
pear {
dimension "fruit"
}
red {
dimension "color"
}
yellow {
dimension "color"
}
}
…
и моя папка src
была
src/
appleRed/
appleYellow/
pearRed/
pearYellow/
каждый с пользовательской версией моего кода. Опять же, как пример
src/
appleRed/java/com/example/ExampleFragment.java
appleYellow/java/com/example/ExampleFragment.java
pearRed/java/com/example/ExampleFragment.java
pearYellow/java/com/example/ExampleFragment.java
конечно, экземпляра ExampleFragment
в src/main
нет.
В какой-то момент разработки мне пришлось добавить бесплатную и платную версии приложения. Я подумал, что этого можно легко добиться, добавив новое измерение вкуса с именем version
и два вкуса продукта с именами free
и paid
:
…
flavorDimensions "fruit", "color”, “version”
productFlavors {
apple {
dimension "fruit"
}
pear {
dimension "fruit"
}
red {
dimension "color"
}
yellow {
dimension "color"
}
free {
dimension "version"
}
paid {
dimension “version”
}
}
…
но внезапно пользовательский код, сгенерированный комбинацией fruit
и color
, больше не обнаруживался Android Studio. Таким образом, ни appleRed
, ни appleYellow
, ни pearRed
, ни pearYellow
нельзя использовать для пользовательского кода, и единственный способ, которым я смог восстановить свою конфигурацию, — это использовать все комбинации всех трех аспектов:
src/
appleRedFree/java/com/example/ExampleFragment.java
appleRedPaid/java/com/example/ExampleFragment.java
appleYellowFree/java/com/example/ExampleFragment.java
appleYellowPaid/java/com/example/ExampleFragment.java
pearRedFree/java/com/example/ExampleFragment.java
pearRedPaid/java/com/example/ExampleFragment.java
pearYellowFree/java/com/example/ExampleFragment.java
pearYellowPaid/java/com/example/ExampleFragment.java
Это нехорошо, потому что ExampleFragment
дублируется в одной и той же комбинации fruitColor*
(appleRedFree
, appleRedPaid
имеют одинаковые ExampleFragment
). Та же проблема возникает с ресурсами (те, что в папке res
).
Мои вопросы:
1) Является ли это ожидаемым поведением от gradle в Android Studio (т. е. невозможность комбинировать подмножество вкусов продуктов, следуя их приоритету в зависимости от их измерения, при наличии более двух измерений вкуса)?
2) Учитывая тот факт, что это ожидаемое поведение, есть ли другой способ добиться моей настройки без дублированного кода или без единого файла с if-statement внутри (например, эм>, if (BuildConfig.FLAVOR_version == "free") ...
) ?
Обратите внимание, что я говорю о пользовательском коде, который может быть сложным, поэтому я не прошу базовой настройки, такой как переменная конфигурации сборки, фильтрация вариантов или что-то в этом роде.