Developing Myself Everyday
article thumbnail
Published 2023. 11. 8. 17:06
안드로이드의 Doze와 App Standby Android

 

사진: UnsplashGregory Pappas

 

 

 

안드로이드는 DozeApp Standby 이 2가지의 절전 기능을 통해, 장치가 전원과 연결되어 있지 않게 하는 방법을 제공하고 있습니다.

 

  • Doze는 백그라운드 CPU 및 네트워크 활동을 지연시켜 배터리 소모를 줄입니다. 
  • App Standby는 최근에 사용하지 않은 앱의 백그라운드 네트워크 활동을 지연시킵니다.

 

안드로이드의 앱을 개발하다 보면, 이 2가지의 모드에서 동작해야 하거나, 동작할 필요가 없을 때에 동작하지 않게 하는 등의 설계를 해야할 때가 있습니다. 그래서 이 2가지의 절전 기능을 알아보고 공부해보고자 합니다.


 

 

 

Doze 모드


핸드폰을 사용하지 않아서 가만히 냅두거나, 전원 버튼을 누르면 핸드폰은 Doze 모드가 됩니다.

 

 

Doze 모드에서는 네트워크 및 CPU를 많이 사용하는 서비스에 대한 접근을 지연시켜 배터리를 절약합니다.

 

 

다만, 이것은 잠시 지연시키는 것이기 때문에 Doze 모드가 지나치게 오래 지속된다면 많은 작업이 쌓이게 됩니다. 그래서 안드로이드에서는 Doze 모드 중에 주기적으로 잠깐 동안 모드를 해제해서 유지 보수 기간을 가져 이런 지연 작업들을 소화시킵니다.

 

아래의 그림은 앱이 Doze 모드에 들어간 이 후, 주기적으로 모드를 해제해 지연 작업을 처리하는 것을 보여줍니다.

 

Doze 모드가 오래 지속되면, 지속될 수록 유지 보수 기간의 주기는 길어집니다.

 

 

Doze 모드 제한사항

앱이 잠자기 모드 상태에 있는 동안 다음과 같은 제한사항이 적용됩니다.

  • 네트워크 액세스가 정지됩니다.
  • 시스템에서 wake lock을 무시합니다.
  • 표준 AlarmManager 알람(setExact()  setWindow()포함)이 다음 유지보수 기간으로 연기됩니다.
    • 잠자기 모드에서 실행되는 알람을 설정해야 한다면 setAndAllowWhileIdle() 또는 setExactAndAllowWhileIdle()을 사용합니다.
    • setAlarmClock()으로 설정된 알람은 계속 정상적으로 실행됩니다. 시스템에서 이 알람이 실행되기 직전에 잠자기 모드를 종료합니다.
  • 시스템에서 Wi-Fi 검색을 실행하지 않습니다.
  • 시스템에서 동기화 어댑터 실행을 허용하지 않습니다.
  • 시스템에서 JobScheduler 실행을 허용하지 않습니다.

wake lock: 애플리케이션이 디바이스에게 켜져있어야 한다고 말하는 매커니즘

 

 

 

Doze 모드에 맞게 앱 조정

일반적인 경우에서는 대부분의 앱은 Doze 모드에서 정상적으로 작동합니다. 하지만 앱에서 네트워크, 알람 등을 처리해야 하는 경우에는 Doze 모드 중간의 유지 보수 기간에 효율적으로 작동하도록 해야 합니다.

 

만약 Doze 모드 중간에 실시간 메시지를 사용해 네트워크에 엑세스 해야 한다면, 가능하면 FCM(Firebase 클라우드 메시징)을 사용하는 것이 권장됩니다.

 

 

 

 

App Standby 모드


App Standby 모드는 사용자가 앱을 사용하지 않으면 시스템에서 앱이 IDLE 상태라고 판단합니다.

 

시스템은 아래와 같은 경우에 해당하지 않는다면, IDLE 상태라고 판단합니다.

  • 사용자가 앱을 실행합니다.
  • 앱의 프로세스가 현재 포그라운드에 있습니다.
  • 앱에서 잠금 화면이나 알림 목록을 통해 사용자에게 표시하는 알림을 생성합니다.
  • 앱이 활성 기기 관리자 앱(예: 기기 정책 컨트롤러)입니다. 이러한 앱은 일반적으로 백그라운드에서 실행되지만 기기 관리 앱은 언제든 서버에서 정책을 수신할 수 있게 유지되어야 하므로 앱 대기 모드를 시작하지 않습니다.

 

사용자가 기기를 전원에 연결하면 App Standby 모드에서 해제되고 기기가 오래동안 IDLE 상태인 경우에는 IDLE 상태인 앱이 하루에 한 번 정도 네트워크에 액세스하도록 허용합니다.

 

 

 

 

IDLE 상태일 때의 상호작용


FCM(Firebase 클라우드 메시징)은 클라우드에서 기기로 푸시하는 서비스로, 이 서비스를 이용하면 Android 기기에서 백엔드 서비스와 앱 간에 실시간 다운스트림 메시징을 지원할 수 있습니다.

 

FCM은 클라우드와의 영구적 단일 연결을 제공하므로 실시간 메시징이 필요한 모든 앱에서 이 연결을 공유할 수 있습니다. 연결을 공유하면 여러 앱이 고유한 별도의 영구적 연결을 유지보수하느라 배터리를 빠르게 소모할 일이 없어 배터리 소모를 최적화할 수 있습니다.

 

이러한 이유로 앱에서 백엔드 서비스와 메시징을 통합해야 한다면 고유한 영구적 네트워크 연결을 유지관리하지 말고 가능한 한 FCM을 사용할 것을 권장합니다.

 

FCM은 높은 우선순위 FCM 메시지를 통해 Doze 모드 및 App Standby 모드 사용에 맞게 최적화됩니다. FCM 높은 우선순위 메시지를 사용하면 사용자 기기가 Doze 모드 및 App Standby 모드인 경우에도 안정적으로 앱의 절전 모드를 해제하여 네트워크에 액세스할 수 있습니다.

 

Doze 모드 및 App Standby 모드에서는 시스템이 메시지를 제공하여 앱이 네트워크 서비스 및 부분적 wakelock에 일시적으로 액세스할 수 있도록 한 후 기기 또는 앱을 유휴 상태로 되돌립니다.

 

높은 우선순위의 FCM 메시지는 Doze 모드에 달리 영향을 주지 않으며 다른 앱의 상태에도 영향을 주지 않습니다. 즉, 앱은 높은 우선순위의 FCM 메시지를 사용하여 효율적으로 통신하는 동시에 시스템 및 기기 전반에서 배터리에 미치는 영향을 최소화할 수 있습니다.

 

일반적인 권장사항으로, 앱에 다운스트림 메시징이 필요하다면 FCM을 사용해야 합니다. 서버 및 클라이언트에서 이미 FCM을 사용하고 있다면 서비스에서 중요한 메시지에 높은 우선순위 메시지를 사용해야 합니다. 이렇게 하면 기기가 Doze 모드일 때에도 안정적으로 앱의 절전 모드를 해제할 수 있습니다.

 

 

 

 

 

Reference

 

잠자기 및 앱 대기 모드에 맞게 최적화  |  App quality  |  Android Developers

앱에서 Android 6.0의 절전 기능을 테스트하고 최적화합니다.

developer.android.com

 

profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!