繁体   English   中英

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

[英]Android - change flavor version name based on build type

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

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

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

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

对于那些想通过 Kotlin DSL 使用它的人。 第一次尝试时,它可能不允许我们为版本名称分配新值。

在此处输入图片说明

上图显示了ProductFlavor类的versionName没有设置器。

尝试 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
  }
  // 

经过反复试验,看起来我们无法直接使用MergedFlavor更改versionName ,而是另一个错误日志如下所示:

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在这里有它自己的魔力。

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

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

buildTypes {

    release {
        versionName = android.defaultConfig.versionName
    }
}

最新的简单解决方案运行良好并经过测试。 在其中定义 productflavour 和 buildTypes 并删除 versionName。

使用output.versionNameOverride = versionName我们可以根据 buildType 和 productFlavour 更改 versionName。

代码:

 applicationVariants.all { variant ->
    variant.outputs.all { output ->
        def flavor = variant.getFlavorName()
        def versionName = "1.0.0"
        switch (flavor){
            case "paid":
                flavor = "Paid"
                if (variant.buildType.name == 'release') {
                    versionName = "1.0.0.8"
                } else if (variant.buildType.name == 'staging') {
                    versionName = "1.0.0.8"
                } else {
                    versionName = "1.0.0.8"
                }
                break
            case "free":
                flavor = "Free"
                if (variant.buildType.name == 'release') {
                    versionName = "1.0.0.14"
                } else if (variant.buildType.name == 'staging') {
                    versionName = "1.0.0.14"
                } else {
                    versionName = "1.0.0.14"
                }
                break
            case "trial":
                flavor = "Trial"
                if (variant.buildType.name == 'release') {
                    versionName = "1.0.0.3"
                } else if (variant.buildType.name == 'staging') {
                    versionName = "1.0.0.3"
                } else {
                    versionName = "1.0.0.3"
                }
                break
        }
        output.versionNameOverride = versionName
        outputFileName = "${flavor}_v${versionName}.apk"
    }
}

我想为调试版本设置一个不同的versionName

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM