https://developer.android.com/training/monitoring-device-state/doze-standby.html#understand_app_standby


Doze 및 앱 대기 모드 최적화

Android는 Android 6.0(API 레벨 23)부터 두 가지의 절전 기능을 도입했습니다. 사용자는 기기가 전원 공급 장치에 연결되어 있지 않을 때 앱의 작동 방식을 관리하여 배터리 수명을 연장할 수 있습니다. 잠자기 모드는 기기를 오랫동안 사용하지 않는 경우에 앱의 백그라운드 CPU 및 네트워크 액티비티를 지연시켜 배터리 소모량을 줄입니다. 앱 대기 모드는 최근 사용자와 상호작용이 없는 앱의 백그라운드 네트워크 액티비티를 지연시킵니다.

잠자기 및 앱 대기 모드는 특별히 API 레벨 23을 대상으로 하지 않고 Android 6.0 이상에서 실행되는 모든 앱의 동작을 관리합니다. 사용자에게 최고의 환경을 제공할 수 있도록 잠자기 및 앱 대기 모드에서 앱을 테스트하여 코드에 맞게 필요한 항목을 조정합니다. 자세한 내용은 아래 섹션에서 설명합니다.

잠자기 모드 이해


사용자가 플러그를 뽑고 화면이 꺼진 채로 기기를 일정 기간 동안 정지 상태로 두면 기기는 잠자기 모드로 들어갑니다. 잠자기 모드에서 시스템은 앱이 네트워크 서비스와 CPU 사용량이 많은 서비스에 액세스하는 것을 제한하여 배터리를 절약합니다. 또한 앱이 네트워크에 액세스하지 못하도록 하고 작업, 동기화 및 표준 알람을 지연시킵니다.

시스템은 앱에서 지연된 액티비티를 완료할 수 있도록 주기적으로 잠깐 동안 잠자기 모드를 종료합니다. 유지관리 기간 동안 시스템은 보류 중인 동기화, 작업 및 알람을 모두 실행하고 앱이 네트워크에 액세스할 수 있도록 허용합니다.

그림 1. 잠자기 모드에는 반복적인 유지관리 기간이 있어, 이 기간 중 앱은 네트워크를 사용하고 보류 중인 액티비티를 처리할 수 있습니다.

유지관리 기간이 끝나면 시스템이 다시 잠자기 모드로 들어가면서 네트워크 액세스가 정지되고 작업, 동기화 및 알람이 지연됩니다. 시간이 지날수록 시스템은 유지관리 기간의 횟수를 줄입니다. 그 이유는 기기가 충전기에 연결되어 있지 않은 상태에서 비활성 기간이 길어지는 경우에 배터리 소모량을 낮출 수 있기 때문입니다.

사용자가 기기를 움직이거나 화면을 켜거나 충전기를 연결하여 기기를 활성화하면 시스템은 잠자기 모드를 종료하고 모든 앱은 정상적인 액티비티로 돌아갑니다.

잠자기 모드 제한 사항

앱이 Doze 상태에 있는 동안 다음과 같은 제한 사항이 적용됩니다.

  • 네트워크 액세스가 정지됩니다.
  • 시스템은 wake locks를 무시합니다.
  • 표준 AlarmManager 알람(setExact() 및 setWindow() 포함)은 다음 유지관리 기간으로 연기됩니다.
  • 시스템은 Wi-Fi 스캔을 수행하지 않습니다.
  • 시스템은 동기화 어댑터 실행을 허용하지 않습니다.
  • 시스템은 JobScheduler 실행을 허용하지 않습니다.

잠자기 모드 검사 목록

잠자기 모드에 맞게 앱 조정

잠자기 모드가 앱에 미치는 영향은 앱에서 제공되는 기능과 사용하는 서비스에 따라 달라집니다. 대부분의 앱은 수정하지 않아도 잠자기 모드에서 정상적으로 작동합니다. 하지만 일부 경우에는 앱이 네트워크, 알람, 작업 및 동기화를 관리하는 방법을 최적화해야 합니다. 앱은 유지관리 기간 동안 액티비티를 효율적으로 관리할 수 있어야 합니다.

