获取 Android 应用程序的构建/版本号
技术背景
在 Android 开发中,获取应用程序的版本号(包括版本代码 versionCode
和版本名称 versionName
)是常见需求。版本代码用于内部标识应用的不同构建,版本名称则用于向用户展示应用的版本信息。了解如何获取这些信息,有助于实现应用更新提示、版本管理等功能。
实现步骤
使用 BuildConfig
(适用于 Gradle 项目)
- 在
build.gradle
文件中配置版本信息1 2 3 4
| defaultConfig { versionCode 1 versionName "1.0" }
GROOVY
|
- 在代码中获取版本信息
1 2 3
| import com.yourpackage.BuildConfig; int versionCode = BuildConfig.VERSION_CODE; String versionName = BuildConfig.VERSION_NAME;
JAVA
|
1 2
| val versionCode = BuildConfig.VERSION_CODE val versionName = BuildConfig.VERSION_NAME
KOTLIN
|
使用 PackageManager
- 在代码中获取
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
|
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 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
可以按照以下步骤解决:
- 在
build.gradle
(app 模块)的 android
块中添加 buildConfig = true
1 2 3 4 5
| android { buildFeatures { buildConfig = true } }
GROOVY
|
- 同步项目与 Gradle 文件。
- 如果问题仍然存在,运行 “Invalidate Caches / Restart”。
- 最后,运行 “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
|