我正在尝试在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
不起作用?
答案 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
}