[android] Android Gradle에서 versionCode를 자동 증가시키는 방법

Gradle을 기반으로 한 새로운 Android 빌드 시스템을 실험 중이며 versionCode를 자동으로 늘리는 가장 좋은 방법이 무엇인지 생각하고 있습니다. 두 가지 옵션을 생각하고 있습니다

  1. versionCode 파일을 만들고, 번호를 읽고, 늘리고, 파일에 다시 씁니다.
  2. AndroidManifest.xml을 구문 분석하고, 여기에서 versionCode를 읽고, 늘리고, AndroidManifest.xml에 다시 씁니다.

더 간단하거나 적합한 솔루션이 있습니까?

누구든지 멘티 오드 옵션 중 하나를 사용하여 나와 공유 할 수 있습니까?



답변

두 번째 옵션 인 구문 분석을 결정했습니다 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'
    }
}

versionCode이 경우 릴리스 빌드 용으로 릴리스됩니다. 디버그 빌드를 위해 그것을 늘리려면 task.whenTaskAdded콜백 에서 task.name 방정식을 변경하십시오 .


답변

이 코드를 사용하여 “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'
    }
}


답변

사용중인 정확한 설정이 아닌 것 같지만 제 경우에는 빌드가 jenkins에 의해 실행되고 있으며 $ BUILD_NUMBER를 앱의 versionCode로 사용하고 싶었습니다. 다음은 나를 위해 트릭을했습니다.

defaultConfig {
    ...
    versionCode System.getenv("BUILD_NUMBER") as Integer ?: 9999
    ...
}


답변

버전 코드에 타임 스탬프를 사용하고 있습니다.

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

defaultConfig {
    minSdkVersion 10
    targetSdkVersion 21
    versionCode code
}


답변

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


답변

Gradle Advanced Build Version은 versionCodeversionName을 자동으로 생성하는 Android 용 플러그인입니다 . 많은 사용자 정의가 있습니다. 여기에서 자세한 정보를 찾을 수 있습니다
https://github.com/moallemi/gradle-advanced-build-version


답변

제품 버전과 빌드 유형을 모두 고려하고 매니페스트 구문 분석을위한 @sealskej 논리를 사용하려면 다음을 수행하십시오.

android.applicationVariants.all { variant ->
    /* Generate task to increment version code for release */
    if (variant.name.contains("Release")) {
        def incrementVersionCodeTaskName = "increment${variant.name}VersionCode"
        task(incrementVersionCodeTaskName) << {
            if (android.defaultConfig.versionCode == -1) {
                def manifestFile = file(android.sourceSets.main.manifest.srcFile)
                def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
                def manifestText = manifestFile.getText()
                def matcher = pattern.matcher(manifestText)
                matcher.find()
                def versionCode = Integer.parseInt(matcher.group(1))
                android.defaultConfig.versionCode = versionCode + 1
                def manifestContent = matcher.replaceAll("versionCode=\"" + android.defaultConfig.versionCode + "\"")
                manifestFile.write(manifestContent)
            }
        }
        def hookTask = variant.generateBuildConfig
        hookTask.dependsOn(incrementVersionCodeTaskName)
    }
}