[Android] Doze Functionality

2016. 12. 10. 14:53Mobile/Xamarin

이 내용은 https://blog.xamarin.com/understanding-androids-doze-functionality/을 바탕으로 작성되었습니다. 모든 저작권은 원저자에게 있으며 요청이 있을 경우 언제든지 게시가 중단될 수 있습니다. 본 문서에는 오역이 포함되어 있을 수 있으며 번역된 내용에 대해서는 어떠한 일체의 보장을 하지 않습니다.

안드로이드 개발자는 백그라운드 서비스, 알람 스케줄링, 동기화 등을 활용하여 복잡한 안드로이드 앱을 개발할 수 잇습니다. 사용자는 다양한 앱을 다운로드하고 사용하기 때문에, 이러한 앱들이 사용자의 배터리를 고갈시키거나 시스템을 느려지게 해서는 안됩니다. 이러한 이유로 Android Marshmallow부터 Doze Functionality(동면기능)을 제공하고 있으며 Android Nougat부터 이 기능을 확장하였습니다.

Doze 동작시점

이름이 의미하는 것처럼 Doze(=동면)는 스마트폰이 충전중이지 않고 사용자가 스마트폰을 사용하지 않을 때 활성화 됩니다. 이전에는 일정한 시간동안 화면이 꺼진 상태로 스마트폰이 동작하지 않을 때만 Doze가 동작했지만, Android 7.0부터는 정지상태가 아니더라도 몇가지 단계를 가지며 Doze를 활성화 합니다.

Doze Level 1

Android 7.0에서는 화면이 꺼져있고 충전 중이 아닌 상태라면 언제든지 Doze를 진행하게 됩니다. 일정한 시간이 지나면 앱은 네트워크 접속을 중단할 것이고, 모든 싱크가 완료될 것이며 백그라운드 작업은 Maintenance Window로 유예될 것입니다. 사용자가 스마트폰 충전을 시작하거나 화면을 켜는 순간 작업은 정상적으로 재개될 것입니다. 아래는 Android 7.0에서 Dzoe Level 1을 나타내고 있습니다.

doze-diagram-1

Doze Level 2

만약 장치가 정지된 상태이거나 이미 Level 1 Doze 상태에서 정지된 상태로 돌입되면 Doze Level 2 시작될 것입니다. Level 2는 Android Marshmallow부터 표준 Doze 모드이며, 모든 Wakelock를 무시하고 모든 알람, 동기화, 작업을 유예할 것이며 네트워크 접속, GPS, Wi-Fi 스캔을 제한하게 됩니다.

doze-diagram-2

모든 Doze Level에서 시스템은 일정한 간격으로 깨어나서 앱의 작업을 수행하게 됩니다. 만약 Doze에서 제한되는 자원이나 API를 사용한다면 Doze모드에서 해당 작업수행이 지연될 수 있음을 고려하여 앱을 개발해야 합니다. 또한 앱 개발 시 Doze 모드에서 테스트를 수행해야 합니다. 예외적으로 High Priority로 표시된 Push Notification, Google Cloud Messaging은 Doze모드에서도 지연없이 사용자에게 전달되게 됩니다.

Doze 테스트하기

Android 6.0(API Level 23 이상의 애뮬레이터나 장치에서 테스트 할 때 언제든지 Doze 모드로 테스트를 진행할 수 있습니다. 앱을 실행한 후 활성화된 상태에서 화면을 끄시면 됩니다. (반드시 앱이 실행된 후 활성화된 상태에서 화면을 끄세요). Doze가 실행되기까지 기다리실 필요가 없습니다. 강제적으로 Doze 모드를 실행할 수 있는데, ADB 명령 프롬프트에서 다음 두 명령을 실행해주세요.

$ adb shell dumpsys battery unplug
$ adb shell dumpsys deviceidle step

두번째 명령어는 여러번 실행할 수 있으며, 이를 통해 앱이 각 Doze 모드에 진입하거나 해제될 때 제대로 응답하는지 테스트할 수 있습니다.

중요 알람

많은 앱들이 달력 알림과 같은 이벤트를 스케줄링하기 위해서 AlarmManager를 사용할 수 있습니다. API 23에서는 알람관리를 도와주는 새로운 메서드 2개가 AlarmManager에 추가되었습니다. 바로 SetAndAllowWhileIdleSetExactAndAllowWhileIdle입니다. 두 메서드는 유사하지만, SetExact는 알람을 요청한 시간에 정확하게 수행되게 됩니다. 이 메서드들은 앱마다 9분에 한번씩 실행되도록 제한되기 때문에 제한적으로 사용해야 합니다.

Job Scheduler 사용하기

Android 5.0에 소개된 Job Scheduler API는 이제 Google Play Service에서 GcmNetworkManager로 이용할 수 있습니다. 이를 통해 개발자는 백그라운드 작업을 스케줄링 할 수 있으며, 안드로이드는 배터리를 최대한 절약하며 효율적으로 예약된 백그라운드 작업들을 주기적으로 일괄 수행할 수 있습니다. Job Scheduler에 대한 좀더 상세한 자료는 다음에서 확인할 수 있습니다.

좀더 자세히 알아보기

구글은 Doze에서 앱을 어떻게 최적화할 수 있는지에 대한 상당한 자료와 팁을 제공합니다. 또한 Doze 업데이트를 포함하여 Android N에 대한 새로운 변경사항들을 모두 꼼꼼히 확인하는 것을 잊지마세요.

원문: https://blog.xamarin.com/understanding-androids-doze-functionality/