안드로이드 package dump 분석

이 글은 단말 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)

등 이다. 이 중에서 정보의 축약이 심해 이해가 잘 안되는 것들만 살펴보자.

플래그(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된 것도 있다.
  • 퍼미션 허가 여부에 대한 자세한 내용은 이 글을 살펴보자.

참고

댓글 남기기

이메일은 공개되지 않습니다.

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.