30

我想更改应用风格的版本名称,但前提是它是调试版本。

(例如,调试版本将具有 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”。

4

4 回答 4

35

经过数小时的搜索,我设法使用此代码删除了对发布版本的版本名称所做的所有更改

applicationVariants.all { variant ->
    if (variant.buildType.name == 'release') {
        variant.mergedFlavor.versionName = android.defaultConfig.versionName;
    }
}
于 2013-11-02T00:15:30.477 回答
2

对于那些想通过 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
  }
  // 

经过反复试验,看起来我们无法直接更改versionNamewith 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有它自己的魔力。

如果您想更改每个不同的APK 名称buildTypes,或者productFlavors您可以在此处访问 @david-mihola 答案。

于 2019-12-05T09:37:56.107 回答
1

Build Type应该覆盖Product Flavor. 试试下一个。

buildTypes {

    release {
        versionName = android.defaultConfig.versionName
    }
}
于 2013-11-01T18:30:07.660 回答
-2

我想为调试构建设置不同的versionName

android {
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            if (variant.buildType.name == 'debug') {
                output.versionNameOverride = "1"
            }
        }
    }
}
于 2020-03-23T01:42:07.233 回答