잠자기 모드는 특히 AlarmManager 알람 및 타이머가 관리하는 액티비티에 영향을 줄 가능성이 높습니다. 시스템이 잠자기 모드에 있는 경우, Android 5.1(API 레벨 22) 이하의 알람은 실행되지 않기 때문입니다.

알람 예약을 지원하기 위해 Android 6.0(API 레벨 23)에서는 두 개의 새로운 AlarmManager 메서드, setAndAllowWhileIdle() 및 setExactAndAllowWhileIdle()을 도입했습니다. 메서드를 사용하면 기기가 잠자기 모드에 있는 경우에도 알람이 실행되도록 설정할 수 있습니다.

참고: setAndAllowWhileIdle()과 setExactAndAllowWhileIdle() 모두 앱에서 알람을 9분마다 최대 한 번만 실행할 수 있습니다.

잠자기 모드에서 네트워크 액세스가 제한되는 현상은 특히 앱이 Tickle 또는 알림과 같은 실시간 메시지를 사용하는 경우에도 앱에 영향을 미칠 수 있습니다. 메시지를 수신하기 위해 앱에 네트워크와의 영구적 연결이 필요한 경우에는 가능하면 GCM(Google Cloud Messaging)을 사용해야 합니다.

앱이 잠자기 모드에서 예상대로 작동하는지 확인하려면 adb 명령어를 사용하여 시스템에서 강제로 잠자기 모드를 시작하고 종료하면서 앱의 동작을 관찰합니다. 자세한 내용은 잠자기 및 앱 대기 모드로 테스트를 참조하세요.

앱 대기 모드 이해


앱 대기 모드는 사용자가 활발하게 사용하지 않는 경우, 시스템이 앱의 유휴 상태를 결정하게 합니다. 시스템은 사용자가 일정 시간 앱을 터치하지 않고 다음 중 어느 조건에도 해당하지 않으면 이 결정을 내립니다.

  • 사용자가 명시적으로 앱을 실행합니다.
  • 앱에 현재 포그라운드에 있는 프로세스가 있습니다(액티비티 또는 포그라운드 서비스 중 하나의 형태로, 또는 다른 액티비티나 포그라운드 서비스가 사용 중인 상태로).
  • 앱이 알림을 생성하여 사용자가 그것을 잠금 화면에서 보거나 알림 트레이에서 확인합니다.

사용자가 기기를 전원 공급 장치에 연결하면 시스템은 앱 대기 모드를 해제하기 때문에 앱은 자유롭게 네트워크에 액세스하고 보류 중인 모든 작업 및 동기화를 실행할 수 있습니다. 기기가 오랜 시간 동안 유휴 상태인 경우, 시스템에서는 유휴 앱에 하루에 한 번 정도 네트워크 액세스를 허용합니다.

기기가 유휴 상태일 때 앱과의 상호작용에 GCM 사용


GCM(Google Cloud Messaging)은 클라우드에서 기기로 푸시하는 서비스로, 이 서비스를 이용하면 Android 기기에서 백엔드 서비스와 앱 간의 실시간 다운스트림 메시징을 지원할 수 있습니다. GCM은 클라우드와의 영구적 단일 연결을 제공하기 때문에 실시간 메시징이 필요한 모든 앱이 연결을 공유할 수 있습니다. 연결을 공유하면 여러 앱이 별도의 영구적 연결을 관리하느라 배터리를 빨리 소모하는 일이 없기 때문에 배터리 소모량을 최적화할 수 있습니다. 이런 이유 때문에 앱이 백엔드 서비스와 메시징 상호작용을 해야 하는 경우에 Google은 별도의 영구적 네트워크 연결을 관리하기보다 가능하면 GCM을 사용할 것을 권장합니다.

