使用Android Gradle更改versionCode

时间:2013-07-30 08:29:20

标签: android android-manifest gradle

我正在尝试在build.gradle中自动增加versionCode。但它不起作用。然后我试图简单地覆盖versionCode,例如versionCode 20但仍然没有更新。检查原始AndroidManifest.xml并打包在apk中。

完整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'
}

此外,我的getVersionCode函数的调试行也没有打印出来。看起来defaultConfig部分被忽略了。我知道这里有working example。但仍然想知道为什么内置的android.defaultConfig.versionCode不起作用?

3 个答案:

答案 0 :(得分:3)

尝试将函数名称更改为getVersionCode()以外的其他名称。我遇到了同样的问题,并将我的函数名称更改为其他内容并且它可以正常工作

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

答案 1 :(得分:2)

这个案例was described在官方的android gradle插件ducumentation中:

  

注意:请勿使用可能与现有名称冲突的功能名称   给定范围内的吸气剂。例如,实例defaultConfig {...}   调用getVersionName()会自动使用getter   defaultConfig.getVersionName()而不是自定义方法。

答案 2 :(得分:2)

如果您想要一个versdionCode,每次构建应用程序时都会增加,我会使用时间。

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
     

}

或者更好的一个:

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

defaultConfig {

   versionCode getBuildVersionCode()
   minSdkVersion 16
   targetSdkVersion 18
     

}