Android Gradle中每种味道的代码路径

Android Gradle中每种味道的代码路径,android,gradle,android-gradle-plugin,build.gradle,Android,Gradle,Android Gradle Plugin,Build.gradle,我有两种构建类型(调试、发布)和两种产品风格(product1、product2)。我想为每个buildType和productFlavors定义一个buildConfigField。buildConfigField是应用程序从服务器下载数据的url,对于每个productFlavor和BuildType,它都会更改 现在,我有: buildTypes { debug { debuggable true } release { debugg

我有两种构建类型(调试、发布)和两种产品风格(product1、product2)。我想为每个buildType和productFlavors定义一个buildConfigField。buildConfigField是应用程序从服务器下载数据的url,对于每个productFlavor和BuildType,它都会更改

现在,我有:

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_库都有不同的模式,因此我无法对URL进行分组。一个可行的解决方案是在不同的构建类型中添加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中添加资源,如“键映射”,解决方案就在这里。

我不知道如何使用
build.gradle
方法为
buildfield
中的多个构建变量(构建类型+风格)设置不同的值

但是,您可以在
res/values/strings.xml
中为
url\u库使用不同的值

比如:

<string name="url_base">https://api1.debug.com</string>

当然,在
BuildConfig
中有一个值是不一样的,并且比使用
build.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"')
    }
}
您建议执行的操作的问题是,每个
buildType
buildConfigField字符串的最后一个定义“URL\u 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";

希望这有帮助。

构建类型不是产品风格的一部分,反之亦然。根据构建类型和产品风格计算变量。使用此选项,您可以使用产品风格和构建类型创建具有一致格式的扩展(选项1)或属性(选项2)

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

在格拉德尔

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'
内建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}\"")
}

对于每种构建类型都相等的java类呢?我是否必须克隆每个java类才能添加到product1Debug、product1Release中?或者我必须创建一个名为product1的文件夹,并且该代码就在其中??例如,一个名为SplashActivity.java的java类,它与product1中的构建类型debug和release相同。感谢java类,您必须为每个构建类型放置一个类。在这种情况下,您可以使用:
-app/src/debug:
-app/src/product1Release
-app/src/product2Release
我更改了代码,就像更新了问题一样。我有不同的url方案,所以我不能以相同的方式应用你的答案,我必须按照你看到的进行调整。我们是否必须显式地调用“project.android.applicationVariants.all”。可能还有其他方法,但我不知道。没有您感兴趣的声明性方法。请告诉我为什么是“${url}\”而不是直接“${url}”?对于选项2,您必须提供不带简单引号的url:
product1\u release\u base\u url=http://baseurl.myproduct/public
@n4h0y如何避免不存在的额外道具?例如,您意外添加了新的flavor product3,如何忽略这一点并继续循环?
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}\"")
}