Android Gradle中每个风味的代码路径

我有2个buildTypes(调试,发布)和2个productFlavors(product1,product2)。 我想为每个buildType和productFlavors定义一个buildConfigField。 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进行分组。 一个可行的解决方案是在不同的构建types中添加2种风味的url基础,并在风味中选择正确的。

 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’,解决方案就在此页面中 。

@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 buildConfigField STRING, "URL_BASE"值将在所有产品风格中使用。 所以你最终会在两个版本中都有类似"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"; 

希望这可以帮助。

构建types不是产品风味的一部分,反之亦然。 Variant基于构建types和产品风格计算。 使用此方法,您可以使用产品flavor和构建types创建具有一致格式的扩展(选项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}\"") } 

我不知道如何使用buildConfigField方法在build.gradle为多个BuildVariants(构建types+ flavor)设置不同的值。

但是,您可以在res/values/strings.xmlurl_base使用不同的值。

就像是:

 https://api1.debug.com 

然后,您可以在这些文件夹中创建相同的字符串资源:

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