Android - App VersionCode, VersionName 등 설치 정보 확인

디바이스에 설치된 앱의 버전 정보를 얻거나, 자신의 앱의 버전 정보를 확인하여 어떤 작업이 수행되도록 만들어야 할 때가 있습니다.

이 글에서는 앱 설치 정보를 확인하는 방법을 소개합니다.

  • 패키지 정보
  • 버전 정보
  • 설치 시간 정보
  • Installer 정보

패키지 정보

PackageInfo에는 앱의 버전 정보 및 설치와 관련된 모든 정보가 있습니다.

다음과 같이 PackageManager.getPackageInfo(package name, flag) API를 이용하여 PackageInfo를 가져옵니다.

val pi : PackageInfo = packageManager.getPackageInfo(packageName, 0)

Target SDK가 30 이상인 앱에서 다른 앱의 정보를 가져올 때는 Package visibility에 대해서 고려해야 합니다. Package visibility는 Android 11에서 추가된 기능으로, App의 Manifest에 확인하고 싶은 앱의 packageName 또는 인텐트 정보를 선언하지 않으면 정보를 얻을 수 없습니다. 모든 앱의 정보를 얻으려면 QUERY_ALL_PACKAGES 퍼미션을 선언하면 됩니다. 자세한 내용은 Package visibility를 확인해주세요.

버전 정보

PackageInfo에서 versionName과 versionCode를 가져올 수 있습니다. versionCode는 P OS에서 Deprecated되었고, longVersionCode로 대체되었습니다.

val pi : PackageInfo = packageManager.getPackageInfo(packageName, 0)

Log.d(TAG, "versionName: ${pi.versionName}")

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    Log.d(TAG, "versionName: ${pi.longVersionCode}")
} else {
    Log.d(TAG, "versionName: ${pi.versionCode}")
}

Output:

11-08 15:41:51.616  2383  2383 D Test    : versionName: 1.0
11-08 15:41:51.616  2383  2383 D Test    : versionName: 1

위에서 출력되는 버전 정보는 프로젝트의 build.gradle에서 설정한 버전 정보입니다.

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

설치 시간 정보

다음과 같이 처음 설치 시간과 마지막으로 업데이트한 시간을 알 수 있습니다. 업데이트를 하지 않았다면 firstInstallTime는 lastUpdateTime와 같습니다.

Log.d(TAG, "firstInstallTime: ${pi.firstInstallTime}")
Log.d(TAG, "lastUpdateTime: ${pi.lastUpdateTime}")

출력해보면 다음과 같이 UTC의 milliseconds로 출력됩니다.

11-08 15:41:51.615  2383  2383 D Test    : firstInstallTime: 1604817710077
11-08 15:41:51.615  2383  2383 D Test    : lastUpdateTime: 1604817710077

만약 읽기 좋게 변경하려면, 다음과 같이 Date와 DateFormat API를 사용하여 형식을 변경할 수 있습니다.

val pi : PackageInfo = packageManager.getPackageInfo(packageName, 0)

// utc milliseconds to formatted date
val date = Date(pi.firstInstallTime)
val formatter: DateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
formatter.timeZone = TimeZone.getTimeZone("UTC")
val dateFormatted = formatter.format(date)

Log.d(TAG, "firstInstallTime: $dateFormatted")

Output:

11-08 15:55:57.896  6984  6984 D Test    : firstInstallTime: 2020-11-08 06:41:50.077

Installer 정보

누가 앱을 설치했는지 Installer 정보도 얻을 수 있습니다.

만약 앱이 PlayStore로부터 설치되었다면 Installer package name은 com.android.vending이 됩니다.

다음과 같이 Installer 정보를 가져올 수 있습니다. getInstallerPackageName(packageName)는 R OS에서 Deprecated되었고, getInstallSourceInfo(packageName)으로 대체되었습니다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
    val info : InstallSourceInfo = packageManager.getInstallSourceInfo(packageName)
    Log.d(TAG, "versionName: ${info.initiatingPackageName}")
} else {
    val installer : String? = packageManager.getInstallerPackageName(packageName)
    Log.d(TAG, "versionName: ${installer}")
}

Output:

11-08 16:19:06.064  4980  4980 D Test    : versionName: com.google.android.packageinstaller

안드로이드 스튜디오로 앱을 설치하면 installer는 null로 설정됩니다. PlayStore나 Files 앱에서 apk 파일을 눌러 설치하면 installer가 설치한 package name으로 설정되어 있습니다.

Loading script...

Related Posts

codechachaCopyright ©2019 codechacha