简体   繁体   English

基于 App Variant 的构建配置(BuildType + Flavor)

[英]Build Configurations based on App Variant (BuildType + Flavor)

I am trying to set signingConfig , manifestPlaceholders , buildConfigField for Application variant.我正在尝试为 Application 变体设置signingConfigmanifestPlaceholdersbuildConfigField I can set them for each buildType or!我可以为每个 buildType或! productFlavor independently, but what i need is to set them based on both productFlavor and! productFlavor 独立,但我需要的是根据 productFlavor和! buildType.构建类型。

buildTypes{
  getByName("debug"){}
  getByName("release"){}
  create("staging"){}
}

productFlavors {
  create("global"){}
  create("local"){}
}

On the above example, there are 3 different buildTypes and 2 different productFlavors.在上面的示例中,有 3 种不同的 buildType 和 2 种不同的 productFlavors。 That means 6 total APK variants.这意味着总共有 6 个 APK 变体。 For each of this APK ( globalRelease, globalStaging, globalDebug, localRelease, localStaging, localDebug ), i want to use different signingConfig for example.例如,对于每个 APK( globalRelease、globalStaging、globalDebug、localRelease、localStaging、localDebug ),我想使用不同的签名配置。 How do i set it?我该如何设置?

Tried:尝试:

  • If i set it in buildType, then there will be only 3 different signingConfigs如果我在 buildType 中设置它,那么将只有 3 个不同的签名配置
  • If i set it in flavor, then there will be only 2 different signingConfigs如果我将其设置为风味,那么将只有 2 个不同的签名配置
  • If i try to set it in applicationVariants.all{} , there is no setter functions, only getters on Variant object ( link )如果我尝试在applicationVariants.all{}设置它,则没有 setter 函数,只有 Variant 对象上的 getter(链接
  • setting fields on (variant.mergedFlavor as DefaultProductFlavor) does not add buildConfigField values to BuildConfig.java ( link )(variant.mergedFlavor as DefaultProductFlavor)上设置字段不会将 buildConfigField 值添加到 BuildConfig.java ( link )

After Gradle 7.x Gradle 7.x 之后


Instead of applicationVariants.all{} , we now use androidComponents { onVariants{ .. }} outside android{} block. 我们现在android{}块之外使用androidComponents { onVariants{ .. }}而不是applicationVariants.all{} This code should work on Gradle 7.0.2 and AGP 7.0.1:此代码应该适用于 Gradle 7.0.2 和 AGP 7.0.1:

androidComponents {
    onVariants { variant ->
        variant.buildConfigFields.put("MY_CUSTOM_FIELD", BuildConfigField("String", "MyCustomValue", null))
        variant.manifestPlaceholders.put("MY_MANIFEST_FIELD", "MyManifestValue")
    }
}

On AGP 7.0.x, there is no way to set signingConfig for mergedFlavor (buildType+flavor).在 AGP 7.0.x 上,无法mergedFlavor (buildType+flavor)设置signingConfig mergedFlavor You can set for buildType or flavor individually, but not for combination.您可以单独设置 buildType 或风味,但不能为组合设置。

On AGP 7.1.x, you can do it.在 AGP 7.1.x 上,您可以做到。 But it requires AGP 7.1.0-alpha10, Gradle 7.2-rc-3, AndroidStudio BumbleBee 2021.1.1 alpha10:但它需要 AGP 7.1.0-alpha10、Gradle 7.2-rc-3、AndroidStudio BumbleBee 2021.1.1 alpha10:

androidComponents {
    onVariants { variant ->
        variant.signingConfig?.setConfig(android.signingConfigs.getByName("buildTypeXFlavorA"))
    }
}

‎‎ ‎

Before Gradle 7.x Gradle 7.x 之前


To make changes on different variants (buildType+productFlavor), i had to use android.applicationVariants.all{} .要对不同的变体(buildType+productFlavor)进行更改,我必须使用android.applicationVariants.all{} But different paths used to achieve multiple signingConfig , manifestPlaceholders , buildConfigField但是不同的路径用来实现多个signingConfigmanifestPlaceholdersbuildConfigField

1) manifestPlaceholders 1)清单占位符

