Code Path for Flavor в Android Gradle

У меня есть 2 buildTypes (debug, release) и 2 productFlavors (product1, product2). Я хочу определить buildConfigField для каждого типа buildType и productFlavors. BuildConfigField – это приложение для загрузки данных с сервера, и оно изменяется для каждого продуктаFlavor и 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», решение находится на этой странице .

Solutions Collecting From Web of "Code Path for Flavor в Android Gradle"

@Beni, вы можете использовать что-то вроде этого

 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"; 

Надеюсь это поможет.

Тип сборки не является частью продукта 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}\"") } 

Я не знаю, как вы можете установить разные значения для нескольких BuildVariants (тип сборки + аромат) в build.gradle с buildConfigField метода 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" }