안드로이드 앱 설치과정
2025년 4월 24일
ref #
android 앱 설정
설치 과정 #
앱의 설치는 adb install 방식과 앱 설치 흐름을 통째로 훑어보려면, AOSP(Android Open Source Project) 소스 코드를 내려받아 아래 단계로 차근차근 진입점을 좇아가는 게 가장 확실합니다.
- 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 – 실제 디바이스가 있으면 빌드 없이도 소스만으로 분석 가능하지만, 디버깅 로그를 보려면 에뮬레이터 빌드가 편리합니다.
- 설치 요청의 진입점 찾기 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() 등
- APK 파싱 및 검증 패키지 파싱
PackageParser 클래스에서 AndroidManifest.xml, 리소스, 네이티브 라이브러리 등을 해체(parse)
소스 위치:
swift 복사 편집 frameworks/base/core/java/android/content/pm/PackageParser.java 서명 검증
VerificationUtils, PackageSignatures 를 통해 APK 서명(signature)과 Android 버전별 인증 로직 수행
- 실제 파일 복사와 최적화 파일 복사
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/… 폴더로 복사
- 시스템 설정 갱신 & 브로드캐스트 Settings 저장
Settings.java → /data/system/packages.xml 에 새 패키지 정보 업데이트
브로드캐스트
Intent.ACTION_PACKAGE_ADDED, ACTION_PACKAGE_RESTARTED 등 방송
- 디버깅 & 로그 추적 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)으로 호출 체인을 따라가면서 “설치”와 관련된 모든 코드를 분석할 수 있을 거예요. 먼저 여기서 진입점을 잡고, 단계별로 소스 트리를 탐색해 보세요!