Есть несколько способов получить versionCode
и versionName
программно.
- Получить версию из
PackageManager
.Это лучший способ для большинства случаев.
try {
String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Получить его из сгенерированного
BuildConfig.java
.Но обратите внимание, что если вы получите доступ к этим значениям в библиотеке, она вернет версию библиотеки, а не приложения, использующие эту библиотеку.Так что
используйте только в небиблиотечных проектах! String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;
Есть некоторые детали, кроме использования второго способа в библиотечном проекте.В новом плагине для Android (3.0.0+) некоторые функции удалены .Итак, на данный момент, т.е. установка другой версии для разных вкусов не работает правильно.
Неправильный путь:
applicationVariants.all { variant ->
println('variantApp: ' + variant.getName())
def versionCode = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
def versionName = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
variant.mergedFlavor.versionCode = versionCode
variant.mergedFlavor.versionName = versionName
}
Код выше будет правильно устанавливать значения в BuildConfig
, но из PackageManager
вы получите 0
и null
, если вы не установили версию в default
конфигурации.Таким образом, ваше приложение будет иметь 0
код версии на устройстве.
Существует обходной путь - установите версию для вывода apk
файла вручную:
applicationVariants.all { variant ->
println('variantApp: ' + variant.getName())
def versionCode = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
def versionName = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
variant.outputs.all { output ->
output.versionCodeOverride = versionCode
output.versionNameOverride = versionName
}
}