Android - 根据构建类型更改flavor版本名称

时间:2013-11-01 11:45:00

标签: android gradle

我想更改应用程序风格的版本名称,但仅限于它是调试版本。

(例如,调试版本将具有类似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 个答案:

答案 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使用它的人。初次尝试时,可能不允许我们为版本名称分配新值。

enter image description here

上面的图片显示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

如果您要为每个不同的buildTypesproductFlavors更改 APK名称,则可以转到@ david-mihola答案here

答案 3 :(得分:-1)

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

android {
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            if (variant.buildType.name == 'debug') {
                output.versionNameOverride = "1"
            }
        }
    }
}