디바이스에 설치된 앱의 버전 정보를 얻거나, 자신의 앱의 버전 정보를 확인하여 어떤 작업이 수행되도록 만들어야 할 때가 있습니다.
이 글에서는 앱 설치 정보를 확인하는 방법을 소개합니다.
- 패키지 정보
- 버전 정보
- 설치 시간 정보
- 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으로 설정되어 있습니다.
Related Posts
- Android 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력