안드로이드 앱을 개발하고 운영하다 보면, 현재 설치된 내 앱의 버전 정보가 필요한 순간들이 있습니다. 예를 들어, 사용자에게 새로운 버전이 나왔으니 업데이트하라고 안내를 띄우거나, ‘설정’ 또는 ‘앱 정보’ 화면에 현재 버전을 표시해 주거나, 혹은 버그 리포팅 시 앱 버전을 함께 기록하여 분석을 용이하게 할 때 등 다양한 상황에서 활용되죠.
오늘은 안드로이드 앱에서 자신의 버전 정보, 즉 versionCode
와 versionName
을 가져오는 간단하고 확실한 방법을 알아보고, 두 버전 값의 중요한 차이점에 대해서도 명확하게 짚어보겠습니다.
versionCode
와 versionName
, 무엇이 다른가요?
코드를 살펴보기 전에, 안드로이드의 두 가지 버전 체계에 대해 이해하는 것이 중요합니다. 이 둘은 각기 다른 목적을 가지고 있습니다.
versionCode
– 기계를 위한 버전 (내부 관리용)
양의 정수(Integer) 값으로, 앱의 버전을 내부적으로 구분하기 위해 사용됩니다. 주로 구글 플레이 스토어가 업데이트 여부를 판단하는 기준이 됩니다. 새로운 버전의 APK를 스토어에 업로드할 때는 반드시 이전 versionCode
보다 높은 정수값을 사용해야 합니다. 사용자에게는 직접 노출되지 않습니다. 오직 개발자와 플레이 스토어만 이 숫자를 보고 버전을 구분합니다. 값은 항상 1, 2, 3, … 과 같이 증가해야 합니다.
versionName
– 사람을 위한 버전 (사용자 표시용)
문자열(String) 값으로, 사용자에게 보여주기 위한 버전 이름입니다. 사용자가 “아, 내 앱이 지금 이 버전이구나”라고 인지할 수 있도록 하는 것이 주된 목적입니다. 플레이 스토어의 앱 상세 페이지나 앱 내부의 ‘정보’ 화면에 표시됩니다. “1.0”, “1.2.1-beta”, “2025 June Update” 등 개발자가 원하는 형식으로 자유롭게 지정할 수 있습니다. versionCode
와는 달리 반드시 숫자로 구성되거나 증가할 필요는 없습니다.
어디서 설정할까요?
이 두 값은 보통 모듈 수준의 build.gradle
또는 build.gradle.kts
파일 안에서 설정합니다.
// app/build.gradle (Groovy)
android {
defaultConfig {
...
versionCode 1
// 기계가 인식하는 버전 (정수)
versionName "1.0"
// 사용자가 보는 버전 (문자열)
}
...
}
앱 버전 정보 가져오기 (Kotlin/Java 코드)
이제 실제로 코드에서 앱의 버전 정보를 가져오는 방법을 알아보겠습니다. PackageManager
를 이용하면 아주 간단하게 확인할 수 있습니다.
Kotlin 코드 예시
import android.content.Context
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
fun getAppVersion(context: Context): Pair<Int, String> {
return try {
// 현재 앱의 패키지 정보를 가져옵니다.
val packageInfo: PackageInfo = context.packageManager.getPackageInfo(context.packageName, 0)
// versionCode와 versionName을 Pair 형태로 반환합니다.
Pair(packageInfo.versionCode, packageInfo.versionName)
} catch (e: PackageManager.NameNotFoundException) {
// 이 예외는 이론적으로 발생하기 어렵습니다. (자기 자신의 패키지를 못 찾는 경우)
e.printStackTrace()
Pair(-1, "N/A")
}
}
// 사용 예시
// val (versionCode, versionName) = getAppVersion(this)
// Log.d("AppVersion", "Version Code: $versionCode, Version Name: $versionName")
Java 코드 예시
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
public class AppVersionUtils {
public static String getVersionName(Context context) {
try {
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
return packageInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return "N/A";
}
}
public static int getVersionCode(Context context) {
try {
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
return packageInfo.versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return -1;
}
}
}
// 사용 예시
// int versionCode = AppVersionUtils.getVersionCode(this);
// String versionName = AppVersionUtils.getVersionName(this);
// Log.d("AppVersion", "Version Code: " + versionCode + ", Version Name: " + versionName);
코드에서 볼 수 있듯이, context.getPackageManager().getPackageInfo()
메소드를 통해 현재 앱의 PackageInfo
객체를 얻어오고, 이 객체에서 versionCode
와 versionName
프로퍼티를 직접 읽어오면 됩니다. PackageManager.NameNotFoundException
에 대한 try-catch
처리는 필수입니다.
Android 13 (API 33) 이상에서의 더 나은 방법
안드로이드 13(Tiramisu, API 33)부터는 getPackageInfo
메소드의 두 번째 인자로 flags
를 전달하는 방식이 새롭게 도입되었습니다. 이 방식을 사용하면 코드가 조금 더 명확해지고, 더 이상 NameNotFoundException
을 try-catch
로 처리할 필요가 없어집니다.
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import androidx.annotation.RequiresApi
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
fun getAppVersionTiramisu(context: Context): Pair<Long, String> {
// 두 번째 인자로 PackageInfoFlags 객체를 전달합니다.
val packageInfo = context.packageManager.getPackageInfo(
context.packageName,
PackageManager.PackageInfoFlags.of(0)
)
// API 33부터는 longVersionCode를 사용하는 것이 권장됩니다.
// 기존 int 타입의 versionCode는 21억 이상의 값을 표현할 수 없기 때문입니다.
return Pair(packageInfo.longVersionCode, packageInfo.versionName)
}
longVersionCode
는 기존 versionCode
가 표현할 수 있는 정수 범위를 넘어설 경우를 대비해 도입된 Long
타입의 버전 코드입니다. 최신 앱에서는 이 값을 기준으로 작업하는 것이 더 안전합니다.
마치며
오늘은 안드로이드 앱에서 자신의 versionCode
와 versionName
을 가져오는 방법에 대해 알아보았습니다.
versionCode
는 플레이 스토어와 앱 내부 로직을 위한 내부 관리용 정수.versionName
은 사용자와의 소통을 위한 표시용 문자열.
이 두 가지의 차이점을 명확히 이해하고, 오늘 배운 코드를 활용하여 여러분의 앱에 ‘버전 정보 표시’나 ‘업데이트 확인’과 같은 필수적인 기능들을 구현해 보세요. 작지만 중요한 디테일이 앱의 완성도와 사용자 경험을 한 단계 끌어올려 줄 것입니다.
읽어주셔서 감사합니다. 🙂
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."