Android PackageManagerService 분석
개요
PackageManagerService
(이하 PMS)는 Android의 패키지 관리 역할을 담당하는 핵심 시스템 서비스입니다. PMS는 애플리케이션의 설치, 삭제, 업데이트, 권한 관리 등과 관련된 주요 기능을 수행하며, 시스템 부팅 시 SystemServer
에 의해 초기화됩니다. 본 글에서는 PMS의 구조와 주요 기능을 분석하고, AOSP 소스를 기반으로 동작 방식을 살펴보겠습니다.
PackageManagerService 개요
주요 역할
PMS는 Android 시스템에서 패키지를 관리하는 중요한 역할을 합니다. 주요 기능은 다음과 같습니다.
- 애플리케이션 설치 및 제거 관리
- 애플리케이션 권한 관리
- 패키지 정보 제공 (예: 앱 목록, 버전 정보 등)
- 사용자 및 프로필별 애플리케이션 관리
Intent
필터 및 브로드캐스트 관리SharedUserID
및 서명 검증
PMS의 위치 및 실행
PMS는 SystemServer
프로세스에서 실행되며, com.android.server.pm.PackageManagerService
클래스에 구현되어 있습니다. AOSP의 해당 소스 파일은 다음 위치에서 확인할 수 있습니다.
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
시스템 부팅 시 SystemServer.java
에서 PMS가 초기화됩니다. 주요 초기화 과정은 다음과 같습니다.
// SystemServer.java
private void startOtherServices() {
...
PackageManagerService packageManager = new PackageManagerService(...);
ServiceManager.addService("package", packageManager);
...
}
PackageManagerService의 구조
PMS는 여러 개의 내부 클래스를 가지고 있으며, 각 클래스는 특정한 기능을 담당합니다. 주요 클래스는 다음과 같습니다.
클래스명 | 역할 |
---|---|
PackageManagerService |
패키지 관리의 중심 클래스 |
Installer |
패키지 설치 및 삭제 담당 |
PackageSetting |
패키지 설정 정보를 저장 |
Settings |
시스템의 패키지 정보를 저장 및 관리 |
DexManager |
앱의 dex 파일 최적화 관리 |
PermissionManagerService |
권한 관리 담당 |
패키지 설치 과정 분석
Android에서 APK를 설치하면 PMS가 이를 처리합니다. 주요 흐름은 다음과 같습니다.
1. 설치 요청 수신
사용자가 APK를 설치하면 PackageInstallerService
가 이를 PMS로 전달합니다. 내부적으로 installPackage()
가 호출됩니다.
// PackageInstallerService.java
public void installPackage(Uri packageURI, ...) {
mPm.installPackageAsUser(packageURI, ...);
}
2. 패키지 검증 및 복사
PMS는 APK의 서명을 검증하고, PackageParser
를 통해 APK의 메타데이터를 분석한 후 /data/app/
디렉터리에 복사합니다.
// PackageManagerService.java
private void installPackageLI(...) {
PackageParser.Package pkg = parsePackage(apkFile);
verifyPackage(pkg);
moveApkToDataDir(pkg);
}
3. Package 설치 및 Broadcast
설치가 완료되면 Intent.ACTION_PACKAGE_ADDED
브로드캐스트가 발생하여 다른 앱에서 이를 감지할 수 있습니다.
// PMS 내부 코드
Intent intent = new Intent(Intent.ACTION_PACKAGE_ADDED);
intent.setData(Uri.fromParts("package", packageName, null));
broadcastIntent(intent);
패키지 삭제 과정 분석
패키지 삭제 또한 PMS가 담당하며, deletePackage()
가 핵심 함수입니다.
// PackageManagerService.java
public void deletePackage(String packageName, int userId) {
PackageParser.Package pkg = mPackages.get(packageName);
uninstallPackage(pkg);
}
삭제가 완료되면 Intent.ACTION_PACKAGE_REMOVED
브로드캐스트가 발생합니다.
Intent intent = new Intent(Intent.ACTION_PACKAGE_REMOVED);
intent.setData(Uri.fromParts("package", packageName, null));
broadcastIntent(intent);
패키지 정보 조회
PMS는 앱 목록, 버전 정보, 권한 등을 조회하는 API를 제공합니다.
// 특정 패키지 정보 조회
PackageInfo info = packageManager.getPackageInfo("com.example.app", 0);
Log.d(TAG, "App version: " + info.versionName);
마무리
PackageManagerService
는 Android의 핵심 서비스 중 하나로, 패키지의 설치, 삭제, 업데이트, 권한 관리 등의 역할을 수행합니다. 본 글에서는 PMS의 구조와 주요 기능을 분석하고, AOSP 코드를 기반으로 주요 동작 방식을 살펴보았습니다. PMS는 Android의 보안 및 성능에 직접적인 영향을 미치는 중요한 컴포넌트이므로, 심층적인 이해가 필요합니다. 향후 업데이트될 AOSP 코드와 함께 지속적인 분석이 요구됩니다.
'Android > Framework' 카테고리의 다른 글
Binder IPC 개념 및 동작 방식 (0) | 2025.04.12 |
---|---|
Android PowerManagerService 분석 (0) | 2025.04.11 |
Android WindowManagerService 이해하기 (0) | 2025.04.09 |
ActivityManagerService 이해하기 (0) | 2025.04.08 |
Android Framework의 개념 및 역할 (0) | 2025.04.07 |