Android/Framework

Android PowerManagerService 분석

임베디드 친구 2025. 4. 11. 11:06
728x90
반응형

Android PowerManagerService 분석

Android의 전력 관리는 PowerManagerService(PMS)에 의해 제어됩니다. PowerManagerService는 디바이스의 전원 상태를 관리하고, 절전 모드를 제어하며, 애플리케이션이 전원 관련 기능을 요청할 수 있도록 합니다. 본 포스팅에서는 PowerManagerService의 주요 역할과 구조를 분석하고, AOSP 코드를 기반으로 동작 원리를 설명하겠습니다.

1. PowerManagerService 개요

PowerManagerService는 Android의 시스템 서비스 중 하나로, com.android.server.power.PowerManagerService 클래스에서 구현되어 있습니다. 이 서비스는 시스템의 다양한 구성 요소와 협력하여 전력 소비를 조절하고, 효율적인 전원 관리를 수행합니다. 주요 역할은 다음과 같습니다.

  • 화면 및 CPU의 전원 상태 관리
  • WakeLock을 통한 전력 유지
  • Suspend 및 Resume 처리
  • 배터리 상태에 따른 전원 정책 적용
  • 앱 및 시스템의 전력 요청 처리

PowerManagerService는 SystemServer가 초기화될 때 생성되며, PowerManager API를 통해 애플리케이션과 상호 작용합니다.

2. PowerManagerService의 주요 클래스 및 인터페이스

PowerManagerService는 여러 컴포넌트와 협력하여 동작합니다. 주요 클래스와 인터페이스는 다음과 같습니다.

2.1 PowerManager

android.os.PowerManager 클래스는 애플리케이션이 전원 관리를 요청할 수 있는 API를 제공합니다. 대표적인 기능은 다음과 같습니다.

  • newWakeLock(int levelAndFlags, String tag): WakeLock 객체 생성
  • goToSleep(long time): 디바이스 절전 모드 진입
  • reboot(String reason): 시스템 재부팅

WakeLock을 활용하여 특정 작업이 수행되는 동안 CPU나 화면이 꺼지지 않도록 설정할 수 있습니다.

2.2 PowerManagerService

com.android.server.power.PowerManagerService는 실제로 전력 관리를 수행하는 핵심 서비스입니다. 주요 기능은 다음과 같습니다.

  • WakeLock 관리
  • 시스템 절전 정책 적용
  • 전력 상태 변경 감지 및 알림

PowerManagerService는 IPowerManager 인터페이스를 통해 Binder IPC를 사용하여 다른 서비스 및 애플리케이션과 통신합니다.

2.3 SuspendControl

SuspendControl은 커널과 직접 통신하여 Suspend 및 Resume을 제어하는 역할을 합니다. AOSP에서는 SystemSuspend를 통해 이를 수행합니다.

3. PowerManagerService 동작 과정

PowerManagerService는 다양한 입력을 처리하여 전력 상태를 조정합니다. 주요 동작 과정은 다음과 같습니다.

3.1 서비스 초기화

PowerManagerService는 SystemServer가 시작될 때 SystemService의 일환으로 초기화됩니다.

public void onStart() {
    publishBinderService(Context.POWER_SERVICE, mBinder);
    publishLocalService(PowerManagerInternal.class, mPowerManagerInternal);
}

여기서 mBinderIPowerManager 인터페이스를 구현하며, 이를 통해 애플리케이션과 다른 시스템 서비스가 PowerManagerService와 통신할 수 있습니다.

3.2 WakeLock 관리

WakeLock은 특정 작업이 수행되는 동안 CPU나 화면이 꺼지지 않도록 보장하는 역할을 합니다. WakeLock은 다음과 같은 방식으로 설정됩니다.

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyApp:WakeLockTag");
wakeLock.acquire();

이 코드를 실행하면 CPU가 꺼지지 않도록 보장됩니다. WakeLock을 해제하려면 release()를 호출해야 합니다.

PowerManagerService 내부에서는 acquireWakeLockInternal() 메서드를 통해 WakeLock이 관리됩니다.

private void acquireWakeLockInternal(IBinder lock, int flags, String tag, WorkSource ws, String packageName) {
    synchronized (mLock) {
        WakeLock wakeLock = new WakeLock(lock, flags, tag, ws, packageName);
        mWakeLocks.add(wakeLock);
        applyWakeLockChangesLocked();
    }
}

WakeLock을 등록하면 mWakeLocks 리스트에 추가되며, applyWakeLockChangesLocked()를 통해 상태가 반영됩니다.

3.3 디바이스 절전 및 화면 제어

PowerManagerService는 시스템의 전원 상태를 조정할 수 있습니다. 예를 들어, 화면을 끄고 절전 모드로 전환하는 경우 다음과 같은 코드가 실행됩니다.

public void goToSleep(long eventTime, int reason, int flags) {
    synchronized (mLock) {
        if (mDisplayPowerRequest.policy != DisplayPowerRequest.POLICY_OFF) {
            mDisplayPowerRequest.policy = DisplayPowerRequest.POLICY_OFF;
            updatePowerStateLocked();
        }
    }
}

이 메서드는 mDisplayPowerRequest의 정책을 변경하여 화면을 끄도록 요청합니다. updatePowerStateLocked()가 호출되면서 디바이스 상태가 변경됩니다.

4. 전력 관리 정책

Android는 다양한 전력 관리 정책을 적용하여 배터리 소모를 최소화합니다. 주요 정책은 다음과 같습니다.

  • Doze Mode: 장시간 사용하지 않을 때 백그라운드 작업을 제한
  • 앱 대기 모드(App Standby): 일정 기간 동안 사용하지 않은 앱의 네트워크 및 WakeLock 제한
  • 배터리 절약 모드(Battery Saver): CPU 성능 제한 및 백그라운드 작업 조정

이러한 정책은 PowerManagerService와 협력하여 적용됩니다.

5. 결론

PowerManagerService는 Android 시스템의 핵심적인 전력 관리 서비스를 담당합니다. WakeLock을 활용하여 애플리케이션이 필요한 동안 전력을 유지할 수 있으며, 시스템 전체의 전력 사용을 최적화하는 역할을 수행합니다. 본 포스팅에서는 PowerManagerService의 주요 기능과 동작 방식을 AOSP 코드와 함께 살펴보았습니다. 이를 바탕으로 효율적인 전력 관리를 위한 개발을 진행할 수 있을 것입니다.

반응형