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);
}
여기서 mBinder
는 IPowerManager
인터페이스를 구현하며, 이를 통해 애플리케이션과 다른 시스템 서비스가 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 코드와 함께 살펴보았습니다. 이를 바탕으로 효율적인 전력 관리를 위한 개발을 진행할 수 있을 것입니다.
'Android > Framework' 카테고리의 다른 글
Android Framework에서 새로운 시스템 서비스 추가 및 활용 (0) | 2025.04.13 |
---|---|
Binder IPC 개념 및 동작 방식 (0) | 2025.04.12 |
Android PackageManagerService 분석 (0) | 2025.04.10 |
Android WindowManagerService 이해하기 (0) | 2025.04.09 |
ActivityManagerService 이해하기 (0) | 2025.04.08 |