안드로이드 앱 설치과정

안드로이드 앱 설치과정

2025년 4월 24일

ref #

android 앱 설정

설치 과정 #

앱의 설치는 adb install 방식과 앱 설치 흐름을 통째로 훑어보려면, AOSP(Android Open Source Project) 소스 코드를 내려받아 아래 단계로 차근차근 진입점을 좇아가는 게 가장 확실합니다.

  1. AOSP 소스 준비 AOSP repo 설정 & 다운로드

bash 복사 편집 mkdir aosp && cd aosp repo init -u https://android.googlesource.com/platform/manifest -b android12.0.0_r1 repo sync -c -j16 에뮬레이터용 빌드 (선택)

bash 복사 편집 source build/envsetup.sh lunch aosp_x86_64-eng m -j32 – 실제 디바이스가 있으면 빌드 없이도 소스만으로 분석 가능하지만, 디버깅 로그를 보려면 에뮬레이터 빌드가 편리합니다.

  1. 설치 요청의 진입점 찾기 pm 커맨드

adb install foo.apk → 디바이스에선 내부적으로 pm install 쉘 커맨드로 전달됩니다.

소스 위치:

swift 복사 편집 frameworks/base/cmds/pm/src/com/android/commands/pm/PM.java 여기서 IPackageManager.installPackage (또는 Android 11 이상에선 installNonIncrementalPackage)를 호출합니다.

Binder 호출 → PackageManagerService

ServiceManager 를 통해 얻은 package 서비스(IPackageManager 구현체)는 PackageManagerService 입니다.

소스 위치:

swift 복사 편집 frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java 메서드:

installPackage()

Android 9+: installNonIncrementalPackage()

Android 11+: installExistingPackageAsUser() 등

  1. APK 파싱 및 검증 패키지 파싱

PackageParser 클래스에서 AndroidManifest.xml, 리소스, 네이티브 라이브러리 등을 해체(parse)

소스 위치:

swift 복사 편집 frameworks/base/core/java/android/content/pm/PackageParser.java 서명 검증

VerificationUtils, PackageSignatures 를 통해 APK 서명(signature)과 Android 버전별 인증 로직 수행

  1. 실제 파일 복사와 최적화 파일 복사

installDir(예: /data/app/…) 생성 후 APK 복사

dex 최적화

ART runtime 최적화: dex2oat 호출

code 위치:

swift 복사 편집 art/runtime frameworks/base/services/core/java/com/android/server/pm/PackageDexOptimizer.java 네이티브 라이브러리 추출

APK 내 .so 파일 추출 → /data/app/…/lib/… 폴더로 복사

  1. 시스템 설정 갱신 & 브로드캐스트 Settings 저장

Settings.java → /data/system/packages.xml 에 새 패키지 정보 업데이트

브로드캐스트

Intent.ACTION_PACKAGE_ADDED, ACTION_PACKAGE_RESTARTED 등 방송

  1. 디버깅 & 로그 추적 logcat -s PackageManager / logcat -s PackageInstaller

각 단계(installPackageLI(), commitInstall())에 로그가 남아 있으니, 포인트를 찍고 따라가며 분석

요약 AOSP 소스 내려받기

frameworks/base/cmds/pm/PM.java → IPackageManager.installPackage()

PackageManagerService.java 의 installXxx 메서드 진입

PackageParser → 파싱

PackageDexOptimizer → dex 최적화

파일 복사, Settings 갱신, 브로드캐스트 순으로 정리

이 흐름을 토대로, 각 클래스에 브레이크포인트를 걸거나 grep(installPackage, commitInstall, PackageParser)으로 호출 체인을 따라가면서 “설치”와 관련된 모든 코드를 분석할 수 있을 거예요. 먼저 여기서 진입점을 잡고, 단계별로 소스 트리를 탐색해 보세요!

comments powered by Disqus