Loading
2013. 12. 27. 08:07 - 알 수 없는 사용자

배터리를 잡아먹는 주 원인 WAKELOCK


안녕하세요, 칼다리스입니다. 지난번 큐타님이 올려주신 가용램에 대한 글에서 wakelock이 없는한 수면상태의 앱은 자원을 이용하지 않는다라 설명되어 있었습니다. 이번 글에선 그 wakelock이 정확히 무엇이며 배터리와 어떤 관계를 가지고 있나 알아보려 합니다.



Wakelock는 무엇인가?

안드로이드 스마트폰엔 두 가지 상태가 있습니다. Deep Sleep(수면)과 Awake(깨어남) 상태입니다. Sleep상태는 최소한의 자원을 이용하는 상태이며 Awake는 프로세서가 깨어 무슨 작업을 하고 있는 상태입니다. Wakelock은 디바이스를 Sleep상태에서 깨우거나 Sleep상태로 빠져드는 것을 막을 수 있는 기능입니다. Wakelock의 종류엔 Kernel Wakelock(KWL)과 Partial Wakelock(PWL)이 있지만 KWL은 하드웨어 레벨에서 일어나는 것이라 PWL에 집중을 하겠습니다.

PWL은 흔히 유저가 사용 중인 앱을 통해 일어나는 wakelock을 의미하며 일어나는 상황 역시 데이터 동기화, 영상 재생 중 화면 꺼짐 방지 등 다양합니다. 앱을 설치할 때 퍼미션을 살펴보면 시스템 도구 항목 아래 절전 모드로 진입하는 것을 방지한다 명시된 부분이 wakelock을 뜻합니다. 앱개발 시 WAKE_LOCK이란 퍼미션을 요청해야 하며 허락될 경우 필요한 때에 따라 Sleep상태로 들어가는 것을 방지할 수 있게 됩니다.



Wakelock과 배터리는 무슨 관계인가?

위 스크린샷에서 볼 수 있듯이 중간 부분 오랜 시간동안 화면이 꺼져 있음에도 불구하고 디바이스가 Awake 상태였던 시간이 종종 보입니다. 화면이 꺼져 있으며 유저가 디바이스를 사용하고 있지는 않지만 wakelock을 통해 프로세서가 활성화되어 필요한 작업을 하고 있다는 것을 의미하죠. 특정 앱에서 작업을 스케줄 해둘 경우 시간에 맞춰 작업을 진행하며 끝날 때까진 Awake 상태를 유지합니다. Sleep상태에선 최소한의 자원을 이용하지만 Awake 상태에선 필요한 자원을 이용해야 하며 이는 전력을 필요로 하겠죠, 즉 배터리를 더 소모한다는 것입니다.

물론 wakelock이 무조건 나쁘다는 것은 아닙니다. 영상을 즐기는 중에 화면이 꺼져버리는 것처럼 불편한 일도 없겠죠? Wakelock은 스마트폰엔 없어서는 안될 중요한 기능입니다. 하지만 문제는 바로 제멋대로 wakelock이 이루어지는 경우이죠. 몇몇 앱들은 유저가 사용하지 않음에도 불구하고 wakelock을 이용해 디바이스를 깨워 쓸데없이 자원을 긁어먹도록 하는 경우가 있습니다. 전 실제로 90%로 잠을 잤다 일어나니 폰이 꺼져있는 황당한 일도 있었습니다.



Wakelock은 어떻게 찾나? Wakelock Detector로!

디바이스 설정으로 들어가 배터리 메뉴를 찾아보면 현재 배터리 그래프와 아래에 어떤 앱이 배터리를 얼마나 소모했는지 볼 수 있습니다. 하지만 이것만으론 어떤 앱의 wakelock이 문제를 일으켰나 알기엔 부족한 경우가 태반입니다. 그래서 자주 애용되는 앱이 바로 wakelock 분석앱이죠. 여러가지가 있지만 제가 사용하는 앱으로 소개드리겠습니다. 주의: 안드로이드 4.4 킷켓부터 퍼미션에 변화가 생겨 wakelock 분석앱을 이용하려면 루트권한이 필요합니다


Wakelock Detector

플레이 스토어에서 무료로 다운로드가 가능한 이 앱은 기본적으로 PWL을 앱별로 분석하여 그 지속기간과 횟수를 알려줍니다. 고급모드를 이용하면 KWL분석도 가능합니다. 그리니파이와 연동도 가능해 wakelock을 잡는데는 최적화되어 있습니다. 그리니파이에 대해선 다음 글에서 알아보도록 하겠습니다.



Wakelock 잡기

Wakelock을 찾았다면 해결을 해야겠죠? Wakelock에 따라 잡는 방법이 다르기에 전부 설명드리긴 어렵고 가장 흔하게 발견되는 녀셕들만 정리해 드립니다:

  • AudioOut: 1과 2가 있으며 스피커를 이용하는 모든 앱이 일으키는 wakelock입니다. 비정상적인 wakelock을 고치기 위해선 앱의 설정메뉴로 가서 사운드와 관련된 모든 옵션을 비활성화하는 것입니다.
  • AlarmManager: 가장 흔한 wakelock이지만 굳이 잡아야 할 정도로 배터리에 악영향을 미치지는 않습니다. 좀 특별한 케이스의 wakelock이니 그냥 두시기 바랍니다.
  • MediaScannerService: 미디어를 스캔하며 발생하는 wakelock으로 방금 부팅을 했거나 미디어 파일을 추가했을 때 나타납니다. 제거하는 방법으로는 실행 중인 프로세스 중 미디어를 죽이거나 루트권한이 있다면 Rescan Media Root이란 앱을 사용할 수 있습니다.
  • NetworkLocationLocator: 이 wakelock과 NlpCollectorWakeLock는 특히 배터리 소모가 심한 wakelock으로 위치 서비스와 관련된 모든 기능을 해제하시면 사라집니다.
  • SyncLoop WakeLock: 동기화를 위한 wakelock으로 동기화 기능을 비활성화 하시면 사라집니다.



이렇게 wakelock에 대해 알아보고 필요할 경우 wakelock을 잡는 방법을 알아보았습니다. 주의할 점은 이 모든 것이 대기모드에서 배터리 효율을 늘리기 위한 작업이란 점입니다. 화면켜짐 상태에서 영상을 보거나 게임 등을 할 경우 닳는 배터리는 어떻게 할 수 있는 방법이 없습니다.