BuildConfig.VersionCode не отражает фактический versionCode после обновления до AGP 3.2.0 - PullRequest
0 голосов
/ 25 сентября 2018

После обновления до AGP (Android Gradle Plugin) 3.2.0 мы не можем установить versionCode непосредственно на mergedFlavor.Если мы сделаем это, мы получим это полезное предупреждение:

versionCode cannot be set on a mergedFlavor directly.
versionCodeOverride can instead be set for variant outputs using the following syntax:
android {
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.versionCodeOverride = 40805
        }
    }
}

После этого изменения все прекрасно работает, кроме одной мелочи.Автоматически сгенерированный BuildConfig.VERSION_CODE не отражает код версии от output.versionCodeOverride = 40805.

До AGP 3.2.0 мы могли динамически устанавливать versionCode с помощью:

applicationVariants.all { v ->
        v.mergedFlavor.versionCode = 40805 // 40805 is hardcoded as an example but it is archived dynamically.
    }

И версиикод отражен в BuildConfig.VERSION_CODE (это очень удобно), и я хотел бы заархивировать то же самое с AGP 3.2.0.

Я знаю, что я мог бы обойти это путем создания настраиваемого поля конфигурации сборки для этого, например variant.buildConfigField('int', 'OVERRIDDEN_VERSION_CODE', "${versionCodeOverride}") и это сгенерирует BuildConfig.OVERRIDDEN_VERSION_CODE с кодом версии, который я переопределил.Архивирование происходит так же, как и при использовании AGP версии ниже 3.2.0, путем установки от versionCode до mergedFlavor.versionCode = 40805, но мне не нравятся такие обходные пути.

Есть ли способ получить output.versionCodeOverride = 40805 отражается в автоматически сгенерированном BuildConfig.VERSION_CODE?

PS: если мы установим versionCode непосредственно в конкретном аромате, он будет работать, как и ожидалось, но это не то, что я хочу знать:)

ОБНОВЛЕНИЕ

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

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Напомним, проблема не в том, что переопределение кода версии вообще не применяется, просто BuildConfig.VERSION_CODE не принимает значение переопределения.

Это было помечено как предполагаемое поведение вофициальный трекер ошибок: https://issuetracker.google.com/issues/37008496

В одном из комментариев объясняется, почему и предлагается определить versionCode во вкусе вместо defaultConfig:

Если мы сделали другой buildconfig.java за вывод, тогда нам также нужно будет запускать javac / proguard / jacoco / dex для каждого сплита, и мы потеряем улучшение сборки [time].

Если это критично для вас, тогдане используйте расщепления и вместо этого используйте ароматы, но мы получим гораздо более медленное время сборки.

Если вы не хотите изменять настройки Curent, вы можете прочитать код версии из манифеставместо.Все, что вам нужно, это контекст:

val versionCode = context.packageManager.getPackageInfo(context.packageName, 0).versionCode

Вы должны кэшировать значение, так как получение информации о пакете является нетривиальной операцией.

То же самое относится к имени версии.

0 голосов
/ 25 сентября 2018

там важен порядок инструкций ...

String versionName = version.versionName
int versionCode = version.versionCode

android {
    applicationVariants.all { variant ->

        // to be removed here:
        // variant.mergedFlavor.versionCode = versionCode

        variant.outputs.each { output ->

            // and to be added here:
            output.versionNameOverride = versionName
            output.versionCodeOverride = versionCode
        }
    }
}

документация для Создание нескольких APK объясните это, ниже "Настроить управление версиями".

в то время какпричина этого не в build-tools 3.2.0, а в Gradle 4.6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...