Android/Framework

Android PackageManagerService 분석

임베디드 친구 2025. 4. 10. 13:58
728x90
반응형

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 코드와 함께 지속적인 분석이 요구됩니다.

반응형