플랫폼 전원 관리

Android는 기기 배터리 수명 연장을 위해 기기 사용 및 각성 여부를 모니터링하여 기기 상태에 영향을 미칠 수 있습니다. 플랫폼은 수면 상태에 돌입하여 기기가 사용되지 않는 동안 실행 중인 활동을 일시중지할 수 있습니다.

잠자기

잠자기는 기기가 장시간 사용되지 않을 때 애플리케이션 백그라운드 CPU와 네트워크 활동을 지연시켜 배터리 수명을 연장시킵니다.

잠자기 모드로 전환된 유휴 기기는 주기적으로 유지관리 기간으로 전환되며, 이 시간 동안 앱이 대기 중인 작업(동기화 등)을 완료할 수 있습니다. 그러면 잠자기 모드에서 장시간 동안 수면을 재개하고 이어서 또 다른 유지관리 기간으로 전환합니다. 플랫폼은 계속해서 잠자기 수면/유지관리 시퀀스를 유지하며 최대 몇 시간의 수면 시간에 도달할 때까지 매번의 유휴 시간을 늘립니다. 잠자기 모드의 기기는 항상 움직임을 인식하며, 움직임이 감지되는 즉사 잠자기 모드를 종료합니다.

Android 7.0 이상에서는 잠자기를 연장하여 사용자가 기기 화면을 끌 때마다 좀 더 가벼운 최적화 집합을 트리거하여 사용자가 계속해서 움직이는 경우에도 배터리 수명을 연장합니다

중요한 시스템 서비스는 일반적으로 기기 제조업체가 잠자기에서 제외되도록 설정합니다. 또한 사용자는 설정 메뉴를 통해 특정 앱을 잠자기에서 제외할 수도 있습니다. 하지만 앱을 제외하면 기기의 배터리가 소진될 수 있습니다. AOSP에서는 기본적으로 잠자기가 사용 중지됩니다. 잠자기 통합을 참조하세요.

잠자기 요구사항

잠자기를 지원하려면 기기에 FCM(Firebase Cloud Messaging)과 같은 클라우드 메시징 서비스가 있어야 합니다. 클라우드 메시지와 같은 외부 트리거 이벤트는 기기가 잠자기 모드를 유지하는 동안 일시적으로 앱을 깨워 작업을 수행하도록 할 수 있습니다.

잠자기를 온전히 지원하기 위해서는 기기에 SMD(Significant Motion Detector)가 있어야 합니다. 하지만 Android 7.9 이상의 얕은 잠자기 모드에는 SMD가 필요없습니다. 단, 다음과 같은 기기에 잠자기가 사용 설정되어야 합니다.

  • SMD가 있으며 전체 잠자기 최적화가 발생함(경량 최적화 포함)
  • SMD가 없으며 얕은 잠자기 최적화만 발생함

수명 주기

잠자기는 플랫폼에서 기기의 유휴 상태를 감지하면 시작되며 1개 이상의 종료 기준 활동이 발생하면 종료됩니다.

감지 잠자기 도중 종료

플랫폼은 다음과 같은 경우 기기가 유휴 상태임을 감지합니다.

  • 기기가 움직이지 않는 경우(SMD 사용)
  • 기기 화면이 특정 시간 동안 꺼진 경우

배터리로 구동되는 기기가 충전기에 연결된 상태에서는 잠자기 모드가 시작되지 않습니다.

플랫폼이 시스템의 수면 상태를 유지하려고 시도하며, 유지관리 기간 동안 주기적으로 일반 작업을 재개한 다음 기기를 더 오랜 반복적 기간 동안 수면하도록 합니다. 수면 도중에는 다음과 같은 제한사항이 활성화됩니다.

  • 앱에서 네트워크 액세스를 허용하지 않습니다.
  • 앱 wake lock이 무시됩니다.
  • 알람이 연기됩니다. setAndAllowWhileIdle()을 사용하여 알람 시계 알람 및 알람 집합을 제외합니다(잠자기 모드에서는 앱당 15분마다 1회로 제한). 이러한 예외는 이벤트 알림을 표시해야 하는 캘린더 등의 앱을 대상으로 합니다.
  • Wi-Fi가 검색되지 않습니다.
  • 다음 유지관리 기간까지 SyncAdapter 동기화 및 JobScheduler 작업이 지연됩니다.
  • SMS 및 MMS 메시지를 수신하는 앱이 처리를 완료할 수 있도록 일시적으로 허용목록에 추가됩니다.

다음을 감지하면 플랫폼이 기기의 잠자기 모드를 종료합니다.

  • 기기에 대한 사용자의 상호작용
  • 기기의 움직임
  • 기기 화면 켜짐
  • AlarmClock 알람 임박

알림으로 기기의 잠자기 모드가 종료되지는 않습니다.

Android 7.0 이상에서는 기기가 유휴로 전환되기 전에 화면이 꺼진 상태에서 얕은 수면 모드를 사용 설정하여 잠자기를 연장합니다.

그림 1. 움직이는 기기와 움직이지 않는 기기의 잠자기 모드
작업 잠자기 얕은 잠자기
트리거 화면 꺼짐, 배터리 구동, 움직임 없음 화면 꺼짐, 배터리 구동(연결 해제됨)
시기 유지관리로 인한 기간이 연속적으로 늘어남 유지관리 기간으로 인한 기간(N분) 반복
제한사항 네트워크 액세스, wake lock 도는 GPS/Wi-Fi 검색 불가 알람 및 작업/동기화 지연됨 네트워크 액세스 불가, 작업/동기화 지연됨(유지관리 기간은 예외)
동작 우선순위가 높은 푸시 알림 메시지만 수신됨 모든 실시간 메시지(채팅 메시지, 호출 등)가 수신됨, 우선순위가 높은 푸시 알림 메시지가 수신되면 일시적으로 네트워크 액세스 가능
종료 모션, 화면 켜기 또는 알람 시계 알람 화면 켜짐

앱 대기에 대한 상호작용

  • 잠자기에 소비된 시간은 앱 대기로 계산되지 않습니다.
  • 기기가 잠자기 모드일 때는 유휴 애플리케이션이 하루에 최소 한 번은 일반 작업을 수행할 수 있습니다.

잠자기 통합

잠자기가 사용 설정되면 SENSOR_TYPE_SIGNIFICANT_MOTION을 지원하는 기기가 전체 잠자기 최적화(경량 최적화 포함)를 지원합니다. SMD가 없는 기기는 얕은 잠자기 최적화만 수행합니다. Android는 자동으로 적절한 잠자기 최적화를 선택하며, 공급업체 구성은 필요없습니다.

기기에 잠자기를 사용 설정하는 방법:

  1. 기기에 클라우드 메시징 서비스가 설치되어 있는지 확인합니다.
  2. 기기 오버레이 config 파일 overlay/frameworks/base/core/res/res/values/config.xml에서 config_enableAutoPowerModestrue로 설정합니다.
        <bool name="config_enableAutoPowerModes">true</bool>
        
    AOSP에서는 기본적으로 이 매개변수가 false(잠자기 사용 중지)로 설정됩니다.
  3. 미리 로드된 앱과 서비스가 다음과 같은지 확인합니다.
  4. 필요한 서비스가 잠자기에서 제외되었는지 확인합니다.

애플리케이션 테스트 및 최적화

모든 애플리케이션(특히 미리 로드된 애플리케이션)은 잠자기 모드에서 테스트하세요. 자세한 내용은 잠자기 및 앱 대기 테스트를 참조하세요.