Gradle 7.x 之后
而不是applicationVariants.all{},we now use androidComponents { onVariants{ .. }} 在android{} 块之外。此代码应适用于 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 上,is no way to set signingConfig 用于 mergedFlavor(构建类型+风味)。您可以单独设置 buildType 或 flavor,但不能组合设置。
在 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{}。但是不同的路径用来实现多个signingConfig、manifestPlaceholders、buildConfigField
1) manifestPlaceholders
applicationVariants.all{
val variant = this
}
variant 对象上的 manifestPlaceholders 没有 getter/setter。在this 之后,我们可以使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) buildConfigField
使用相同的方法,在mutableMergedFlavor 上调用addBuildConfigField(ClassFieldImpl(type, name, value)) 不起作用。但是instead,可以直接在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 可以在上面显示的 mutableMergedFlavor 上设置,debug 变体除外。所有debug 变体都使用默认签名选项,即使您将其设置为variant.mergedFlavor。但是如果你将default设置为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")
)
}
}
}
}