시스템 서비스(system services)는 Android 운영체제가 앱과 하드웨어 사이에서 제공하는 핵심 플랫폼 기능 단위다. AOSP 공식 문서는 시스템 서비스를 "system_server, SurfaceFlinger, MediaService 같은 모듈형·집중형 컴포넌트"로 정의하며, Android framework API가 노출하는 기능의 실제 구현체가 이 서비스들이라고 설명한다.[1][2] 앱 개발자가 getSystemService()를 호출해 받는 ActivityManager, NotificationManager, WindowManager 등은 모두 이 서비스들의 클라이언트 프록시이며, 실제 처리는 Binder IPC를 거쳐 별도 프로세스에서 실행 중인 서비스 구현체에서 일어난다.[2][3]

1. 부트 체인: init, Zygote, SystemServer

Android 기기 전원이 켜지면 부트 ROM → 부트로더 → Linux 커널 순서로 실행이 이어지고, 커널은 사용자 공간의 첫 프로세스인 init을 실행한다. init은 /init.rc와 관련 스크립트를 읽어 각종 데몬과 서비스를 기동하며, 그 중 가장 중요한 것이 Zygote 프로세스다.[4]

Zygote는 Android 런타임(ART)을 초기화하고 공통 프레임워크 클래스를 미리 로드한 뒤 대기 상태로 진입한다. 앱이나 시스템이 새 프로세스를 요청하면 Zygote는 fork()를 통해 자신을 복제해 빠르게 프로세스를 만들어낸다. 이 구조 덕분에 모든 Android 프로세스는 ABI가 동일한 Zygote의 자식 프로세스로 시작하므로, 새 앱 프로세스를 띄울 때마다 JVM을 처음부터 초기화할 필요가 없다.[4]

Zygote가 가장 먼저 fork하는 특별한 자식이 system_server 프로세스다. system_server는 ActivityManagerService, WindowManagerService, PackageManagerService를 비롯한 수십 개의 핵심 시스템 서비스를 같은 JVM 안에서 Java 객체로 인스턴스화하고 Binder 서비스 매니저에 등록한다.[1][2] system_server가 비정상 종료되면 Zygote도 스스로를 종료하고, watchdog이 기기를 재부팅한다. 즉 system_server의 수명이 곧 Android 플랫폼의 수명이다.

2. 핵심 Java 시스템 서비스

system_server 안에는 다수의 Java 서비스가 공존한다. 그 중 가장 중심적인 세 가지가 AMS, WMS, PMS다.

ActivityManagerService(AMS) 는 Android 컴포넌트 생명주기 전반을 관리한다. Activity 백 스택 조정, Service·BroadcastReceiver·ContentProvider 실행 제어, Zygote에 새 앱 프로세스 생성 요청을 모두 담당한다.[2] 프로세스 중요도(oom_adj)를 계산해 메모리 부족 시 어떤 프로세스를 종료할지 결정하는 저수준 조율도 AMS가 담당한다. Android 10부터는 Activity 작업 스택 관련 로직을 분리한 ActivityTaskManagerService(ATMS) 가 별도로 도입되어 AMS의 책임 범위가 좁아졌다.

WindowManagerService(WMS) 는 화면에 그려지는 모든 창(Window)의 크기·위치·레이어·입력 포커스를 관리한다. WMS는 SurfaceFlinger에 창 메타데이터와 버퍼를 전달하고, SurfaceFlinger는 이를 받아 하드웨어 컴포저(HWC)를 통해 최종 화면을 합성한다.[5] AMS와 WMS는 밀접하게 결합되어 있다. Activity는 반드시 Window를 가져야 표시될 수 있기 때문이다.

PackageManagerService(PMS) 는 기기에 설치된 모든 앱의 패키지 정보, 권한 선언, 컴포넌트 목록을 관리한다. 앱 설치·업데이트·제거를 처리하고, 다른 서비스가 앱의 권한을 확인할 때도 PMS에 질의한다.[2] Android App Bundle 또는 APK를 파싱해 /data/system/packages.xml에 메타데이터를 유지하는 것도 PMS의 역할이다.

이 외에도 NotificationManagerService, LocationManagerService, ConnectivityService, PowerManagerService, TelecomService 등 수십 개의 서비스가 system_server 안에 공존한다.[1][2]

3. 네이티브 시스템 서비스

