android apk 버전 정보 추출하기

(versionCode, versionName)

 

 

Android 애플리케이션은 개발자가 관리의 목적으로 만들어서 사용하는 버전 정보가 있다. 예를 들어, 지금 Android App Store 마켓을 들어가서 "Kakotalk"을 검색한 후 "자세히 알아보기" 버튼을 클릭하면 "8.9.6"이라는 버전 정보를 볼 수 있을 것이다. 혹은 "Line"을 검색한 후, 동일한 방법으로 버전 정보를 찾아보면 "10.12.1"이라고 볼 수 있을 것이다. 아래 첨부한 그림은 "Dropbox"앱에 대한 버전 정보를 나타내고 있다. (참고로, 앱 제작사가 계속해서 업그레이드 하고 있으니 저와 다른 버전으로 보일 수 있다.)

 

 

[ android application versionName ]

 

 

Android 애플리케이션이 다음 버전으로 올라갈 때마다 버전의 숫자는 올라가긴 하지만, 앱 제작사가 원하는 규칙에 의해서 카운팅되어 오르는 것이기 때문에, 제작사마다 사용하는 앱의 버전 규칙들은 모두 다를 것이다. 이렇게 만들어진 앱의 버전 정보는 Android 시스템이 업그레이드의 여부를 판단할 때 사용하는 기준이 된다. 따라서, 제작사가 새로운 기능을 넣어서 업그레이드 시켜야하는 앱은 항상 이전 버전보다 높아야만 한다.

 

 

Version Code와 Version Name 차이
  • Application Version Name : 버전을 사용자에게 보여주기 위한 것이 목적인 버전 닉네임 값 (Android App Store에서 보이는 정보)

  • Application Version Code : 개발자에 의해 작성되고, Android 시스템에 의해 앱 업그레이드시 동작하는 기준이 되는 정보로, 앱 개발시 특히 중요한 역할을 하는 값 

 

 

versionCode, versionName 설정하기

아래 코드는 애플리케이션 설정파일인 gradle 내용 중 versionCode와 versionName을 설정하는 부분이다. 글쓴이는 현재 990이라고 임시로 작성했지만, 제작사들은 버전을 구성하는 숫자를 (자릿수를 기준으로 major한 변화나 minor한 변화들이 있을 때마다 특정 위치의 번호를 변경하는 등) 자신들만의 규칙을 정하고 그에 따라 버전 정보들이 관리되곤 한다.

// ...app.gradle

android {
    compileSdkVersion 29
    defaultConfig {
        applicationId "..."
        minSdkVersion 24
        targetSdkVersion 29
        versionCode 990		// 시스템이 보는 버전 이름
        versionName "9.9.0"		// 사용자가 보는 버전 이름
    }
    ...
}

 

 

Programming으로 versionCode, versionName 알아내기

Android API 중 PackageInfo를 사용해서 원하는 (패키지를 가진) 애플리케이션의 버전을 알아낼 수 있다. 참고로, API 28 이후로는 PackageInfo의 versionCode 변수는 deprecated 되었기 때문에, getLongVersionCode() 함수를 통해 가져와야 한다. 이처럼 프로그래밍 코드로 작성될 경우, 동작하려는 자신의 앱의 버전을 체크하거나 혹은 호출하려는 앱의 버전을 체크하려고 할 때 유용한 방법으로 사용된다.

// ...android java code

final PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
int versionCode;
String versionName;

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    versionCode = (int) pInfo.getLongVersionCode();
} else {
    versionCode = pInfo.versionCode;
}
versionName = pInfo.versionName;

 

 

APK로 versionCode, versionName 알아내기

apk만을 가지고 version을 알아내는 방법 몇가지를 소개한다. 현재 개발자가 가지고 있는 앱이 제작사가 몇번째 코드로 개발되었는지를 파악하려고 할 때 유용한 방법들로 사용될 수 있다.

  • apk확장자를 zip으로 변경한 후, AndroidManifest.xml 파일 확인하기

  • APK 디컴파일을 한 후, AndroidManifest.xml 파일 확인하기

  • Android Build Tool의 appt를 사용해서 AndroidManifest.xml 파일 확인하기

 

apk확장자를 zip으로 변경한 후, AndroidManifest.xml 파일 확인하기

  1. sample.apk 파일을 강제로 sample.zip 으로 변경

  2. sample.zip 압축 풀기

  3. AndroidManifest.xml 파일 열기

    1. Browser, 개발용 IDE 혹은 Editor으로 열기

  4. versionCode, versionName 확인

 

APK 디컴파일을 한 후, AndroidManifest.xml 파일 확인하기

  1. sample.apk 파일을 apktool 혹은 (첨부로 링크된) apk 디컴파일 사이트에서 디컴파일을 수행

  2. AndroidManifest 파일 열기

  3. Browser, 개발용 IDE 혹은 Editor으로 열기

  4. versionCode, versionName 확인

 

Android Build Tool의 appt를 사용해서 AndroidManifest.xml 파일 확인하기

  1. 터미널 or 명령창 열기

  2. 로컬에서 android sdk 경로로 이동

    1. macOS일 경우 default android SDK 경로 : "/Users/<user>/Library/Android/sdk/build-tools/<version>/"

    2. windows일 경우 default android SDK 경로 : "C:\Users\<user>\AppData\Local\Android\android-sdk\"
  3. 아래 명령 실행
// aapt를 사용하는 경우
joker@MacBookPro$ aapt dump badging sample.apk

// aapt를 사용하는 경우
joker@MacBookPro$ aapt2 dump badging sample.apk.apk

// 출력 내용
versionCode='990' versionName='9.9.0' compileSdkVersion='29' 
...
...

 

 

참고

Android Developer Version Code 관리 링크

Android Developer getLongVersionCode() 링크

Android Get versionName or versionCode of an APK 링크

Android Developer AAPT2 (android asset packaging tool) 링크

APKTool 링크

APK Decompilers Online 링크