繁体   English   中英

使用Android Gradle更改versionCode

[英]Change versionCode using Android 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节被忽略了。 我知道这里有一个有效的例子 但仍然想知道为什么内置android.defaultConfig.versionCode不起作用?

尝试将函数名称更改为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"
}

这个案例在官方的android gradle插件ducumentation中描述

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

如果你想要一个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 

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM