仅在发行版上自动增加版本代码

Vin*_* V. 4 android gradle android-gradle-plugin

目前我正在尝试通过自动递增版本代码来改进我们的编译器,因此我们的QA团队已经知道他们正在测试的构建版本并且可以记录特定的版本代码.我们有3个productFlavors(登台,qa,生产)和2个签名配置(调试,发布).

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

如何在Android Gradle中自动增加versionCode

如何在Android Gradle中自动增加versionCode

使用gradle额外属性自动增加VersionCode

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

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

  • 开发(永远不要更改版本代码)
  • qual(更新版本代码)
  • 制作(永远不要更改版本代码)

Vin*_* V. 8

我是如何解决的:

  • 我在我的android项目的根目录中创建了一个文件version.properties,并在其中添加了versioncode.

  • 然后我在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()
}
Run Code Online (Sandbox Code Playgroud)

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

码:

// http://stackoverflow.com/questions/30523393/auto-increment-versioncode-only-on-releases
//
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)
}
Run Code Online (Sandbox Code Playgroud)

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

码:

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

tasks.whenTaskAdded { task ->
    if (task.name == 'assembleQaRelease') {
        task.dependsOn 'increaseVersionCode'
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Méd*_*ric 4

你可以尝试这样的事情

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'
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以调整“assembleQaRelease”以将版本代码增加到所需的任务。