[英]Build Configurations based on App Variant (BuildType + Flavor)
I am trying to set signingConfig
, manifestPlaceholders
, buildConfigField
for Application variant.我正在尝试为 Application 变体设置
signingConfig
、 manifestPlaceholders
、 buildConfigField
。 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:尝试:
applicationVariants.all{}
, there is no setter functions, only getters on Variant object ( link )applicationVariants.all{}
设置它,则没有 setter 函数,只有 Variant 对象上的 getter(链接)(variant.mergedFlavor as DefaultProductFlavor)
does not add buildConfigField values to BuildConfig.java ( link )(variant.mergedFlavor as DefaultProductFlavor)
上设置字段不会将 buildConfigField 值添加到 BuildConfig.java ( link )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"))
}
}
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
但是不同的路径用来实现多个
signingConfig
、 manifestPlaceholders
、 buildConfigField
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.