GCM이 잠자기 및 앱 대기 유휴 모드에 맞게 최적화된 것은 우선 순위가 높은 GCM 메시지 덕분입니다. 우선 순위가 높은 GCM 메시지를 사용하면 사용자 기기가 잠자기 모드에 있거나 앱이 앱 대기 모드에 있는 경우에도 안정적으로 앱을 활성화할 수 있습니다. 잠자기 또는 앱 대기 모드에서 시스템은 메시지를 제공하고 앱이 네트워크 서비스 및 부분 wake locks에 일시적으로 액세스할 수 있도록 한 다음, 기기 또는 앱을 유휴 상태로 되돌립니다.

우선 순위가 높은 GCM 메시지는 그 외의 잠자기 모드에 영향을 미치지 않고 다른 앱의 상태에도 영향을 주지 않습니다. 다시 말해, GCM을 사용하여 효율적으로 통신하는 동시에 시스템과 기기 전반에서 배터리에 대한 영향을 최소화할 수 있다는 의미입니다.

일반적인 모범 사례로, 앱에 다운스트림 메시징이 필요한 경우에는 GCM을 사용해야 합니다. 서버와 클라이언트에서 이미 GCM을 사용하고 있으면 서비스에서 중요한 메시지에 우선 순위가 높은 메시지를 사용하도록 하세요. 이렇게 하면 기기가 잠자기 모드에 있는 경우에도 앱을 안정적으로 활성화할 수 있습니다.

기타 사용 사례 지원


거의 모든 앱은 네트워크 연결, 알람, 작업 및 동기화를 제대로 관리하고 우선 순위가 높은 GCM 메시지를 사용하여 잠자기 모드를 지원할 수 있습니다. 하지만 사용 사례의 범위를 좁히려면 이것만으로는 부족합니다. 이러한 경우에 시스템은 잠자기 및 앱 대기 모드 최적화에서 일부 제외할 앱 허용 목록을 구성할 수 있도록 지원합니다.

허용 목록에 추가된 앱은 잠자기 및 앱 대기 모드 중 네트워크와 부분 wake locks를 사용할 수 있습니다. 하지만 그 외의 제한 사항은 허용 목록에 추가된 앱에 여전히 적용됩니다. 예를 들어, 허용 목록에 추가된 앱의 작업 및 동기화가 API 레벨 23 이하에서 지연되고 일반 AlarmManager 알람은 실행되지 않습니다. 앱에서는 isIgnoringBatteryOptimizations()를 호출하여 앱이 현재 제외 허용 목록에 포함되어 있는지 확인할 수 있습니다.

사용자는 Settings > Battery > Battery Optimization에서 수동으로 허용 목록을 구성할 수 있습니다. 또는 앱에서 사용자에게 허용 목록에 추가하도록 요청할 수도 있습니다.

사용자에게 앱을 허용 목록에 추가하도록 요청하기 전에 앱이 허용 목록에 추가할 수 있는 사용 사례에 부합하는지 확인하세요.

참고: Google Play 정책에서는 앱의 핵심 기능에 악영향을 미치는 경우가 아니면 앱이 Android 6.0 이상의 전원 관리 기능(잠자기 및 앱 대기 모드)에서 직접 제외하도록 요청하는 것을 금지하고 있습니다.

잠자기 및 앱 대기 모드로 테스트


사용자에게 최고의 환경을 제공할 수 있도록 잠자기 및 앱 대기 모드에서 앱을 완전히 테스트해야 합니다.

잠자기 모드에서 앱 테스트

