繁体   English   中英

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

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

我正在尝试为 Application 变体设置signingConfigmanifestPlaceholdersbuildConfigField 我可以为每个 buildType或! productFlavor 独立,但我需要的是根据 productFlavor和! 构建类型。

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

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

在上面的示例中,有 3 种不同的 buildType 和 2 种不同的 productFlavors。 这意味着总共有 6 个 APK 变体。 例如,对于每个 APK( globalRelease、globalStaging、globalDebug、localRelease、localStaging、localDebug ),我想使用不同的签名配置。 我该如何设置?

尝试:

  • 如果我在 buildType 中设置它,那么将只有 3 个不同的签名配置
  • 如果我将其设置为风味,那么将只有 2 个不同的签名配置
  • 如果我尝试在applicationVariants.all{}设置它,则没有 setter 函数,只有 Variant 对象上的 getter(链接
  • (variant.mergedFlavor as DefaultProductFlavor)上设置字段不会将 buildConfigField 值添加到 BuildConfig.java ( link )

Gradle 7.x 之后


我们现在android{}块之外使用androidComponents { onVariants{ .. }}而不是applicationVariants.all{} 此代码应该适用于 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")
    }
}

在 AGP 7.0.x 上,无法mergedFlavor (buildType+flavor)设置signingConfig mergedFlavor 您可以单独设置 buildType 或风味,但不能为组合设置。

在 AGP 7.1.x 上,您可以做到。 但它需要 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"))
    }
}

Gradle 7.x 之前


要对不同的变体(buildType+productFlavor)进行更改,我必须使用android.applicationVariants.all{} 但是不同的路径用来实现多个signingConfigmanifestPlaceholdersbuildConfigField

1)清单占位符

applicationVariants.all{
    val variant = this
}

variant对象上的manifestPlaceholders没有 getter/setter。 之后,我们可以使variant.mergedFlavor可变。 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) 构建配置字段

使用相同的方法,调用addBuildConfigField(ClassFieldImpl(type, name, value))mutableMergedFlavor没有工作。 但是反而,它可以直接在设置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可以在mutableMergedFlavor显示的signingConfig上设置, debug变体除外。 所有debug变体都使用默认签名选项,即使您在variant.mergedFlavor上设置了它。 但是,如果您将默认值设置为 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")
}

把所有东西放在一起:

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