[External Post] In Depth : Android Package Manager and Package Installer

원본 Post : [KP Bird] In Depth : Android Package Manager and Package Installer

본 Post는 원본 Post의 내용을 직접 번역/테스트/버그 수정한 글로 컨텐츠에 대한 저작권은 원본 Post의 저자에게 있습니다.
※ 오역을 알려주시면 확인 후 수정하겠습니다. 
※ 안드로이드 분석에 도움이 되시길 바랍니다. 

우리는 하루에도 몇번씩 APK를 설치하고 삭제한다. 그런데 다음의 질문에 답할 수 있나?
1. Package Manager와 Package Installer는 무엇인가?
2. Android에서 APK파일이 어디에 저장될까?
3. 세부적인 APK 설치 과정은 어떻게 되는가?
4. Package Manager는 데이터를 어떻게 저장하는가?
5. Package Manager와 Package Installer의 소스코드를 어디서 찾을 수 있는가?

1. Package Manager와 Package Installer는 무엇인가?
PackageInstaller는 Android에 Package를 설치하는 기본 Application이다. PackageInstaller는 Application/Package를 관리하기 위한 사용자 인터페이스를 제공한다. PackageInstaller는 InstallAppProgress Activity를 호출해 사용자의 명령을 전달받는다. InstallAppProgress는 indalld를 통해 Package 설치를 Package Manager Service에게 요청한다. 소스코드는 <Android Source>/packages/apps/PackageInstaller 에서 확인할 수 있다. 

installd 데몬의 가장 중요한 역할은 Linux 데몬 소켓인 /dev/socket/iinstalled를 통해 Package Manager Service로 부터 요청을 받는 것이다. installd는 Root Permission으로 APK 설치를 위한 단계를 수행하게 된다. 
[ 참조 ]

PackageManager는 Application 설치, 삭제, 업그레이드를 위한 API이다. APK파일을 설치할 때, PackageManager는 Package (APK) 파일을 분석해 확인창을 보여주고, OK 버튼을 누르면 PackageManager가 4개의 Parameter를 갖는 InstallPackage 메소드를 호출한다. (Paramter : uri, installFlags, observer, installPackageName) PackageManager는 Package 서비스를 실행하고 Package 서비스에서 분산이 이루어진다. PackageInstaller 소스코드의 "PackageInstallerActivity.java" 와 "InstallAppProgress.java"를 확인해 보자. system_service 프로세스로 동작하는 Package Manager 서비스와 install 데몬 (installd)은 system 부팅 시점에 native process로 동작한다. 
[ 참조 ]


2. Android에서 APK파일이 어디에 저장될까?
1. 사전에 설치되는 APK(카메라, 캘린더, 브라우저등) 는 /system/app 에 저장된다.
2. 사용자가 설치한 APK는 /data/app 에 저장된다. 
3. Package Manager는 데이터 디렉토리(/data/data/<package name>)를 생성해 저장하고 native library 와 cache data를 참조/공유한다. 

3. 세부적인 APK 설치 과정은 어떻게 되는가?
Package Manager Service는 다음의 과정을 실행한다. 

- Waiting
- Installation Process 큐에 Package가 추가된다. 
- Package 설치 경로를 결정한다. 
- 설치인지, 업데이트인지 확인한다. 
- APK 파일을 주어진 디렉토리에 복사한다. 
- APP의 UID를 결정한다. 
- installd 데몬 프로세스에 요청한다. 
- Application 디렉토리를 만들고 Permission을 설정한다. 
- cache 디렉토리에서 dex code를 추출한다. 
- packages.list를 갱신하기 위해 /system/data/packages.xml 를 최신상태로 갱신한다. 
- 설치 완료를 system에 broadcast 한다. 

Intent.ACTION_PACKAGE_ADDED : 신규 패키지
Intent.ACTION_PACKAGE_REPLACED : 업데이트


4. Package Manager는 데이터를 어떻게 저장하는가?
Package Manager는 /data/system 내의 3개 파일에 Application 정보를 저장한다. 
다음 샘플은 Android 4 ICS 에뮬레이터 이미지에서 추출했다. 
1. packages.xml : Packages/Application 과 Permission 목록을 갖고 있다. 이 xml 파일에는 1) Permission 과 2) Package 를 저장하고 있다. Permission은 <permission> 태그 하위에 표기된다. 각 Permission은 3가지 속성을 갖는다. : Name, Package, Protection
Name 속성은 Permission Name으로 AndroidManifest.xml에서 사용되는 것을 말하고 Package 속성은 Package의 Permission을 의미한다. 대부분의 경우 "android"는 <permission> 태그에 기본 Permission을 갖는다. Protection 속성은 보안 레벨을 가리킨다. 
Package 태그는 다음과 같은 10개의 속성과 하위 태그를 갖는다. 

Sr
Attribute Name
Description
1
name
package name
2
codePath
APK file installation location (/system/app or /data/app)
3
nativeLibraryPath
native library (*.so file) default path is /data/data/<package name>/lib/
4
flag
Store Application Info Flags
5
ft
timestamp in hex format
6
lt
timestamp in hex format of first time installation
7
ut
timestamp in hex format of last update
8
version
Version Code from AndroidManifest.xml file
9
sharedUserId
The name of Linux User ID that will be shared with other applications, It is same parameter which we define in AndroidManifest,xml
10
userId
The name of a Linux user ID

Sub Tags
1. sigs : signature information, count attrubyte represent number of cert tag.
2, cert : certain certification key, index attribute represent global index of certificate, I observer that it increment when new certificate install with application
3. perms : contain permission which developer has set in AndroidManifest.xml

[ 실습 ]
추출 환경 : Samsung Galaxy S5 - 4.4.4 - API 19

저장 경로 : C:\Users\<User Account>\AppData\Local\VirtualStore

샘플 다운로드 : https://db.tt/0mUZQX3Z


2. packages.list : Package Name, User ID, flag, data directory 등의 정보를 갖는 텍스트 파일로 모든 description을 찾을 순 없지만 중요정보만을 갖기 때문에 설치된 Package를 빠르게 찾을 수 있다. 

[ 실습 ]
추출 환경 : Samsung Galaxy S5 - 4.4.4 - API 19

저장 경로 : C:\Users\<User Account>\AppData\Local\VirtualStore

샘플 다운로드 : https://db.tt/0mUZQX3Z


3. packages-stopped.xml : 정지된 상태의 Package 목록을 갖는 파일로 정지된 Application은 Broadcast를 받을 수 없다. 세부 정보는 다음의 링크를 참고하기 바란다. ( http://yuki312.blogspot.in/2012/03/androidbroadcaststop.html )

5. Package Manager와 Package Installer의 소스코드를 어디서 찾을 수 있는가?
< Package Manager > 
frameworks/base/services/java/com/android/server/pm/Settings.java

< Package Installer >
packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java


이 글은 Evernote에서 작성되었습니다. Evernote는 하나의 업무 공간입니다. Evernote를 다운로드하세요.

댓글

가장 많이 본 글