android-gradle set versionNameOverride не устанавливает versionName в BuildConfig.java - PullRequest
0 голосов
/ 28 февраля 2019

У нас есть release и debug buildType, и мы хотим установить для versionCode и versionName постоянное значение для debug, в противном случае каждая сборка перепаковывает apk, даже без изменений кода.

Таким образом, мы устанавливаем фиксированное значение по умолчанию versionCode, а затем переопределяем его для определенного buildType:

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.gradletest"
        minSdkVersion 28
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    applicationVariants.all { variant ->
        if (!variant.buildType.isDebuggable()) {
            variant.outputs.each { output ->
                output.versionCodeOverride = getAppVersionCode()
                output.versionNameOverride = getAppVersionName()
            }
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            signingConfig signingConfigs.debug
            debuggable true
        }
    }
}

, пока это работает для apk, к сожалению, сгенерированный class BuildConfig всегда имеет значение по умолчанию 1/"1.0" значение.Мы читаем и показываем versionNumber из приложения, как подсказывает популярный ответ .

Очевидно, BuildConfig.java генерируется при конфигурации, а не при сборке проекта, поэтому он не может знатьвыбранный вариант.Как с этим справиться?

Наш getAppVersionCode() содержит метку времени, поэтому каждый versionCode отличается.Я попытался перевернуть операторы, чтобы в отладочных сборках каждый раз отображались разные versionCode и versionName, что было бы хорошо для нас.

android {
    defaultConfig {
        versionCode getAppVersionName()
        versionName getAppVersionCode()
    }

    applicationVariants.all { variant ->
        if (variant.buildType.isDebuggable()) {
            variant.outputs.each { output ->
                output.versionCodeOverride = 1
                output.versionNameOverride = "1.0"                
            }
        }
    }
}

Причина, по которой у нас исправлена ​​отладка versionCode в первомДело в том, что мы не хотим перестраивать все подмодули для каждого изменения кода.Во втором варианте, даже если мы установили фиксированное versionNumber для отладочной сборки через output.versionCodeOverride = 1, все подмодули перестраиваются в Android Studio.До Android Studio 3.0 это работало, но больше не работает.Пожалуйста, сообщите.

1 Ответ

0 голосов
/ 15 мая 2019

Как вы заметили, BuildConfig.VERSION_NAME и BuildConfig.VERSION_CODE - это поля автоматической настройки, которые устанавливаются во время настройки и, к сожалению, не зависят от использования скриптов gradle для установки значений переопределения вывода.

Поскольку они автоматическиеПоля конфигурации, они также не могут быть изменены напрямую через скрипты Gradle.К счастью, есть способы обойти это при использовании вашего подхода:

1) Получить реальные значения версии для отображения из диспетчера пакетов: вместо того, чтобы вызывать BuildConfig.VERSION_NAME и BuildConfig.VERSION_CODE, где вам нужно отобразить их в приложении, вызовите

val versionName: String = context.packageManager.getPackageInfo(context.packageName, 0).versionName
val versionCode: Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
             context.packageManager.getPackageInfo(context.packageName, 0).longVersionCode.toInt()
        } else {
            context.packageManager.getPackageInfo(context.packageName, 0).versionCode
        }

Это вернет значения версии, которые вы установили с помощью output.versionCodeOverride для выбранного варианта, даже если для полей BuildConfig по умолчанию установлено значение "1.0" / 1

2) Добавьте свой собственныйПоля BuildConfig для версии приложения Если вы действительно хотите, чтобы имя версии было доступно из BuildConfig, вы можете просто создать дополнительные поля конфигурации при установке значений переопределения вывода.Только убедитесь, что вы НЕ используете автоматические имена полей VERSION_NAME и VERSION_CODE:

android {

    ...

    applicationVariants.all { variant ->
        if (variant.buildType.isDebuggable()) {
            variant.outputs.each { output ->
                output.versionCodeOverride = 1
                output.versionNameOverride = "1.0"                
            }
            variant.buildConfigField("String", "REAL_VERSION_NAME", "\"${getAppVersionName()}\"")
            variant.buildConfigField("Int", "REAL_VERSION_CODE", ${getAppVersionCode()})
        }
    }
}

, а затем используете

val versionName: String = BuildConfig.REAL_VERSION_NAME
val versionCode: Int = BuildConfig.REAL_VERSION_CODE
...