仅在版本

时间:2015-05-29 07:14:13

标签: android gradle android-gradle

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

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

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 sync),都会生成一个新的版本代码。每当我点击播放按钮创建qaRelease构建时,我希望版本代码递增。所以我们的构建周期将是:

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

2 个答案:

答案 0 :(得分:8)

我是如何解决的:

  • 我在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()
}

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

代码:

// 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)
}

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

代码:

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

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

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

答案 1 :(得分: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'
    }
}

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