使用Gradle设置Android应用程序版本
我正在尝试使用Gradle设置应用程序的名称。请看build.gradle的这段代码:使用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
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()
将自动使用getterdefaultConfig.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()询问者可能正在寻找一个动态设置的解决方案。