Change versionCode using Android Gradle

2019-05-27 01:44发布

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?

3条回答
老娘就宠你
2楼-- · 2019-05-27 02:26

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"
}
查看更多
老娘就宠你
3楼-- · 2019-05-27 02:32

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.

查看更多
你好瞎i
4楼-- · 2019-05-27 02:40

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

}

查看更多
登录 后发表回答