我想更改应用程序风格的版本名称,但仅限于它是调试版本。
(例如,调试版本将具有类似1.0.1 D(DEBUG)555或1.0.1 P(DEBUG)555的版本,但是我希望版本构建仅具有类似1.0.1的版本) 我怎样才能做到这一点?
基本上我有这些构建类型:
buildTypes {
debug {
versionNameSuffix " (DEBUG) " + mBuild
}
release {
runProguard true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), file('proguard-project.txt')
signingConfig signingConfigs.release
}
}
和这些风味(针对不同的api环境):
productFlavors {
dev {
versionName = android.defaultConfig.versionName + " D"
}
prod {
versionName = android.defaultConfig.versionName + " P"
}
}
有没有办法在没有产品风格版本名称更改的情况下进行发布版本?
我试图通过
动态设置版本名称 buildTypes.each { buildType ->
if(buildType.name == 'debug') {
productFlavors.dev.versionName = android.defaultConfig.versionName + " D"
}
}
但这会导致
无法在GroupableProductFlavorDsl容器上找到属性'dev'。
答案 0 :(得分:31)
经过几个小时的搜索,我设法删除了使用此代码对发布版本的版本名称所做的所有更改
applicationVariants.all { variant ->
if (variant.buildType.name == 'release') {
variant.mergedFlavor.versionName = android.defaultConfig.versionName;
}
}
答案 1 :(得分:1)
Build Type
应覆盖Product Flavor
。尝试下一个。
buildTypes {
release {
versionName = android.defaultConfig.versionName
}
}
答案 2 :(得分:1)
对于那些想通过Kotlin DSL使用它的人。初次尝试时,可能不允许我们为版本名称分配新值。
上面的图片显示versionName
类的ProductFlavor
没有设置器。
尝试1(广播到ProductFlavorImpl
):
applicationVariants.forEach { variant ->
if (variant.buildType.name != "release") {
variant.mergedFlavor.let {
it as ProductFlavorImpl
it.versionName = "sampingan-${defaultConfig.versionName}"
}
}
}
it as ProductFlavorImpl
仍然不起作用,因为MergedFlavor
无法强制转换ProductFlavorImpl
并引发以下错误:
com.android.builder.core.MergedFlavor cannot be cast to com.android.build.gradle.internal.api.dsl.model.ProductFlavorImpl
尝试2(广播到MergedFlavor
)
//
variant.mergedFlavor.let {
it as com.android.builder.core.MergedFlavor
}
//
经过反复试验,看来我们无法直接将versionName
更改为MergedFlavor
,而是显示了另一个错误日志,如下所示:
versionName cannot be set on a mergedFlavor directly.
versionNameOverride can instead be set for variant outputs using the following syntax:
android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.versionNameOverride = "1.0.0"
}
}
}
尝试3(使用ApplicationVariant
对象)
所以我们将实现更改为这样
applicationVariants.all(object : Action<com.android.build.gradle.api.ApplicationVariant> {
override fun execute(variant: com.android.build.gradle.api.ApplicationVariant) {
println("variant: ${variant}")
variant.outputs.all(object : Action<com.android.build.gradle.api.BaseVariantOutput> {
override fun execute(output: com.android.build.gradle.api.BaseVariantOutput) {
if (variant.buildType.name != "release") {
(output as com.android.build.gradle.internal.api.ApkVariantOutputImpl)
.versionNameOverride = "prefix-${variant.versionName}"
}
}
})
}
})
这整个方法都受到@ david-mihola答案的启发。他解释说groovy
有自己的魔法here。
如果您要为每个不同的buildTypes
或productFlavors
更改 APK名称,则可以转到@ david-mihola答案here。>
答案 3 :(得分:-1)
我想为调试构建设置不同的 versionName :
android {
applicationVariants.all { variant ->
variant.outputs.all { output ->
if (variant.buildType.name == 'debug') {
output.versionNameOverride = "1"
}
}
}
}