Как узнать номер сборки / версии вашего Android-приложения?
Мне нужно выяснить, как получить или сделать номер сборки для моего приложения Android. Мне нужен номер сборки для отображения в пользовательском интерфейсе.
Должен ли я сделать что-то с AndroidManifest.xml
?
43 ответа
Если вы используете плагин Gradle /Android Studio, начиная с версии 0.7.0, код версии и название версии доступны статически в BuildConfig
, Убедитесь, что вы импортируете пакет своего приложения, а не другой BuildConfig
:
import com.yourpackage.BuildConfig;
...
int versionCode = BuildConfig.VERSION_CODE;
String versionName = BuildConfig.VERSION_NAME;
Не нужен объект Context!
Также не забудьте указать их в своем build.gradle
файл вместо AndroidManifest.xml
,
defaultConfig {
versionCode 1
versionName "1.0"
}
Использование:
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(getPackageName(), 0);
String version = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
И вы можете получить код версии с помощью этого
int verCode = pInfo.versionCode;
Немного короче версия, если вы просто хотите название версии.
String versionName = context.getPackageManager()
.getPackageInfo(context.getPackageName(), 0).versionName;
Есть две части, которые вам нужны: Android: версия Код Android: версия Имя
versionCode - это число, и каждая версия приложения, которую вы отправляете в Маркет, должна иметь больший номер, чем последняя.
VersionName - это строка, которая может быть любой, какой вы хотите. Здесь вы определяете свое приложение как "1.0", "2.5" или "2 Alpha EXTREME!" или что угодно.
Пример:
Чтобы получить доступ к нему в коде, сделайте что-то вроде:
PackageManager manager = this.getPackageManager();
PackageInfo info = manager.getPackageInfo(this.getPackageName(), 0);
Toast.makeText(this,
"PackageName = " + info.packageName + "\nVersionCode = "
+ info.versionCode + "\nVersionName = "
+ info.versionName + "\nPermissions = " + info.permissions, Toast.LENGTH_SHORT).show();
Использование Gradle и BuildConfig
Получение VERSION_NAME от BuildConfig
BuildConfig.VERSION_NAME
Да, теперь это так просто.
Возвращается ли пустая строка для VERSION_NAME?
Если вы получаете пустую строку для BuildConfig.VERSION_NAME
тогда читайте дальше.
Я продолжал получать пустую строку для BuildConfig.VERSION_NAME
потому что я не устанавливал versionName
в моем файле сборки Grade (я мигрировал из ANT в Gradle). Итак, вот инструкции для обеспечения того, что вы устанавливаете VERSION_NAME
через Gradle.
build.gradle
def versionMajor = 3
def versionMinor = 0
def versionPatch = 0
def versionBuild = 0 // bump for dogfood builds, public betas, etc.
android {
defaultConfig {
versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild
versionName "${versionMajor}.${versionMinor}.${versionPatch}"
}
}
Примечание: это от мастерского Джейка Уортона.
Удаление versionName
а также versionCode
от AndroidManifest.xml
И так как вы установили versionName
а также versionCode
в build.gradle
файл, вы также можете удалить их из вашего AndroidManifest.xml
файл, если они там есть.
BuildConfig.VERSION_NAME //version name from your build file
BuildConfig.VERSION_CODE //version code from your build file
Я не вижу необходимости получать его от менеджера пакетов
Вот чистое решение, основанное на решении Скоттиаба (под редакцией Хави). Сначала показано, как получить контекст, если он не предоставлен вашим методом. Кроме того, он использует несколько строк вместо вызова нескольких методов для каждой строки. Это облегчает отладку приложения.
Context context = getApplicationContext(); // or activity.getApplicationContext()
PackageManager packageManager = context.getPackageManager();
String packageName = context.getPackageName();
String myVersionName = "not available"; // initialize String
try {
myVersionName = packageManager.getPackageInfo(packageName, 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Теперь, когда вы получили название версии в строке myVersionName
Вы можете установить его в TextView или как угодно.
// set version name to a TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);
Получить код сборки, который используется для идентификации apk по его коду версии. Код версии используется для определения фактической конфигурации сборки во время обновления базы данных, публикации и т. Д.
int versionCode = BuildConfig.VERSION_CODE;
Имя версии используется для ознакомления пользователей с разработчиками последовательности Developmemt. Вы можете добавить любое название версии по своему желанию.
String versionName = BuildConfig.VERSION_NAME;
Котлин однострочные
val versionCode = BuildConfig.VERSION_CODE
val versionName = BuildConfig.VERSION_NAME
Обязательно импортируйте BuildConfig
в свой класс.
Однострочники Java
String versionCode = String.valueOf(BuildConfig.VERSION_CODE);
String versionName = String.valueOf(BuildConfig.VERSION_NAME);
Используйте класс BuildConfig
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;
build.gradle(приложение)
defaultConfig {
applicationId "com.myapp"
minSdkVersion 19
targetSdkVersion 27
versionCode 17
versionName "1.0"
}
Как и в 2020: API 28 "versionCode" устарел, поэтому мы можем использовать "longVersionCode"
Пример кода на котлине
val manager = context?.packageManager
val info = manager?.getPackageInfo(
context?.packageName, 0
)
val versionName = info?.versionName
val versionNumber = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
info?.longVersionCode
} else {
info?.versionCode
}
Если вы используете PhoneGap, создайте собственный плагин PhoneGap:
Создайте новый класс в пакете вашего приложения:
package com.Demo; //replace with your package name
import org.json.JSONArray;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import com.phonegap.api.Plugin;
import com.phonegap.api.PluginResult;
import com.phonegap.api.PluginResult.Status;
public class PackageManagerPlugin extends Plugin {
public final String ACTION_GET_VERSION_NAME = "GetVersionName";
@Override
public PluginResult execute(String action, JSONArray args, String callbackId) {
PluginResult result = new PluginResult(Status.INVALID_ACTION);
PackageManager packageManager = this.ctx.getPackageManager();
if(action.equals(ACTION_GET_VERSION_NAME)) {
try {
PackageInfo packageInfo = packageManager.getPackageInfo(
this.ctx.getPackageName(), 0);
result = new PluginResult(Status.OK, packageInfo.versionName);
}
catch (NameNotFoundException nnfe) {
result = new PluginResult(Status.ERROR, nnfe.getMessage());
}
}
return result;
}
}
В plugins.xml добавьте следующую строку:
<plugin name="PackageManagerPlugin" value="com.Demo.PackageManagerPlugin" />
В ваше событие deviceready добавьте следующий код:
var PackageManagerPlugin = function() {
};
PackageManagerPlugin.prototype.getVersionName = function(successCallback, failureCallback) {
return PhoneGap.exec(successCallback, failureCallback, 'PackageManagerPlugin', 'GetVersionName', []);
};
PhoneGap.addConstructor(function() {
PhoneGap.addPlugin('packageManager', new PackageManagerPlugin());
});
Затем вы можете получить атрибут versionName, выполнив:
window.plugins.packageManager.getVersionName(
function(versionName) {
//do something with versionName
},
function(errorMessage) {
//do something with errorMessage
}
);
В этом вопросе есть два разных сценария, которые должным образом не рассмотрены ни в одном из ответов.
Сценарий 1: вы не используете модули
Если вы не используете модули, вы можете получить доступ к файлу BuildConfig и сразу же получить код версии с помощью:
val versionCode = BuildConfig.VERSION_CODE
Это действительно так, потому что это файл BuildConfig уровня вашего приложения, и поэтому он будет содержать ссылку на код версии вашего приложения.
Сценарий 2. В вашем приложении много модулей, и вы делаете вид, что получаете доступ к коду версии приложения из нижнего модуля в иерархии модулей.
Для вас нормально иметь много модулей с заданной иерархией, такой как приложение -> данные -> домен -> пользовательский интерфейс и т. д. В этом случае, если вы получите доступ к файлу BuildConfig из модуля «ui», он не даст вам ссылка на код версии приложения, но на код версии этого модуля.
Чтобы получить код версии приложения, вы можете использовать данную функцию расширения kotlin:
fun Activity.getVersionCode(): Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
packageManager.getPackageInfo(packageName, 0).longVersionCode.toInt()
} else {
packageManager.getPackageInfo(packageName, 0).versionCode
}
Подход к названию версии аналогичен.
Очень простой способ:
private String appVersion = BuildConfig.VERSION_NAME;
Нет, вам не нужно ничего делать с AndroidManifest.xml
В основном название и код версии вашего приложения в файле gradle уровня приложения под тегом defaultConfig:
defaultConfig {
versionCode 1
versionName "1.0"
}
Примечание. Если вы хотите загрузить приложение в PlayStore, можно указать любое имя в качестве имени версии, но код версии должен отличаться от кода текущей версии, если это приложение уже находится в Play Store.
Просто используйте следующий фрагмент кода, чтобы получить код версии и название версии из любой точки вашего приложения:
try {
PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
String version = pInfo.versionName;
int verCode = pInfo.versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
Для Api 28 PackageInfo.versionCode устарел, поэтому используйте следующий код:
Context context = getApplicationContext();
PackageManager manager = context.getPackageManager();
try {
PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
myversionName = info.versionName;
versionCode = (int) PackageInfoCompat.getLongVersionCode(info);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
myversionName = "Unknown-01";
}
имя версии : BuildConfig.VERSION_NAME код версии : BuildConfig.VERSION_CODE
Если вы хотите использовать его в XML, добавьте строку ниже в свой файл Gradle:
applicationVariants.all { variant ->
variant.resValue "string", "versionName", variant.versionName
}
А затем используйте его на вашем xml следующим образом:
<TextView
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/versionName" />
Для пользователей xamarin используйте этот код для получения названия и кода версии
1) Название версии:
public string getVersionName(){
return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionName;
}
2) Код версии:
public string getVersionCode(){
return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionCode;
}
Всегда делай это с try catch
блок:
String versionName = "Version not found";
try {
versionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
Log.i(TAG, "Version Name: " + versionName);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
Log.e(TAG, "Exception Version Name: " + e.getLocalizedMessage());
}
Есть несколько способов получить 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
}
}
Я должен решить это с помощью класса предпочтений.
package com.example.android;
import android.content.Context;
import android.preference.Preference;
import android.util.AttributeSet;
public class VersionPreference extends Preference {
public VersionPreference(Context context, AttributeSet attrs) {
super(context, attrs);
String versionName;
final PackageManager packageManager = context.getPackageManager();
if (packageManager != null) {
try {
PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
versionName = packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
versionName = null;
}
setSummary(versionName);
}
}
}
Вот метод для получения кода версии:
public String getAppVersion() {
String versionCode = "1.0";
try {
versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return versionCode;
}
Этот код был упомянут выше по частям, но здесь он снова все включено. Вам нужен блок try/catch, потому что он может генерировать исключение NameNotFoundException.
try {
String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}
Я надеюсь, что это упрощает вещи для кого-то в будущем.:)
Вот простой способ получить название версии и код версии
String version_name=BuildConfig.VERSION_NAME;
int version_code=BuildConfig.VERSION_CODE;
Кто-то, кому не нужна информация BuildConfig для пользовательского интерфейса приложения, тем не менее, хочет использовать эту информацию для настройки конфигурации задания CI или других, таких как я.
Существует автоматически сгенерированный файл, BuildConfig.java, в каталоге вашего проекта, если вы успешно строите свой проект.
{WORKSPACE} / строить / генерироваться / источник /buildConfig/{отлаживать | выпуск}/{PACKAGE}/BuildConfig.java
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.XXX.Project;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.XXX.Project";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0.0";
}
Разделите информацию, которая вам нужна, с помощью скрипта Python или других инструментов. Вот пример:
import subprocess
#find your BuildConfig.java
_BuildConfig = subprocess.check_output('find {WORKSPACE} -name BuildConfig.java', shell=True).rstrip()
#get the version name
_Android_version = subprocess.check_output('grep -n "VERSION_NAME" '+_BuildConfig, shell=True).split('"')[1]
print('Android version :’+_Android_version)
Пожалуйста, извините за мои ограниченные знания английского, но надеюсь, что это поможет.
Пример Котлина:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.act_signin)
packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES).apply {
findViewById<TextView>(R.id.text_version_name).text = versionName
findViewById<TextView>(R.id.text_version_code).text =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) "$longVersionCode" else "$versionCode"
}
packageManager.getApplicationInfo(packageName, 0).apply{
findViewById<TextView>(R.id.text_build_date).text =
SimpleDateFormat("yy-MM-dd hh:mm").format(java.io.File(sourceDir).lastModified())
}
}
Не благодарите:-)
package com.sqisland.android.versionview;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textViewversionName = (TextView) findViewById(R.id.text);
try {
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
textViewversionName.setText(packageInfo.versionName);
}
catch (PackageManager.NameNotFoundException e) {
}
}
}
Попробуй это:
try
{
device_version = getPackageManager().getPackageInfo("com.google.android.gms", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
e.printStackTrace();
}
Первый:
import android.content.pm.PackageManager.NameNotFoundException;
и затем используйте это:
PackageInfo pInfo = null;
try {
pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
e.printStackTrace();
}
String versionName = pInfo.versionName;