基于 App Variant 构建配置(BuildType + Flavor)
Posted
技术标签:
【中文标题】基于 App Variant 构建配置(BuildType + Flavor)【英文标题】:Build Configurations based on App Variant (BuildType + Flavor) 【发布时间】:2020-07-13 09:38:49 【问题描述】:我正在尝试为应用程序变体设置signingConfig
、manifestPlaceholders
、buildConfigField
。我可以为每个 buildType 或! productFlavor 独立设置它们,但我需要根据 productFlavor 和! buildType 设置它们。
buildTypes
getByName("debug")
getByName("release")
create("staging")
productFlavors
create("global")
create("local")
在上面的例子中,有 3 种不同的 buildTypes 和 2 种不同的 productFlavors。这意味着总共有 6 个 APK 变体。例如,对于每个 APK(globalRelease、globalStaging、globalDebug、localRelease、localStaging、localDebug),我想使用不同的 signingConfig。如何设置?
试过了:
如果我在 buildType 中设置它,那么将只有 3 个不同的签名配置 如果我将其设置为风味,那么将只有 2 个不同的签名配置 如果我尝试在applicationVariants.all
中设置它,则没有 setter 函数,只有 Variant 对象上的 getter (link)
在(variant.mergedFlavor as DefaultProductFlavor)
上设置字段不会将 buildConfigField 值添加到 BuildConfig.java (link)
【问题讨论】:
未答复的类似:***.com/questions/32742184/… 【参考方案1】: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")
)
【讨论】:
Android Studio 4.0.0(gradle 6.1.1)之后,DefaultProductFlavor
无法解决。 AbstractProductFlavor
可以用作解决方法
signingConfig
部分不适用于 gradle 7以上是关于基于 App Variant 构建配置(BuildType + Flavor)的主要内容,如果未能解决你的问题,请参考以下文章
4.1Android Stuido配置你的Build Variant
4.1Android Stuido配置你的Build Variant
90%不知道的Android Build Variant的使用