如何在Android Gradle中自动增加versionCode

sea*_*kej 78 android build auto-increment gradle android-manifest

我正在尝试基于Gradle的新Android构建系统,我在想,用它自动增加versionCode的最佳方法是什么.我正在考虑两种选择

  1. 创建versionCode文件,从中读取数字,增加它并将其写回文件
  2. 解析AndroidManifest.xml,从中读取versionCode,增加它并将其写回AndroidManifest.xml

有没有更简单或合适的解决方案?

有没有人使用过mentiod选项之一并可以与我分享?

sea*_*kej 56

我已经决定第二个选项 - 解析AndroidManifest.xml.这是工作片段.

task('increaseVersionCode') << {
    def manifestFile = file("AndroidManifest.xml")
    def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcher = pattern.matcher(manifestText)
    matcher.find()
    def versionCode = Integer.parseInt(matcher.group(1))
    def manifestContent = matcher.replaceAll("versionCode=\"" + ++versionCode + "\"")
    manifestFile.write(manifestContent)
}

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

versionCode在这种情况下发布用于发布版本.要在调试版本中增加它,请在task.whenTaskAdded回调中更改task.name等式.

  • 一个问题,如何将这些代码集成到Cradle构建系统中? (5认同)
  • 如果我没有在AndroidManifest.xml中设置versionCode怎么办? (3认同)

And*_*res 39

我正在使用此代码使用"major.minor.patch.build"方案更新versionCode和versionName.

import java.util.regex.Pattern

task('increaseVersionCode') << {
    def manifestFile = file("src/main/AndroidManifest.xml")
    def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcher = pattern.matcher(manifestText)
    matcher.find()
    def versionCode = Integer.parseInt(matcher.group(1))
    def manifestContent = matcher.replaceAll("versionCode=\"" + ++versionCode + "\"")
    manifestFile.write(manifestContent)
}

task('incrementVersionName') << {
    def manifestFile = file("src/main/AndroidManifest.xml")
    def patternVersionNumber = Pattern.compile("versionName=\"(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcherVersionNumber = patternVersionNumber.matcher(manifestText)
    matcherVersionNumber.find()
    def majorVersion = Integer.parseInt(matcherVersionNumber.group(1))
    def minorVersion = Integer.parseInt(matcherVersionNumber.group(2))
    def pointVersion = Integer.parseInt(matcherVersionNumber.group(3))
    def buildVersion = Integer.parseInt(matcherVersionNumber.group(4))
    def mNextVersionName = majorVersion + "." + minorVersion + "." + pointVersion + "." + (buildVersion + 1)
    def manifestContent = matcherVersionNumber.replaceAll("versionName=\"" + mNextVersionName + "\"")
    manifestFile.write(manifestContent)
}

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

  • +1表示您获得的控制权 (5认同)

小智 36

它似乎不是你正在使用的确切设置,但在我的情况下,构建由jenkins运行,我想使用它的$ BUILD_NUMBER作为应用程序的versionCode.以下为我做了诀窍.

defaultConfig {
    ...
    versionCode System.getenv("BUILD_NUMBER") as Integer ?: 9999
    ...
}
Run Code Online (Sandbox Code Playgroud)


tha*_*h84 15

我正在使用时间戳作为版本代码:

def date = new Date()
def formattedDate = date.format('yyMMddHHmm')
def code = formattedDate.toInteger()

defaultConfig {
    minSdkVersion 10
    targetSdkVersion 21
    versionCode code
}
Run Code Online (Sandbox Code Playgroud)


Elh*_*aky 7

如果您在build.gradle文件中保留版本代码,请使用下一个代码段:

import java.util.regex.Pattern    
task('increaseVersionCode') << {
    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)
}
Run Code Online (Sandbox Code Playgroud)


moa*_*emi 5

Gradle Advanced Build Version 是一个 Android 插件,可以自动生成versionCodeversionName。有很多定制。在这里你可以找到更多关于它的信息 https://github.com/moallemi/gradle-advanced-build-version