【问题标题】:Set Android app version using Gradle使用 Gradle 设置 Android 应用版本
【发布时间】:2014-02-15 06:43:58
【问题描述】:

我正在尝试使用 Gradle 来设置应用程序的名称。请看这个 build.gradle 的 sn-p:

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

...

int getVersionCode() {
    return 1
}

def getVersionName() {
    return "1.0"
}

Android Studio 说

   'versionCode' cannot be applied to 'java.lang.Integer'
   'versionName' cannot be applied to 'java.lang.String'

当我在设备上安装应用程序时,它根本没有 versionCode 和 versionName。

问题对我来说很清楚,但我不知道如何解决。
请指教。

【问题讨论】:

    标签: android android-studio gradle android-gradle-plugin build.gradle


    【解决方案1】:

    它不能解决您的问题,但它可以是不同的解决方案。

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

    VERSION_NAME=1.2.1
    VERSION_CODE=26
    

    然后在你的 build.gradle 中你可以使用:

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

    【讨论】:

    • 注意:这在更新以使用更新的构建工具之前效果很好!后来我注意到,我的版本代码未设置,并且 Integer.parseInt 在 Android Studio 中被标记为未知。现在需要这个:project.VERSION_CODE.toInteger()
    • 提问者可能正在寻找动态设置的解决方案。
    【解决方案2】:

    已编辑

    为了动态定义您的应用版本,请使用 def 指定自定义方法并调用它,如下所示:

    def computeVersionName() {
        return "2.0"
    }
    
    android {
        compileSdkVersion 19
        buildToolsVersion "19.0.0"
    
        defaultConfig {
            versionCode 12
            versionName computeVersionName()
            minSdkVersion 16
            targetSdkVersion 16
        }
    }
    

    请参阅here 了解更多信息。

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

    【讨论】:

    • 感谢您的回复。我还需要在 build.gradle 的其他地方使用 versionCode 和 versionName 值。如果我像这样对其进行硬编码,我将无法做到这一点。因此我使用方法。
    • def 方法放在android 括号前面有什么作用吗?
    • 不幸的是它没有。
    • 链接确实提到了Note: Do not use function names that could conflict with existing getters in the given scope. For instance instance defaultConfig { ...} calling getVersionName() will automatically use the getter of defaultConfig.getVersionName() instead of the custom method.所以尝试不同的方法名称。
    • 我有一个名为 getMinSdkVersion() 的函数,但它不起作用,如果我将它重命名为 getMinSdk() 它可以工作...这是否意味着以前的函数名称是在某处预定义的?
    【解决方案3】:

    这是我根据JakeWharton 的想法使用的 build.gradle:

    apply plugin: 'com.android.application'
    def versionMajor = 1
    def versionMinor = 2
    def versionPatch = 0
    
    def gitVersion() {
        def counter = 0
        def process = "git rev-list master --first-parent --count".execute()
        return process.text.toInteger()
    }
    
    repositories {
        mavenCentral()
    }
    
    android {
        compileSdkVersion 19
        buildToolsVersion '19.1.0'
    
    
        defaultConfig {
            applicationId 'my.project.com'
            minSdkVersion 14
            targetSdkVersion 19
            versionCode gitVersion()
            versionName "${versionMajor}.${versionMinor}.${versionPatch}"
        }
        ....
    }
    

    【讨论】:

    【解决方案4】:

    如果您使用gradle.properties 文件来存储共享构建版本,请使sur 使用toInteger() 函数来存储版本代码、编译/最小和目标sd 版本。

    更多信息请看这篇文章:https://medium.com/@ali.muzaffar/gradle-configure-variables-for-all-android-project-modules-in-one-place-5a6e56cd384e#.yl1x0ziqe

    【讨论】:

      【解决方案5】:

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

      versionCode 属性由 getVersionCode() 访问。

      versionName 属性由 getVersionName() 访问

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

      在较新的 Android Gradle (4.1.2) 中有一种更简洁的方法。

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

      首先,您应该使用closures,而不是functions

      功能:

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

      build.gradle:

      // applies bloc
      apply from: 'config.gradle'
      
      android {
          versionCode getAppVersionCode()
          versionName getAppVersionName()
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-21
        • 2011-02-14
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 2022-06-13
        • 2015-02-15
        • 1970-01-01
        相关资源
        最近更新 更多