[英]Build Configurations based on App Variant (BuildType + Flavor)
我正在尝试为 Application 变体设置signingConfig
、 manifestPlaceholders
、 buildConfigField
。 我可以为每个 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 ),我想使用不同的签名配置。 我该如何设置?
尝试:
我们现在在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"))
}
}
要对不同的变体(buildType+productFlavor)进行更改,我必须使用android.applicationVariants.all{}
。 但是不同的路径用来实现多个signingConfig
、 manifestPlaceholders
、 buildConfigField
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.