使用Gradle设置Android应用程序版本

使用Gradle设置Android应用程序版本,android,android-studio,gradle,android-gradle-plugin,build.gradle,Android,Android Studio,Gradle,Android Gradle Plugin,Build.gradle,我正在尝试使用Gradle设置应用程序的名称。请看build.gradle的这段代码: android { ... defaultConfig { ... versionCode getVersionCode() versionName getVersionName() ... } ... } ... int getVersionCode() { return 1 } def getVe

我正在尝试使用Gradle设置应用程序的名称。请看build.gradle的这段代码:

android {
    ...
    defaultConfig {
        ...
        versionCode getVersionCode()
        versionName getVersionName()
        ...
    }
    ...
}

...

int getVersionCode() {
    return 1
}

def getVersionName() {
    return "1.0"
}
安卓工作室说

   'versionCode' cannot be applied to 'java.lang.Integer'
   'versionName' cannot be applied to 'java.lang.String'
当我在设备上安装应用程序时,它根本没有版本代码和版本名

这个问题我很清楚,但我不知道如何解决。

请提供建议。

已编辑

要动态定义应用程序版本,请使用def指定自定义方法并调用它,如下所示:

def computeVersionName() {
    return "2.0"
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        versionCode 12
        versionName computeVersionName()
        minSdkVersion 16
        targetSdkVersion 16
    }
}
更多信息,请参阅


确保不要使用可能与给定范围内现有getter冲突的函数名。例如,
defaultConfig{…}
调用
getVersionName()
将自动使用getter
defaultConfig.getVersionName()
而不是自定义方法。

它不能解决您的问题,但可以是另一种解决方案

您可以在根项目中使用gradle.properties并定义:

VERSION_NAME=1.2.1
VERSION_CODE=26
然后在build.gradle中,您可以使用:

versionName project.VERSION_NAME
versionCode Integer.parseInt(project.VERSION_CODE)

这是一个build.gradle,我是根据以下想法使用的:


如果使用
gradle.properties
文件存储共享生成版本,请使用
toInteger()
函数存储版本代码、编译的/min和目标sd版本


有关更多信息,请参阅本文:

首先-您正在调用内部getter。,因此您有空值

versionCode属性由getVersionCode()访问

versionName属性由getVersionName()访问

所以你得到null并分配null…-记住,您在
defaultConfig
范围内,因此Gradle将使用最接近的
gerVersionCode()
函数

在较新的Android Gradle(4.1.2)中,有一种更干净的方法可以实现这一点

通常,这些值被分离到新文件中

首先,应该使用
闭包
,而不是
函数

功能:

def myFunction() {

}
关闭:

myClosure = {

}
此外,您还可以使用闭包扩展
ext
范围(它用于存储所有自定义项目范围的Gradle属性,这是一个很好的地方!)

记住不要将函数命名为“getVersionName”“getVersionCode”

创建一个文件
config.gradle

ext {
    appSetup = [
            majorVersion     : 1,
            minorVersion     : 0,
            patchVersion     : 0
    ]

    getAppVersionCode = { appSetup.majorVersion * 10000 + appSetup.minorVersion * 100 + appSetup.patchVersion }

    getAppVersionName = { "${appSetup.majorVersion}.${appSetup.minorVersion}.${appSetup.patchVersion}" }
// applies bloc
apply from: 'config.gradle'

android {
    versionCode getAppVersionCode()
    versionName getAppVersionName()

build.gradle
中:

ext {
    appSetup = [
            majorVersion     : 1,
            minorVersion     : 0,
            patchVersion     : 0
    ]

    getAppVersionCode = { appSetup.majorVersion * 10000 + appSetup.minorVersion * 100 + appSetup.patchVersion }

    getAppVersionName = { "${appSetup.majorVersion}.${appSetup.minorVersion}.${appSetup.patchVersion}" }
// applies bloc
apply from: 'config.gradle'

android {
    versionCode getAppVersionCode()
    versionName getAppVersionName()


谢谢你的回复。我还需要在build.gradle的其他位置使用versionCode和versionName值。如果我像这样硬编码,我将无法做到这一点。因此我使用方法。将你的
def
方法放在
android
括号之前有什么作用吗?遗憾的是,它没有。链接提到了
注意:不要使用可能与给定范围内现有getter冲突的函数名。例如,实例defaultConfig{…}调用getVersionName()将自动使用defaultConfig.getVersionName()的getter,而不是自定义方法。
因此,请尝试其他方法名称。我有一个名为
getMinSdkVersion()
的函数,如果我将其重命名为
getMinSdk()
则无法工作。。。这是否意味着以前的函数名是在某个地方预定义的?嘿,Phileo99注意:在更新到使用新的构建工具之前,这非常有效!后来我注意到,我的版本代码未设置,Integer.parseInt在Android Studio中被标记为未知。现在需要这样做:project.VERSION\u CODE.toInteger()询问者可能正在寻找一个动态设置的解决方案。