Android/Framework

ActivityManagerService 이해하기

임베디드 친구 2025. 4. 8. 09:49
728x90
반응형

ActivityManagerService 이해하기

개요

ActivityManagerService(AMS)는 Android 시스템의 핵심 서비스 중 하나로, 애플리케이션의 생명 주기 관리, 프로세스 관리, 백그라운드 실행 정책 등을 담당합니다. AMS는 system_server 프로세스 내에서 실행되며, Android 운영체제의 애플리케이션 관리 및 리소스 할당을 책임집니다.

본 글에서는 ActivityManagerService의 역할, 핵심 구성 요소, 그리고 AOSP 코드를 활용한 주요 동작 원리에 대해 설명하겠습니다.


ActivityManagerService의 역할

1. 프로세스 및 태스크 관리

AMS는 각 애플리케이션 프로세스를 관리하며, 필요에 따라 프로세스를 생성하거나 종료합니다. 또한, 태스크(Task)와 관련된 스택(stack) 관리 기능도 제공합니다.

2. 애플리케이션 생명주기 관리

애플리케이션의 Activity, Service, BroadcastReceiver 등의 생명 주기를 관리합니다. 사용자의 상호작용에 따라 포그라운드 또는 백그라운드 상태를 전환합니다.

3. 백그라운드 제한 정책 적용

Android 8.0(Oreo)부터 도입된 백그라운드 실행 제한 및 작업 스케줄링(JobScheduler)을 제어합니다.

4. 시스템 리소스 관리

AMS는 Android 시스템에서 사용 가능한 리소스를 모니터링하며, 메모리 부족 시 Low Memory Killer 등을 통해 프로세스를 종료하는 역할을 수행합니다.

5. ANR (Application Not Responding) 감지 및 처리

애플리케이션이 일정 시간 동안 응답하지 않을 경우 ANR을 감지하고 이를 처리합니다.


AMS의 주요 구성 요소

1. ProcessRecord

각 애플리케이션 프로세스의 상태 정보를 담고 있는 클래스입니다. 프로세스의 UID, PID, 현재 실행 중인 Activity 목록 등을 관리합니다.

2. ActivityStackSupervisor

여러 개의 ActivityStack을 관리하며, 현재 실행 중인 Activity의 상태를 추적하고 전환하는 역할을 합니다.

3. TaskRecord

태스크(Task) 단위의 실행 정보를 담고 있는 클래스입니다. 여러 개의 Activity를 그룹화하여 관리합니다.

4. BroadcastQueue

브로드캐스트 메시지를 관리하는 큐입니다. AMS는 시스템 및 앱에서 발생하는 브로드캐스트를 ForegroundBackground 큐를 통해 관리합니다.

5. OomAdjuster

메모리 관리 및 Out of Memory(OOM) 조정을 담당하는 컴포넌트로, 시스템의 메모리 상태를 고려하여 프로세스의 중요도를 조정합니다.


AOSP 코드 분석: AMS의 초기화 과정

ActivityManagerServiceSystemServer 프로세스 내에서 초기화됩니다. 아래는 AOSP 코드에서 AMS가 생성되는 과정입니다.

1. SystemServer에서 AMS 생성

private void startBootstrapServices() {
    // ActivityManagerService 생성
    mActivityManagerService = new ActivityManagerService(mSystemContext);
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.initPowerManagement();
    mActivityManagerService.setInstaller(installer);
}

SystemServer.java에서 ActivityManagerService 객체를 생성하고 초기화합니다.

2. AMS의 실행

public static ActivityManagerService main(Context systemContext) {
    ActivityManagerService service;
    service = new ActivityManagerService(systemContext);
    service.start();
    return service;
}

ActivityManagerService.main() 메서드를 통해 AMS가 실행됩니다.

3. AMS의 주요 루프

AMS는 시스템 이벤트를 감지하고 처리하기 위해 MessageQueue를 통해 이벤트 루프를 실행합니다.

while (true) {
    Message msg = mHandler.obtainMessage();
    msg.target = this;
    msg.sendToTarget();
}

이 루프를 통해 애플리케이션 프로세스 및 생명 주기 관리 작업이 수행됩니다.


AMS의 주요 기능 분석

1. 프로세스 관리 및 OOM 조정

AMS는 실행 중인 모든 프로세스의 상태를 감시하고 OomAdjuster를 사용하여 중요도를 조정합니다.

void updateOomAdjLocked(ProcessRecord app) {
    int adj = computeOomAdjLocked(app);
    app.setAdj(adj);
}

이 코드를 통해 OOM 조정이 수행됩니다.

2. Activity 생명 주기 관리

AMS는 startActivity() 메서드를 통해 새로운 Activity를 실행합니다.

public int startActivity(IApplicationThread caller, Intent intent) {
    return mActivityStarter.startActivity(caller, intent);
}

3. ANR 감지 및 처리

AMS는 애플리케이션의 응답 속도를 모니터링하여 ANR을 감지합니다.

void appNotResponding(ProcessRecord app) {
    Slog.w(TAG, "ANR detected in process: " + app.processName);
    showAnrDialog(app);
}

결론

ActivityManagerService는 Android 운영체제의 핵심 서비스로, 애플리케이션의 생명 주기, 프로세스, 태스크를 관리하는 중요한 역할을 합니다. AOSP의 AMS 코드를 분석하면 프로세스 및 태스크 관리의 세부적인 동작 원리를 이해하는 데 도움이 됩니다.

반응형