다음 단계에 따라 잠자기 모드를 테스트할 수 있습니다.

  1. Android 6.0(API 레벨 23) 이상의 시스템 이미지로 하드웨어 기기 또는 가상 기기를 구성합니다.
  2. 기기를 개발 머신에 연결하고 앱을 설치합니다.
  3. 앱을 실행시킨 다음 활성 상태로 그냥 둡니다.
  4. 기기 화면을 끕니다. (앱은 여전히 활성 상태입니다.)
  5. 다음 명령어를 실행하여 시스템에서 강제로 잠자기 모드를 시작하고 종료합니다.
    $ adb shell dumpsys battery unplug
    $ adb shell dumpsys deviceidle step

    두 번째 명령어는 두 번 이상 실행해야 할 수도 있습니다. 기기가 유휴 상태로 변경될 때까지 반복합니다.

  6. 기기를 다시 활성화한 후 앱의 동작을 관찰합니다. 기기가 잠자기 모드를 종료할 때 앱이 정상적으로 복구되는지 확인해야 합니다.

앱 대기 모드에서 앱 테스트

앱에서 앱 대기 모드를 테스트하려면:

  1. Android 6.0(API 레벨 23) 이상의 시스템 이미지로 하드웨어 기기 또는 가상 기기를 구성합니다.
  2. 기기를 개발 머신에 연결하고 앱을 설치합니다.
  3. 앱을 실행시킨 다음 활성 상태로 그냥 둡니다.
  4. 다음 명령어를 실행하여 앱에서 강제로 앱 대기 모드를 시작합니다.
    $ adb shell dumpsys battery unplug
    $ adb shell am set-inactive <packageName> true
  5. 다음 명령어를 사용하여 앱이 활성화되는 것을 시뮬레이션합니다.
    $ adb shell am set-inactive <packageName> false
    $ adb shell am get-inactive <packageName>
  6. 활성화되면 앱의 동작을 관찰합니다. 앱이 앱 대기 모드에서 정상적으로 복구되는지 확인해야 합니다. 특히, 앱의 알림과 백그라운드 작업이 계속 예상했던 대로 기능하는지 확인해야 합니다.

허용 목록에 추가할 수 있는 사용 사례


아래 표에는 Battery Optimization 예외 허용 목록에 추가하거나 추가를 요청할 수 있는 사용 사례가 강조표시되어 있습니다. 일반적으로, 잠자기 또는 앱 대기 모드로 인해 앱의 핵심 기능이 중단되거나 앱에서 우선 순위가 높은 GCM 메시지를 사용할 수 없는 기술적인 이유가 있는 경우가 아니면 앱을 허용 목록에 추가해서는 안 됩니다.

자세한 내용은 기타 사용 사례 지원 을 참조하세요.

유형사용 사례GCM 사용 가능 여부허용 목록에 추가 가능 여부참고
채팅 또는 통화 앱기기가 잠자기 모드에 있거나 앱이 앱 대기 모드에 있는 동안 사용자에게 실시간 메시지를 제공해야 합니다.예, GCM을 사용할 수 있습니다.추가할 수 없습니다.우선 순위가 높은 GCM 메시지를 사용하여 앱을 활성화라고 네트워크에 액세스해야 합니다.
예, 하지만 우선 순위가 높은 GCM 메시지는 사용할 수 없습니다.
채팅 또는 통화 앱 (기업용 VOIP 앱)아니요, 기술적인 이유로 다른 메시징 서비스를 사용하고 있거나 잠자기 및 앱 대기 모드로 인해 앱의 핵심 기능이 중단되기 때문에 GCM을 사용할 수 없습니다.추가할 수 있습니다.
작업 자동화 앱앱의 핵심 기능은 채팅, 음성 통화, 새로운 사진 관리 또는 위치 작업과 같이 자동화된 작업을 예약하는 것입니다.해당되는 경우추가할 수 있습니다.
주변 기기 부속 앱앱의 핵심 기능은 주변 기기에 인터넷 액세스를 제공하기 위해 주변 기기와의 영구적 연결을 관리하는 것입니다.해당되는 경우추가할 수 있습니다.
앱은 주기적으로 동기화할 주변 기기 또는 무선 헤드폰과 같이 표준 블루투스 프로필을 통해 연결된 기기에만 연결해야 합니다.해당되는 경우추가할 수 없습니다.