applicationVariants.all{
    val variant = this
}

There is no getter/setter for manifestPlaceholders on variant object. variant对象上的manifestPlaceholders没有 getter/setter。 Following this , we can make variant.mergedFlavor mutable.之后,我们可以使variant.mergedFlavor可变。 Setting manifestPlaceholders on variant.mergedFlavor did work.variant.mergedFlavor上设置manifestPlaceholders确实有效。

import com.android.builder.core.DefaultProductFlavor

applicationVariants.all{
    val manifestPlaceholders: Map<String, String>
    val variant = this
    val mutableMergedFlavor = variant.mergedFlavor as DefaultProductFlavor
    mutableMergedFlavor.addManifestPlaceholders(manifestPlaceholders)
}

2) buildConfigField 2) 构建配置字段

Using the same approach, calling addBuildConfigField(ClassFieldImpl(type, name, value)) on mutableMergedFlavor did not work.使用相同的方法,调用addBuildConfigField(ClassFieldImpl(type, name, value))mutableMergedFlavor没有工作。 But instead , it can be set directly on variant .但是反而,它可以直接在设置variant

import com.android.builder.internal.ClassFieldImpl

applicationVariants.all{
    val buildConfigFields: List<ClassFieldImpl>
    val variant = this
    buildConfigFields.forEach { 
        variant.buildConfigField(it.type, it.name, it.value) 
    }
}

3) signingConfig signingConfig can be set on mutableMergedFlavor shown above, except on debug variants. 3) 签名signingConfig签名signingConfig可以在mutableMergedFlavor显示的signingConfig上设置, debug变体除外。 All debug variants use default signing options, even if you set it on variant.mergedFlavor .所有debug变体都使用默认签名选项,即使您在variant.mergedFlavor上设置了它。 But if you set default as null, then you can override it as well.但是,如果您将默认值设置为 null,那么您也可以覆盖它。

import com.android.builder.core.DefaultProductFlavor

signingConfigs {
    create("myDebug") {}
}
buildTypes {
    getByName("debug") {
        signingConfig = null // to override
    }
}
applicationVariants.all{
    val variant = this
    val mutableMergedFlavor = variant.mergedFlavor as DefaultProductFlavor
    mutableMergedFlavor.signingConfig = signingConfigs.getByName("myDebug")
}

To put all together:把所有东西放在一起:

import com.android.build.gradle.api.ApplicationVariant
import com.android.builder.internal.ClassFieldImpl
import com.android.builder.model.SigningConfig
import com.android.builder.core.DefaultProductFlavor
import java.util.*

fun configureVariant(variant: ApplicationVariant,
                     signingConfig: SigningConfig,
                     buildConfigFields: List<ClassFieldImpl>,
                     manifestPlaceholders: Map<String, String>) {

    println("configureVariant: ${variant.name}")
    buildConfigFields.forEach {
        variant.buildConfigField(it.type, it.name, it.value)
    }

    val mutableMergedFlavor = variant.mergedFlavor as DefaultProductFlavor
    mutableMergedFlavor.signingConfig = signingConfig
    mutableMergedFlavor.addManifestPlaceholders(manifestPlaceholders)
}

android {
    signingConfigs {
        create("myDebug") {}
        create("myRelease") {}
    }

    flavorDimensions("region")
    productFlavors {
        create("global") {
            setDimension("region")
            setApplicationId("")
        }
        create("local") {
            setDimension("region")
            setApplicationId("")
        }
    }

    buildTypes {
        getByName("debug") {
            signingConfig = null
        }
    }

    applicationVariants.all {
        val variant = this
        when {
            variant.name.equals("localDebug", true) -> {
                configureVariant(
                        variant,
                        signingConfigs.getByName("localDebug"),
                        listOf(ClassFieldImpl("String", "NAME", "\"VALUE\"")),
                        mapOf("KEY" to "VALUE")
                )
            }
            variant.name.equals("globalStaging", true) -> {
                configureVariant(
                        variant,
                        signingConfigs.getByName("globalStaging"),
                        listOf(ClassFieldImpl("String", "NAME", "\"VALUE2\"")),
                        mapOf("KEY" to "VALUE2")
                )
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM