Change versionCode using Android Gradle

2019-05-27 01:57发布

问题:

I'm trying to auto increment versionCode in my build.gradle. But it doesn't work. Then I've tried to simply overwrite versionCode, e.g. versionCode 20 and still it's not updated. Checked both original AndroidManifest.xml and packaged in apk.

Full build.gradle:

import java.util.regex.Pattern

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:0.5+'
    }
}

repositories {
    mavenCentral()
    mavenLocal()
    maven {
        url "http://mente.github.io/facebook-api-android-aar"
    }
}

apply plugin: 'android'
dependencies {
    //provided by android gradle plugin
    compile 'com.android.support:support-v4:+'
    compile 'com.google.android.gms:play-services:3.+'

    compile 'com.facebook:facebook-android-sdk:3.0.2@aar'
    compile 'org.codehaus.jackson:jackson-mapper-asl:1.+'
    compile 'org.twitter4j:twitter4j-core:3.+'

    compile fileTree(dir: 'libs', include: '*.jar')
}

def getVersionCode() {
    println "Hello getVersionCode"
    def manifestFile = file("AndroidManifest.xml")
    def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcher = pattern.matcher(manifestText)
    matcher.find()
    def version = ++Integer.parseInt(matcher.group(1))
    println sprintf("Returning version %d", version)
    return version
}

android {
    defaultConfig {
        versionCode getVersionCode()
    }
    signingConfigs {
        release {
            ...
        }
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }

    buildToolsVersion "17.0"
    compileSdkVersion 17
}

task wrapper(type: Wrapper) {
  gradleVersion = '1.6'
}

Also my debug lines from getVersionCode function are not printed out. Looks like defaultConfig section is ignored. I know there's working example here on SO. But still wondering why built-in android.defaultConfig.versionCode doesn't work?

回答1:

Try changing your function name to something else other than getVersionCode(). I ran into the same problem and changed my function name to something else and it worked

def getVersionCodeFromFileAndIncrement() {
     println "Hello getVersionCodeFromFileAndIncrement"
     def manifestFile = file("AndroidManifest.xml")
     def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
     def manifestText = manifestFile.getText()
     def matcher = pattern.matcher(manifestText)
     matcher.find()
     def version = ++Integer.parseInt(matcher.group(1))
     println sprintf("Returning version %d", version)
     return "$version"
}


回答2:

This case was described in official android gradle plugin ducumentation:

Note: Do not use function names that could conflict with existing getters in the given scope. For instance instance defaultConfig { ...} calling getVersionName() will automatically use the getter of defaultConfig.getVersionName() instead of the custom method.



回答3:

if you would like to have a versdionCode, what is increasing every time, when building the app, I using the time.

def getBuildVersionCode() {

def date = new Date()
def formattedDate = date.format('yyyyMMdd')
def formattedSeconds = date.format('HHmmssSSS')
def formatInt = formattedDate as int;
def SecondsInt = formattedSeconds as int;
return (formatInt + SecondsInt) as int

}

or maybe a better one:

def getVersionCode() {
def date = new Date()
def formattedDate = date.format('yyyyMMddHHmmss')
return formattedDate
}

defaultConfig {

   versionCode getBuildVersionCode()
   minSdkVersion 16
   targetSdkVersion 18

}