Установите версию приложения Android с помощью Gradle

Я пытаюсь использовать Gradle для установки имени приложения. Пожалуйста, посмотрите на этот фрагмент build.gradle:

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

...

int getVersionCode() {
    return 1
}

def getVersionName() {
    return "1.0"
}

Android-студия говорит

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

и когда я устанавливаю приложение на устройство, у него вообще нет кода версии и имени версии.

Проблема мне ясна, но я не знаю, как ее решить.
Прошу совета.


person Slava    schedule 24.01.2014    source источник


Ответы (5)


ОТРЕДАКТИРОВАНО

Чтобы определить версию вашего приложения динамически, укажите пользовательский метод с помощью def и вызовите его следующим образом:

def computeVersionName() {
    return "2.0"
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        versionCode 12
        versionName computeVersionName()
        minSdkVersion 16
        targetSdkVersion 16
    }
}

См. здесь. более.

Не используйте имена функций, которые могут конфликтовать с существующими геттерами в данной области. Например, defaultConfig { ... }, вызывающий getVersionName(), автоматически использует геттер defaultConfig.getVersionName() вместо пользовательского метода.

person keithmaxx    schedule 24.01.2014
comment
Спасибо за ответ. Мне также нужно использовать значения versionCode и versionName в других местах build.gradle. Если я жестко запрограммирую это так, я не смогу этого сделать. Поэтому я использую методы. - person Slava; 24.01.2014
comment
Делает ли что-нибудь размещение вашего метода def перед скобкой android? - person keithmaxx; 24.01.2014
comment
к сожалению, это не так. - person Slava; 24.01.2014
comment
В ссылке упоминается 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. Поэтому попробуйте другое имя метода. - person keithmaxx; 24.01.2014
comment
У меня есть функция с именем getMinSdkVersion(), и она не работает, если я переименую ее в getMinSdk(), она будет работать... значит ли это, что предыдущее имя функции где-то предопределено? - person Summer Sun; 06.09.2019
comment
Точно. Мы не знаем точно, каковы эти предопределенные имена функций, поэтому на случай, если имя метода не работает в вашей собственной конфигурации gradle, попробуйте другое. - person keithmaxx; 18.09.2019

Это не решает вашу проблему, но может быть другим решением.

Вы можете использовать gradle.properties внутри вашего корневого проекта и определить:

VERSION_NAME=1.2.1
VERSION_CODE=26

Затем в вашем build.gradle вы можете использовать:

versionName project.VERSION_NAME
versionCode Integer.parseInt(project.VERSION_CODE)
person Gabriele Mariotti    schedule 24.01.2014
comment
Примечание. Это отлично работало до обновления, чтобы использовать новые инструменты сборки! Впоследствии я заметил, что код моей версии не установлен, а Integer.parseInt помечен в Android Studio как неизвестный. Теперь это необходимо: project.VERSION_CODE.toInteger() - person sunadorer; 02.10.2014
comment
Спрашивающий, вероятно, ищет динамически устанавливаемое решение. - person Summer Sun; 06.09.2019

Вот build.gradle, который я использую на основе идей JakeWharton:

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}"
    }
    ....
}
person Phileo99    schedule 29.07.2014
comment
Привет, Phileo99 stackoverflow.com/questions/25556005/ - person Michael Alan Huff; 29.08.2014

Если вы используете файл gradle.properties для хранения общих версий сборки, убедитесь, что sur использует функцию toInteger() для кода версии, скомпилированных/минимальных и целевых версий SD.

См. этот пост для получения дополнительной информации: https://medium.com/@ali.muzaffar/gradle-configure-variables-for-all-android-project-modules-in-one-place-5a6e56cd384e#.yl1x0ziqe

person metch    schedule 28.01.2016

Во-первых, вы вызываете внутренний геттер, поэтому у вас есть нули.

Доступ к свойству 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}" }

In build.gradle:

// applies bloc
apply from: 'config.gradle'

android {
    versionCode getAppVersionCode()
    versionName getAppVersionName()

person Michał Dobi Dobrzański    schedule 08.02.2021