Подтвердить что ты не робот

Code Path per 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"'
        }
    }
}

Как я могу это достичь?

Update:

Каждый 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", решение находится на этой странице .

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

Я не знаю, как вы можете установить разные значения для нескольких 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.

Ответ 4

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