仅在发布时自动增加版本代码

Auto increment versioncode only on releases

目前,我正在尝试通过自动递增版本代码来改进我们的构建脚本,以便我们的 QA 团队了解他们正在测试的构建版本,并可以针对特定版本代码进行记录。我们有 3 个 productFlavors(staging、qa、production)和 2 个签名配置(debug、release)。

我研究了不同的解决方案:

How to autoincrement versionCode in Android Gradle

How to autoincrement versionCode in Android Gradle

Autoincrement VersionCode with gradle extra properties

基于这些答案,我使用 version.properties 文件构建了一个版本代码增量器。

现在问题出现了,对于每个 productFlavor 和 SigningConfig 组合(+ android studio 中的 gradle 同步)都会生成一个新的版本代码。每当我点击播放按钮创建 qaRelease 版本时,我希望版本代码递增。所以我们的构建周期是:

你可以尝试类似的东西

import java.util.regex.Pattern    
task('increaseVersionCode') << {

    ... // You could code in your increment system, for eg

    // Using build.gradle (recommended)
    def buildFile = file("build.gradle")
    def pattern = Pattern.compile("versionCode\s+(\d+)")
    def manifestText = buildFile.getText()
    def matcher = pattern.matcher(manifestText)
    matcher.find()
    def versionCode = Integer.parseInt(matcher.group(1))
    def manifestContent = matcher.replaceAll("versionCode " + ++versionCode)
    buildFile.write(manifestContent)


    // Using manifest
    def manifestFile = file('AndroidManifest.xml')
    def matcher = Pattern.compile('versionCode=\"(\d+)\"')
    .matcher(manifestFile.getText())
    matcher.find()
    def manifestContent = matcher.replaceAll('versionCode=\"' +
    ++Integer.parseInt(matcher.group(1)) + '\"')
    manifestFile.write(manifestContent)
}



tasks.whenTaskAdded { task ->
    if (task.name == 'assembleQaRelease') {
        task.dependsOn 'increaseVersionCode'
    }
}

您可以调整 'assembleQaRelease' 以增加版本代码以完成所需的任务。

我是怎么解决的:

  • 我在我的 android 项目的根目录中创建了一个文件 version.properties 并在其中添加了版本代码。

  • 然后我在 build.gradle 文件中创建了名为 getCurrentVersionCode() 的方法来读取当前版本代码。

代码:

def getCurrentVersionCode() {
    def versionPropsFile = file('version.properties')
    def Properties versionProps = new Properties()

    versionProps.load(new FileInputStream(versionPropsFile))

    return versionProps['version_code'].toInteger()
}

我还创建了一个生成新代码的方法:

代码:

// 
//
def setUpdatedVersionCode() {
    def versionPropsFile = file('version.properties')
    def Properties versionProps = new Properties()

    def code = getCurrentVersionCode() + 1

    versionProps['version_code'] = code.toString()
    versionProps['version_name'] = generateVersionName()

    versionProps.store(versionPropsFile.newWriter(), null)
}

然后我创建了一个在 QA 构建时触发的任务。

代码:

task('increaseVersionCode') << {
    setUpdatedVersionCode()
}

tasks.whenTaskAdded { task ->
    if (task.name == 'assembleQaRelease') {
        task.dependsOn 'increaseVersionCode'
    }
}

这样它将版本代码保存在一个单独的文件中,所以我不需要编辑我的 build.gradle。