【问题标题】:Android - change flavor version name based on build typeAndroid - 根据构建类型更改风味版本名称
【发布时间】:2013-11-01 11:44:59
【问题描述】:

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

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

【问题讨论】:

  • 请接受您自己的答案。所以社区很清楚,这个问题已经解决了。
  • “明天你可以接受自己的答案”

标签: android gradle


【解决方案1】:

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

applicationVariants.all { variant ->
    if (variant.buildType.name == 'release') {
        variant.mergedFlavor.versionName = android.defaultConfig.versionName;
    }
}

【讨论】:

  • 这个符号 (android.defaultConfig.versionName) 对我有用,直到今天我从 AndroidStudio 0.5.5 升级到 0.8.1。知道现在应该改用什么吗?
  • 我收到 Could not find property 'applicationVariants' on project:... 错误。
  • 使用 applicationVariants.each 代替 applicationVariants.all
  • 这不起作用,因为此代码在BuildConfig.java 中创建了一个新变量“versionName”,而不是在AndroidManifest.xml 中更新现有版本
  • 我收到了错误:ERROR: versionCode cannot be set on a mergedFlavor directly.
【解决方案2】:

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

buildTypes {

    release {
        versionName = android.defaultConfig.versionName
    }
}

【讨论】:

  • 我已经试过了。问题是构建类型没有 versionName 属性,只有 versionNameSuffix。上面的代码导致“按需创建属性(也称为动态属性)已 de .0。请阅读gradle.org/docs/current/dsl/org.gradle.api.plu 以替换动态属性。不推荐使用的动态属性:“BuildTypeDsl_Decorated”上的“versionName”
  • 得到错误:RROR: Could not set unknown property 'versionName' for BuildType_Decorated
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    我想为 debug 构建设置不同的 versionName

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

    【讨论】:

    • @Marius 确保您已将代码放置在正确的位置。我们在生产应用程序中使用完全相同的代码,没有任何问题。
    • 我在不同的地方测试过,版本没有被覆盖。我什至在一个新项目中对其进行了测试,并在构建后查看了BuildConfig 文件。也许您必须准确指定将其放在答案中的位置。
    猜你喜欢
    • 2014-05-06
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2014-07-05
    相关资源
    最近更新 更多