ben*_*eni 13 android gradle build.gradle android-gradle-plugin
我有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"'
}
}
Run Code Online (Sandbox Code Playgroud)
但是我想要这样的东西:
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"'
}
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
更新:
每个URL_BASE都有不同的模式,因此我无法对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"'
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新2
如果您需要在gradle中添加资源,例如'KEY_MAP',解决方案就在此页面中.
小智 10
Build Type不是Product Flavor的一部分,反之亦然.Variant基于构建类型和产品风格计算.使用此方法,您可以使用产品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}\"")
}
Run Code Online (Sandbox Code Playgroud)
选项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'
Run Code Online (Sandbox Code Playgroud)
在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}\"")
}
Run Code Online (Sandbox Code Playgroud)
@Beni, you can use something like this
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"')
}
}
Run Code Online (Sandbox Code Playgroud)
The problem with what you were proposing to do is that the last definition of the the buildConfigField STRING, "URL_BASE" values for each buildType will get used in all product flavors. So what you would end up with would be something like "https://api2.release.com" in both release versions.
Using the above you will end up with something like this in your BuildConfig files for each variant
// 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";
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
build.gradle我不知道如何使用该方法为多个 BuildVariants(构建类型+风格)设置不同的值buildConfigField。
url_base但是您可以在inside中使用不同的值res/values/strings.xml。
就像是:
<string name="url_base">https://api1.debug.com</string>
Run Code Online (Sandbox Code Playgroud)
然后您可以在这些文件夹中创建相同的字符串资源:
- 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
Run Code Online (Sandbox Code Playgroud)
当然,在 中包含值是不一样的,BuildConfig并且比 中的配置更不舒服build.gradle。
| 归档时间: |
|
| 查看次数: |
2155 次 |
| 最近记录: |