system_server 바깥에서 독립 프로세스로 실행되는 네이티브(C++) 서비스도 있다. SurfaceFlinger는 그래픽 합성 전담 데몬으로, 여러 앱과 시스템 UI가 내보내는 그래픽 버퍼를 받아 하나의 화면으로 합성해 디스플레이에 전달한다.[5] AudioFlinger는 오디오 믹싱과 HAL 접근을 담당하며, 여러 앱이 동시에 소리를 재생하거나 녹음할 때 이를 조율한다.

이 네이티브 데몬들도 Binder를 통해 Java 서비스나 앱과 통신한다. SurfaceFlinger는 WMS와 협력해 화면을 구성하고, Verified Boot 과정에서 시스템 파티션 무결성이 검증된 이후에야 이 데몬들이 정상 기동된다.[1] 이처럼 Android 시스템 서비스는 Java 레이어와 네이티브 레이어가 Binder를 경계로 분리되면서도 협력하는 구조다.

4. Binder IPC와 AIDL

앱 프로세스와 system_server는 서로 다른 프로세스이므로 직접 메모리 접근이 불가능하다. Android는 이를 Binder라는 Linux 커널 드라이버 기반 IPC 메커니즘으로 해결한다.[3] Binder는 클라이언트-서버 모델을 따르며, 앱 측의 Binder 프록시가 메서드 호출을 직렬화해 커널을 통해 서버 측 Binder 노드에 전달한다. 호출자 입장에서는 로컬 함수 호출처럼 보이지만 내부에서는 프로세스 경계를 넘는 통신이 이루어진다.[3]

인터페이스 정의는 AIDL(Android Interface Definition Language)로 작성되며, 빌드 시점에 Java 또는 C++ 바인딩 코드가 자동 생성된다.[6] Android 8.0(Oreo, 2017년 출시)부터는 프레임워크와 HAL 사이의 Binder 트래픽을 분리하기 위해 Binder 컨텍스트 개념이 도입되어, 프레임워크용(/dev/binder)과 HAL용(/dev/hwbinder) 장치 노드가 구분되어 운영된다.[3]

Application Sandbox와 결합하면 이 구조의 보안적 의미가 드러난다. 앱은 서비스의 내부 구현에 직접 접근할 수 없고, Binder를 통해 공개된 인터페이스만 호출할 수 있다. 서비스는 호출자의 UID와 PID를 검사해 권한을 확인한 뒤 요청을 처리할지 거부할지 결정한다.[3]

5. 일반 OS 시스템 서비스 개념과의 비교

운영체제 일반 개념에서 시스템 서비스(또는 시스템 데몬)는 백그라운드에서 상시 실행되며 핵심 플랫폼 기능을 제공하는 프로세스를 뜻한다. Linux에서는 systemd가 관리하는 각종 데몬이, Windows에서는 SCM(Service Control Manager)이 관리하는 서비스가 이 범주에 속한다.[7]

Android의 시스템 서비스는 이 개념을 계승하면서도 몇 가지 특징적인 차이가 있다. 첫째, 핵심 서비스 대부분이 별도 프로세스가 아니라 단일 system_server JVM 프로세스 안의 Java 객체로 동작한다. 이는 프로세스 간 컨텍스트 전환 비용을 줄이고 서비스 간 협력을 단순하게 만든다.[2] 둘째, Binder라는 Android 전용 IPC가 RPC의 역할을 전담해, UNIX 소켓이나 공유 메모리 같은 전통적인 IPC 대신 일관된 클라이언트-서버 프로그래밍 모델을 제공한다.[3] 셋째, Zygote를 통한 프로세스 포크 모델이 Unix의 전통적인 exec() 기반 데몬 실행과 구별된다.[4] 이런 설계 차이는 Android가 모바일 환경의 메모리 제약과 빠른 앱 시작 요건에 최적화된 결과이며, Android framework 전체 아키텍처와 맞물려 있다.[1]

6. 관련 문서

7. 인용 및 각주

[1] Architecture overview, Android Open Source Project, Ssource.android.com(새 탭에서 열림)

[2] Platform architecture, Android Developers, Ddeveloper.android.com(새 탭에서 열림)

[3] Binder overview, Android Open Source Project, Ssource.android.com(새 탭에서 열림)

[4] About the Zygote processes, Android Open Source Project, Ssource.android.com(새 탭에서 열림)

[5] SurfaceFlinger and WindowManager, Android Open Source Project, Ssource.android.com(새 탭에서 열림)

[6] AIDL overview, Android Open Source Project, Ssource.android.com(새 탭에서 열림)

[7] Services overview, Android Developers, Ddeveloper.android.com(새 탭에서 열림)