Android安卓实现自定义版本号VersionCode和VersionName

自定义版本号通仅能在flavor操作,但是无法对buildType。

原因是在mVersionCode和mVersionName等属性是在DefaultProductFlavor.java

 

 

之前有方案是:

applicationVariants.all { applicationVariant ->
    applicationVariant.outputs.each { output ->
      if(applicationVariant.buildType.name == 'release') {
        applicationVariant.mergedFlavor.versionName = '2.4.3'
      }
    }
}

但此方案在gradle3.0后不再支持,会报

> com.android.builder.errors.EvalIssueException: 
  versionName cannot be set on a mergedFlavor directly.
  versionNameOverride can instead be set for variant outputs using the following syntax:

原因是在MergedFlavor.setVersionName的时候会报出异常:

    override fun setVersionName(versionName: String?): ProductFlavor {
        // calling setVersionName results in a sync Error because the manifest merger doesn't pick
        // up the change.
        reportErrorWithWorkaround("versionName", "versionNameOverride", versionName)
        return this
    }

    private fun reportErrorWithWorkaround(
            fieldName: String, outputFieldName: String, fieldValue: Any?) {
        val formattedFieldValue = if (fieldValue is String) {
            "\"" + fieldValue + "\""
        } else {
            fieldValue.toString()
        }

        val message = """
        $fieldName cannot be set on a mergedFlavor directly.
        $outputFieldName can instead be set for variant outputs using the following syntax:
        android {
                applicationVariants.all { variant ->
                variant.outputs.each { output ->
                output.$outputFieldName = $formattedFieldValue
                    }
            }
        }"""

        issueReporter.reportError(EvalIssueReporter.Type.GENERIC,             
        EvalIssueException(message))
    }

因此,可以用下面的方法:

  applicationVariants.all { applicationVariant ->
    applicationVariant.outputs.each { output ->
      if(applicationVariant.buildType.name == 'release') {
      output.setVersionNameOverride('2.4.3')
      output.setVersionCodeOverride(20403)
      }
    }
  }

原理是:

getOutputs接口由ApkVariantOutput接口实现,而ApkVariantOutput的接口如下:

而setVersionCodeOverride的实现如下:

    @Override
    public void setVersionCodeOverride(int versionCodeOverride) {
        apkData.setVersionCode((IntSupplier & Serializable) () -> versionCodeOverride);
    }

由此可以实现apk不同flavor和buildType的versionName和versionCode的自定义

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一些打包技巧来自定义Android应用程序的版本号和名称。 首先,您可以在项目的 build.gradle 文件中设置 versionCodeversionName 属性,以自定义应用程序的版本号和名称。versionCode 是一个整数,用于标识应用程序的版本,而 versionName 是一个字符串,用于显示应用程序的版本名称。 例如,在 build.gradle 文件中添加以下代码: ``` android { defaultConfig { versionCode 1 versionName "1.0" } } ``` 这将设置应用程序的版本号为 1 和版本名称为 "1.0"。 其次,如果您想要根据应用程序的不同渠道或变体来自定义应用程序的名称,您可以使用 Gradle 的 productFlavors 来实现。您可以为每个渠道或变体设置不同的应用程序名称和版本号。 例如,在 build.gradle 文件中添加以下代码: ``` android { defaultConfig { versionCode 1 versionName "1.0" } productFlavors { flavor1 { applicationId "com.example.flavor1" versionCode 1 versionName "1.0-flavor1" } flavor2 { applicationId "com.example.flavor2" versionCode 1 versionName "1.0-flavor2" } } } ``` 这将创建两个不同的变体,flavor1 和 flavor2,每个变体都有不同的应用程序 ID、版本号和名称。 最后,如果您想要自定义打包后的 APK 文件的名称,您可以使用 Gradle 的 buildTypes 和 flavorDimensions 属性来实现。您可以为每个构建类型和变体设置不同的 APK 文件名称。 例如,在 build.gradle 文件中添加以下代码: ``` android { defaultConfig { versionCode 1 versionName "1.0" } buildTypes { release { ... archivesBaseName = "MyApp-Release" } debug { ... archivesBaseName = "MyApp-Debug" } } flavorDimensions "version" productFlavors { flavor1 { applicationId "com.example.flavor1" versionCode 1 versionName "1.0-flavor1" dimension "version" } flavor2 { applicationId "com.example.flavor2" versionCode 1 versionName "1.0-flavor2" dimension "version" } } } ``` 这将为 release 和 debug 两个构建类型分别设置不同的 APK 文件名称,以及为 flavor1 和 flavor2 两个变体设置不同的应用程序 ID、版本号和名称。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值