У меня были следующие ароматы проекта:
- Apple,
- Orange
Первоначально единственным отличием был applicationId/packageName
. Теперь есть один java файл, который отличается. Конкретный ArrayAdapter, если быть точным. Решение заключалось в создании src/Apple
и src/Orange
и оба наследуемых от src/main
. Я удалил java файл из src/main
и поместил копию в src/Apple
и src/Orange
и соответствующим образом изменил его. Все было хорошо в мире.
Ускорьте вперед несколько недель, теперь есть около 10 java файлов, которые отличаются между Apple и Orange. Опять... нет ничего страшного. Прост в обращении. Разделите java файлы в src/Apple
и src/Orange
.
Ускоренная перемотка вперед. Мне нужно немного изменить ситуацию, потому что я хочу иметь бесплатную и премиальную версию каждого. Свободные и премиальные версии отличаются только URL-адресом. Я собирался просто создавать новые типы:
- AppleFree
- ApplePremium
- OrangeFree
- OrangePremium
У меня есть дилемма. Поскольку теперь src/Apple
и src/Orange
имеют 10 разных файлов, которые были изменены... если я изменю любой java файл в AppleFree
, я должен убедиться, что я делаю то же самое в ApplePremium
. Я нахожусь на перекрестке и надеюсь, что мой вопрос будет иметь смысл в этот момент. Я придумал три возможных решения, но я не уверен, как я их реализую/что будет правильным подходом/решение не то, что я хочу.
Решение 1:
Используйте оператор if
if (BuildConfig.FLAVOR==appleFree) {//use free Url} else {// use premium url}
Проблема: Оба Urls технически скомпилированы в apk. Я не хочу этого.
Решение 2:
У вас есть src/AppleFree и src/ApplePremium от родительского каталога src/Apple.
Проблема: Не знаю, как я это сделаю.
Решение 3:
Добавьте бесплатный и премиальный URL прямо в build.gradle, как это?
productFlavors {
appleFree {
applicationId "com.example.apple.free"
versionName "1.0"
url "http://freeurl.com"
versionCode 1
}
applePremium {
applicationId "com.example.apple.premium"
versionName "1.0"
url "http://premiumurl.com"
versionCode 1
}
orangeFree {
applicationId "com.example.orange.free"
versionName "1.0"
versionCode 1
url "http://freeurl.com"
}
orangePremium {
applicationId "com.example.orange.premium"
url "http://premiumurl.com"
versionName "1.0"
versionCode 1
}
}
Проблема: Не знаете, как это сделать.
Полезны любые советы.
EDIT:
Окончательное решение?
flavorGroups 'fruit', 'paid'
productFlavors {
apple {
flavorGroup 'fruit'
}
orange {
flavorGroup 'fruit'
}
free {
flavorGroup 'paid'
}
premium {
flavorGroup 'paid'
}
appleFree {
applicationId "com.example.apple.free"
versionName "1.0"
buildConfigField 'String', 'BASE_URL', 'http://freeurl.com'
versionCode 1
}
applePremium {
applicationId "com.example.apple.premium"
versionName "1.0"
buildConfigField 'String', 'BASE_URL', 'http://premiumurl.com'
versionCode 1
}
orangeFree {
applicationId "com.example.orange.free"
versionName "1.0"
versionCode 1
buildConfigField 'String', 'BASE_URL', 'http://freeurl.com'
}
orangePremium {
applicationId "com.example.orange.premium"
buildConfigField 'String', 'BASE_URL', 'http://premiumurl.com'
versionName "1.0"
versionCode 1
}
}