Путь к коду на вкус в Android Gradle
У меня есть 2 buildTypes (отладка, выпуск) и 2 productFlavors (product1, product2). Я хочу определить buildConfigField для каждого buildType и productFlavors. BuildConfigField - это URL-адрес приложения для загрузки данных с сервера, и он изменяется для каждого productFlavor и buildTypes.
Теперь у меня есть:
buildTypes {
debug {
debuggable true
}
release {
debuggable false
}
}
productFlavors {
product1 {
buildConfigField STRING, "URL_BASE", '"https://api1.release.com"'
}
product2 {
buildConfigField STRING, "URL_BASE", '"https://api2.release.com"'
}
}
Но я хочу что-то вроде этого:
buildTypes {
debug {
debuggable true
}
release {
debuggable false
}
}
productFlavors {
product1 {
debug {
buildConfigField STRING, "URL_BASE", '"https://api1.debug.com"'
}
release {
buildConfigField STRING, "URL_BASE", '"https://api1.release.com"'
}
product2 {
debug {
buildConfigField STRING, "URL_BASE", '"https://api2.debug.com"'
}
release {
buildConfigField STRING, "URL_BASE", '"https://api2.release.com"'
}
}
}
Как мне этого добиться?
Обновить:
Каждый URL_BASE имеет свой шаблон, поэтому я не могу сгруппировать URL. Возможное решение состоит в том, чтобы добавить базу URL 2 аромата в различные типы сборки и выбрать правильную в аромате.
buildTypes {
debug {
debuggable true
buildConfigField STRING, API_VARIANT_PRODUCT1, '"api1.deb.com"'
buildConfigField STRING, API_VARIANT_PRODUCT2, '"api2.debug.com"'
}
release {
debuggable false
buildConfigField STRING, API_VARIANT_PRODUCT1, '"api1.release.com"'
buildConfigField STRING, API_VARIANT_PRODUCT2, '"api2.release.com"'
}
}
productFlavors {
product1 {
buildConfigField STRING, URL_BASE, '"https://" + API_VARIANT_PRODUCT1 + "/v1"'
}
product2 {
buildConfigField STRING, URL_BASE, '"https://" + API_VARIANT_PRODUCT2 + "/v1"'
}
}
}
ОБНОВЛЕНИЕ 2
Если вам нужно добавить ресурсы в Gradle, например, "KEY_MAP", решение находится на этой странице.
4 ответа
Тип сборки не является частью Product Flavor и наоборот. Вариант рассчитывается на основе типа сборки и вкуса продукта. Используя это, вы можете просто создать расширение (опция 1) или свойство (опция 2) с согласованным форматом, используя как вид продукта, так и тип сборки.
Опция 1
ext.product1_release_base_url = 'http://baseurl.myproduct/public'
ext.product2_release_base_url = 'http://baseurl.yourproduct/secure'
ext.product1_debug_base_url = 'http://debugurl.myproduct/test'
ext.product2_debug_base_url = 'http://yourproduct/debug'
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
}
}
productFlavors {
product1 {}
product2 {}
}
}
project.android.applicationVariants.all {variant ->
def url = project.ext."${variant.flavorName}_${variant.buildType.name}_base_url"
variant.buildConfigField('String', 'URL_BASE', "\"${url}\"")
}
Вариант 2
в gradle.properties
product1_release_base_url = 'http://baseurl.myproduct/public'
product2_release_base_url = 'http://baseurl.yourproduct/secure'
product1_debug_base_url = 'http://debugurl.myproduct/test'
product2_debug_base_url = 'http://yourproduct/debug'
в build.gradle
android {
buildTypes {
release {}
debug {}
}
productFlavors {
product1 {}
product2 {}
}
}
project.android.applicationVariants.all {variant ->
def url = project."${variant.flavorName}_${variant.buildType.name}_base_url"
variant.buildConfigField('String', 'URL_BASE', "\"${url}\"")
}
@ Бени, ты можешь использовать что-то вроде этого
buildTypes {
debug {
debuggable true
buildConfigField("String", "API_VARIANT", '"debugvariant"')
}
release {
debuggable false
buildConfigField("String", "API_VARIANT", '"releasevariant"')
}
}
productFlavors {
product1 {
buildConfigField("String", "URL_BASE", '"https://api1." + API_VARIANT + ".com"')
}
product2 {
buildConfigField("String", "URL_BASE", '"https://api2." + API_VARIANT + ".com"')
}
}
Проблема с тем, что вы предлагаете сделать, заключается в том, что последнее определение buildConfigField STRING, "URL_BASE"
значения для каждого buildType
привыкнет ко всем вкусам продукта. То, что вы в конечном итоге было бы что-то вроде "https://api2.release.com"
в обеих версиях выпуска.
Используя вышесказанное, вы получите что-то подобное в вашем BuildConfig
файлы для каждого варианта
// Fields from build type: debug
public static final String API_VARIANT = ["debugvariant"|"releasevariant"];
// Fields from product flavor: [product1|product2]
public static final String URL_BASE = "https://[api1|api2]." + API_VARIANT + ".com";
Надеюсь это поможет.
Я не знаю, как вы можете установить разные значения для нескольких BuildVariants (типы сборки + вкус) в build.gradle
с buildConfigField
метод.
Однако вы можете использовать другое значение для вашего url_base
внутри res/values/strings.xml
,
Что-то вроде:
<string name="url_base">https://api1.debug.com</string>
Затем вы можете создать тот же строковый ресурс в этих папках:
- app/src/product1Debug: Contains product1-debug-related code/resources
- app/src/product1Release: Contains product1-release-related code/resources
- app/src/product2Debug: Contains product2-debug-related code/resources
- app/src/product2Release: Contains product2-release-related code/resources
Конечно, это не то же самое, чтобы иметь значение внутри BuildConfig
и менее комфортно, чем конфигурация с build.gradle
,
applicationVariants.all { variant ->
def apiVariant = variant.getFlavorName == "product1" ? "api1" : "api2"
def server = variant.buildType.name == "debug" ? "debug" : "release"
variant.buildConfigField STRING, URL_BASE, "http://" + apiVariant + "." + server + ".com"
}