Удостоверение продукта быть ребенком другого
Я настраиваю продукты в своем приложении и сталкиваюсь с одной проблемой. Два моих вкуса продукта очень похожи друг на друга и отличаются только несколькими ресурсами, позвольте им назвать FlavorA и FlavorB. Я хотел бы настроить его так, чтобы FlavorA был родителем FlavorB, таким образом FlavorB может просто переопределить несколько ресурсов FlavorA, а затем FlavorA переопределяет кучу ресурсов из main. Есть ли способ настроить иерархию вкуса, такую как это? Сейчас мне нужно дублировать много ресурсов между ними, чтобы он работал, и я хотел бы устранить это дублирование.
edit: ОК. У меня уже было пару ответов (оба удалены), которые не были связаны с моим вопросом, поэтому позвольте мне уточнить. Это не связано с Java OOP, я уже это хорошо знаю.:)
Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть бесплатная/платная версия моего приложения, а затем несколько белых ярлыков, которые включают только изменения темы. Платная версия изменяет только несколько активов из бесплатной версии (кроме изменений кода). Вот как выглядит мой productFlavors
:
productFlavors {
whiteLabelA {
applicationId "com.whiteLabelA.android"
}
whiteLabelB {
applicationId "com.whiteLabelB.android"
}
mainFree {
applicationId "com.mainFree.android"
}
mainPaid {
applicationId "com.mainFree.android.paid"
}
}
Я бы хотел, чтобы mainPaid
переопределял mainFree
, поскольку он меняет только несколько ресурсов. Я хотел бы сделать это таким образом, а не как бесплатный/платный тип сборки, потому что белые ярлыки не имеют платных версий, и было бы проще иметь иерархию вкусов, например:
mainPaid extends mainFree {
applicationId "com.mainFree.android.paid"
}
Ответы
Ответ 1
Я нашел два решения:
1. Используйте размеры аромата.
android {
...
flavorDimensions 'palette', 'color'
productFlavors {
blackAndWhite {
dimension 'palette'
}
redAndWhite {
dimension 'palette'
}
red {
dimension 'color'
}
white {
dimension 'color'
}
}
variantFilter { variant ->
def first = variant.getFlavors().get(0).name
def second = variant.getFlavors().get(1).name
if(!(first.equals('blackAndWhite') && second.equals('white')) ||
!(first.equals('redAndWhite') && (second.equals('white') || second.equals('red')))) {
variant.setIgnore(true);
}
}
...
}
Из-за variantFilter
у нас есть 3 комбинации вместо 4:
blackAndWhite => white
redAndWhite => white
=> red
Вы можете считать, что red
расширяется redAndWhite
и white
, расширяя blackAndWhite
или redAndWhite
.
Этот ответ и вариант фильтра были полезны.
2. Изменить исходный набор.
productFlavors{
flavor1 {
}
flavor2 {
}
}
sourceSets {
flavor2 {
java.srcDirs = sourceSets.flavor1.java.srcDirs
res.srcDirs = sourceSets.flavor1.res.srcDirs
resources.srcDirs = sourceSets.flavor1.resources.srcDirs
aidl.srcDirs = sourceSets.flavor1.aidl.srcDirs
renderscript.srcDirs = sourceSets.flavor1.renderscript.srcDirs
assets.srcDirs = sourceSets.flavor1.assets.srcDirs
}
}
Пример кода был бесстыдно скопирован из этого сообщения в блоге. Большое спасибо автору.
Ответ 2
Я думаю, что вы не сможете сделать это непосредственно в объекте android
, но вы можете использовать функцию конфигурации для установки общих свойств на вкус. Поместите это после объекта android
:
void configureWhiteLabelFlavor(flavor) {
flavor.useJack = true
}
configureWhiteLabelFlavor(android.productFlavors.whiteLabelA)
При необходимости вы можете реализовать глубокое наследование, вызывая другие функции из этой функции.
Ответ 3
Я искал аналогичную вещь в gradle и нашел варианты с несколькими вкусами. У меня есть приложение, которое должно иметь версии A и B, и у каждой версии есть dev и pro среды, поэтому я закончил с этим в своем gradle:
flavorDimensions 'app', 'environment'
productFlavors {
versionA {
flavorDimension 'app'
}
versionB {
flavorDimension 'app'
}
pre {
flavorDimension 'environment'
}
pro {
flavorDimension 'environment'
}
}
И в моих вариантах сборки у меня есть версияAPreDebug, versionAPreRelease, versionBPreDebug, versionBPreRelease и т.д. Я думаю, что вам нужно что-то в этом роде.