获取 Android 应用程序的构建/版本号

获取 Android 应用程序的构建/版本号

技术背景

在 Android 开发中,获取应用程序的版本号(包括版本代码 versionCode 和版本名称 versionName)是常见需求。版本代码用于内部标识应用的不同构建,版本名称则用于向用户展示应用的版本信息。了解如何获取这些信息,有助于实现应用更新提示、版本管理等功能。

实现步骤

使用 BuildConfig(适用于 Gradle 项目)

  1. build.gradle 文件中配置版本信息
    1
    2
    3
    4
    defaultConfig {
    versionCode 1
    versionName "1.0"
    }
    GROOVY
  2. 在代码中获取版本信息
    • Java
    1
    2
    3
    import com.yourpackage.BuildConfig;
    int versionCode = BuildConfig.VERSION_CODE;
    String versionName = BuildConfig.VERSION_NAME;
    JAVA
    • Kotlin
    1
    2
    val versionCode = BuildConfig.VERSION_CODE
    val versionName = BuildConfig.VERSION_NAME
    KOTLIN

使用 PackageManager

  1. 在代码中获取 PackageInfo 对象
    1
    2
    3
    4
    5
    6
    7
    try {
    PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
    String versionName = pInfo.versionName;
    int versionCode = pInfo.versionCode;
    } catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
    }
    JAVA
    • Kotlin
    1
    2
    3
    4
    5
    6
    7
    try {
    val pInfo = context.packageManager.getPackageInfo(context.packageName, 0)
    val versionName = pInfo.versionName
    val versionCode = pInfo.versionCode
    } catch (e: PackageManager.NameNotFoundException) {
    e.printStackTrace()
    }
    KOTLIN

核心代码

Java

1
2
3
4
5
6
7
8
9
10
try {
PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
String versionName = pInfo.versionName;
int versionCode = pInfo.versionCode;
// 可以根据需求使用版本信息,如显示在 TextView 中
TextView tvVersionName = findViewById(R.id.tv_versionName);
tvVersionName.setText(versionName);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
JAVA

Kotlin

1
2
3
4
5
6
7
8
try {
val pInfo = packageManager.getPackageInfo(packageName, 0)
val versionName = pInfo.versionName
val versionCode = pInfo.versionCode
findViewById<TextView>(R.id.text_version_name).text = versionName
} catch (e: PackageManager.NameNotFoundException) {
e.printStackTrace()
}
KOTLIN

最佳实践

  • 使用工具类封装获取方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class AppVersionUtils {
public static String getVersionName(Context context) {
PackageInfo packageInfo;
try {
packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(e);
}
return packageInfo.versionName;
}

public static int getVersionCode(Context context) {
PackageInfo packageInfo;
try {
packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(e);
}
return packageInfo.versionCode;
}
}
JAVA
  • 在 XML 中使用版本信息
    build.gradle 文件中添加以下代码:
1
2
3
applicationVariants.all { variant ->
variant.resValue "string", "versionName", variant.versionName
}
GROOVY

在 XML 中使用:

1
2
3
4
5
<TextView
android:gravity="center_horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/versionName" />
XML

常见问题

BuildConfig.VERSION_NAME 返回空字符串

可能是因为没有在 build.gradle 文件中设置 versionName。确保在 defaultConfig 中正确设置了 versionName

在 Jetpack Compose 项目中无法导入 BuildConfig

可以按照以下步骤解决:

  1. build.gradle(app 模块)的 android 块中添加 buildConfig = true
1
2
3
4
5
android {
buildFeatures {
buildConfig = true
}
}
GROOVY
  1. 同步项目与 Gradle 文件。
  2. 如果问题仍然存在,运行 “Invalidate Caches / Restart”。
  3. 最后,运行 “Rebuild Project”。

versionCode 被弃用

从 API 28(Android 9 Pie)开始,versionCode 被弃用,建议使用 longVersionCode

1
2
3
4
5
val versionNumber = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
info?.longVersionCode
} else {
info?.versionCode
}
KOTLIN
1
2
3
4
5
6
int versionCode;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
versionCode = (int) PackageInfoCompat.getLongVersionCode(info);
} else {
versionCode = info.versionCode;
}
JAVA

获取 Android 应用程序的构建/版本号
https://119291.xyz/posts/get-android-app-build-version-number/
作者
ww
发布于
2025年5月29日
许可协议