이 글은 단말 dumpstate 파일 중에서 패키지 정보에 대한 부분만 소개하는 글이다. dumpstate의 설명을 찾는면, 이 글을 살펴보자.
패키지 dump는 dumpstate에도 포함되어 있고, 아래와 같은 명령어를 통해 단말에서 패키지 dump만 뽑을 수도 있다.
adb shell dumpsys package <패키지 이름>
패키지 dump는 아래와 같은 모양을 갖고, 앱의 정보를 총망라하여 보여준다.
Package [com.android.calendar] (4a50e0): userId=10118 pkg=Package{330fe6f com.android.calendar} ...
예를 들면,
- 단말에서 처리가능한 MINE 타입, 스키마(Scheme) , 액션 정보
- 등록한 권한(permission)
- 버전 정보(versionName, versionCode)
- 설치 위치(codePath, resourcePath)
- 시그니처 정보(apkSigningVersion, signatures)
등 이다. 이 중에서 정보의 축약이 심해 이해가 잘 안되는 것들만 살펴보자.
퍼미션(permissions)
현재 이 단말에 설치된 퍼미션 목록을 표시한다.
예시는 아래와 같다.
…
…
플래그(flags)
패키지의 속성(property)을 표시하는 플래그다. 아래와 같이 속성을 가지고 있다면 표시되고, 속성이 없다면 표시되지 않는다.
Package [com.android.phone] (5328729): ... flags=[ SYSTEM HAS_CODE PERSISTENT ALLOW_CLEAR_USER_DATA ] ... Package [com.google.android.apps.magazines] (6a6fc41): ... flags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP KILL_AFTER_RESTORE EXTERNAL_STORAGE ] ...
위 예제의 전화 앱(com.android.phone)은 SYSTEM HAS_CODE PERSISTENT ALLOW_CLEAR_USER_DATA 속성을 갖고 있다.
패키지가 속성들의 가지고 있는지 판단하는 기준은 com.android.server.pm.Settings 소스 코드에서 살펴볼 수 있다.
... static final Object[] FLAG_DUMP_SPEC = new Object[] { ApplicationInfo.FLAG_SYSTEM, "SYSTEM", ApplicationInfo.FLAG_DEBUGGABLE, "DEBUGGABLE", ApplicationInfo.FLAG_HAS_CODE, "HAS_CODE", ApplicationInfo.FLAG_PERSISTENT, "PERSISTENT", ApplicationInfo.FLAG_FACTORY_TEST, "FACTORY_TEST", ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING, "ALLOW_TASK_REPARENTING", ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA, "ALLOW_CLEAR_USER_DATA", ApplicationInfo.FLAG_UPDATED_SYSTEM_APP, "UPDATED_SYSTEM_APP", ApplicationInfo.FLAG_TEST_ONLY, "TEST_ONLY", ApplicationInfo.FLAG_VM_SAFE_MODE, "VM_SAFE_MODE", ApplicationInfo.FLAG_ALLOW_BACKUP, "ALLOW_BACKUP", ApplicationInfo.FLAG_KILL_AFTER_RESTORE, "KILL_AFTER_RESTORE", ApplicationInfo.FLAG_RESTORE_ANY_VERSION, "RESTORE_ANY_VERSION", ApplicationInfo.FLAG_EXTERNAL_STORAGE, "EXTERNAL_STORAGE", ApplicationInfo.FLAG_LARGE_HEAP, "LARGE_HEAP", ApplicationInfo.FLAG_FORWARD_LOCK, "FORWARD_LOCK", ApplicationInfo.FLAG_CANT_SAVE_STATE, "CANT_SAVE_STATE", }; ...
위 코드를 보면, ApplicationInfo.FLAG_SYSTEM가 true 이면 “SYSTEM” 속성을 가진 것으로 패키지 dump에 표시 되겠다. 그러므로, 저 코드를 참고하여 ApplicationInfo의 구글 API 가이드의 상수 설명을 보면 플래그의 의미를 알 수 있다. 그 중에 설명이 충분하지 않은 것들을 정리해보자.
- “SYSTEM”
프리로드 된 앱이 갖는 속성이다. 단말 제조사에서 바이너리 발행 시, /system/* 폴더에 앱을 탑재해야 한다. 그 예로, /system/priv-app/, /system/app/, /system/framework/ 이 있다.
설치 위치가 /system/*이 아닌 /data/app/라도 시스템을 업데이트 한 경우라면 “SYSTEM” 속성을 가질 수 있다. 시스템을 업데이트한 경우에는 속성이 상속되기 때문이다.
참고로, 이 속성은 패키지의 시그니처나 “PRIVILEGED”처럼 퍼미션 허가 여부에 영향을 미친다. - “UPDATED_SYSTEM_APP”
시스템 앱을 업데이트한 앱이다. 설치 공간은 /data/app/*일 것이며, “SYSTEM” 속성도 함께 갖고 있다. - “PERSISTENT”
항상 실행되는지 여부를 가리키는 플래그로 항상 동작해야하는 소수의 시스템 앱만 선언한다.
AndroidManifest.xml 파일 내 <application/>의 파라미터로 명시적 선언해야한다.
예) 전화, NFC 앱 - “EXTERNAL_STORAGE”
외부 저장공간에 저장된 경우에 표시되는 속성이다.
앱의 제작자가 AndroidManifest.xml 파일 내 <manifest/>의 android:installLocation 파라미터로 명시적 선언되어야 이동이 가능하다.
만약 이동 가능한 앱이라면, “Settings – Apps – <어플리케이션 이름> 선택 – Storage 선택 – 저장공간 이동”, SD카드가 있어야 메뉴가 노출된다.
예) 구글 뉴스 앱 - “LARGE_HEAP”
앱 실행 시 시스템으로 부터 더 큰 Heap 메모리를 할당받는다.
AndroidManifest.xml 파일 내 <application/>의 파라미터로 명시적 선언해야 한다.
시스템에 따라, 앱에 할당하는 기본 Heap 메모리 크기가 다르므로, LARGE_HEAP 속성을 선언했을 때 추가할당하는 heap 크기도 단말마다 다를 수 있다.
프라이빗 플래그(privateFlags)
privateFlags라는 속성 중에서, 한 가지만 살펴보자.
Package [com.android.phone] (5328729): ... privateFlags=[ PRIVILEGED DEFAULT_TO_DEVICE_PROTECTED_STORAGE DIRECT_BOOT_AWARE PARTIALLY_DIRECT_BOOT_AWARE PRIVATE_FLAG_ACTIVITIES_RESIZE_MODE_RESIZEABLE_VIA_SDK_VERSION ] ...
- “PRIVILEGED”
앱 중에서 /system/* 이하에 설치된 경우 “SYSTEM” 속성을 갖고 있다고 했다. 시스템 앱 중에서도 설치된 상세 위치가 /system/priv-app/*인 경우 추가적으로 privateFlags에 이 속성을 갖는다.
참고로, 이 속성은 “SYSTEM” 플래그나 패키지 시그니처러럼 퍼미션 허가 여부에 영향을 미칠 수 있다.
패키지 시그니처(signatures)
패키지의 시그니처 정보를 확인할 수 있다.
Package [com.android.phone] (5328729): ... signatures=PackageSignatures{15f0d38 [b378e95c]} ... Package [com.google.android.apps.magazines] (6a6fc41): ... signatures=PackageSignatures{6261b7d [e3ca78d8]} ...
위 예시 속 패키지는 com.android.phone은 기본 전화 앱, com.google.android.apps.magazines는 구글 뉴스 앱이다. signatures 파라미터의 대괄호 안에 signature가 있고, 이 값이 같은 앱들은 같은 keystore를 통해 signing이 된 것이다.
참고로, 시그니처도 “SYSTEM”이나 “PRIVILEGED” 속성과 갖이 퍼미션 허가 여부에 영향을 미친다.
패키지 상태(활성화, 강제 종료 등)
패키지 활성화(enable) 여부나 강제 종료 여부도 확인할 수 있다.
... User 0: installed=true hidden=false stopped=false notLaunched=false enabled=0 ...
위 패키지 정보 로그 중, stopped 파라미터는 설정 > 어플리케이션 관리자 > 앱 > 강제 종료 되었는지 여부를 가리킨다.
또 enabled 파라미터는 패키지 활성화 여부를 보여준다. 0(Default), 1(Enabled), 2(Diabled), 3(Disabled by user), 4(Diabled until used) 등으로 여기에 사용되는 값은 안드로이드 버전에 따라 추가되기도 하니, PackageManager의 상수들을 참조하면 된다.
그 밖에
- 프리로드 앱(단말에 처음부터 포함된 앱)이 업데이트 된 경우, 프리로드 앱 정보와 업데이트 된 앱 의 패키지 정보가 모두 보인다.
- 플래그 중에는 ApplicationInfo.FLAG_IS_GAME 처럼, deprecated된 것도 있다.
- 퍼미션 허가 여부에 대한 자세한 내용은 이 글을 살펴보자.
참고
- https://sunphiz.me/wp/archives/1794
- https://sunphiz.me/wp/archives/2064
- https://cloud.seu.edu.cn/gitlab/frederickjoe/aosp-frameworks-base/blob/0f40dc923c67e8822f9157aec4f786f73848af07/services/java/com/android/server/pm/Settings.java
- https://developer.android.com/reference/android/content/pm/ApplicationInfo
- https://developer.android.com/guide/topics/manifest/application-element
- https://developer.android.com/guide/topics/data/install-location