본문 바로가기

School Study/Mobile System Programming

Energy-efficient Mobile Sensing System Design 2 (AlarmManager)

Duty Cycling with AlarmManager

  • Alarm Service 특징
    • 설정한 시각 혹은 일정 주기마다 필요한 Intent를 실행할 수 있게 해 준다.
    • 다른 필요한 연산을 수행할 수 있게 서비스를 시작하는 Broadcast Receiver와 함께 사용할 수 있다.
    • 애플리케이션이 실행 중이지 않을 때나 디바이스가 sleep 상태에 있을 때도 애플리케이션에서 어떤 액션을 수행할 수 있게 해 준다.
    • 애플리케이션의 자원 사용량을 최소화할 수 있도록 도와준다.
      • 그러나 Alarm을 잘못 사용하면 불필요한 자원 낭비 발생 가능
  • Alarm Service의 주된 사용 목적
    • 애플리케이션이 실행 중이지 않거나, 디바이스가 sleep 상태인 경우에도 미래 특정 시점에 어떤 작업을 수행해야 할 경우
    • 일반적인 애플리케이션 실행 시간 동안에 일어날 것이 확실한 timing 연산의 경우는 Handler 클래스를 Timer나 Thread와 함께 사용하여 처리하는 것이 좋다.
  • AlarmManger를 이용한 애플리케이션 동작
    •  

애플리케이션 동작 구조

  • Alarm 발생 설정
    • 시간 기준
      • 부팅 후 경과 시간(elapsed time) vs 실제 시간(RTC : real time clock)
      • AlarmManager.ELAPSED_REALTIME
        • 디바이스가 부팅된 이후 경과된 시간을 기준으로 함
        • Wakelock 아님
      • AlaramManager.RTC
        • 실제 시각을 기준으로 함
        • Wakelock 아님
    • Sleep 상태에서 수행 여부
      • 디바이스가 sleep 상태에 있으면 wake up을 하고 작업 수행
      • sleep 상태에서는 수행하지 않는다.
      • AlarmManager.ELAPSED_REALTIME_WAKEUP
        • ELAPSED_REALTIME과 동일하며 sleep 상태일 경우 디바이스를 활성 상태로 전환한 후 작업 수행
          (시스템 내부적으로 wakelock을 잡음)
      • AlarmManager.RTC_WAKEUP
        • RTC와 동일하며, sleep 상태일 경우 디바이스를 활성 상태로 전환한 후 작업 수행
    • 일회성 알람 vs 반복 알람
      • AlarmManager의 alarm 설정 메소드를 이용하여 지정
      • set() vs setRepaeting()
      • 자동으로 repeating 되는 것은 사라졌기 때문에 setExact를 반복 사용하는 방식으로 구현해야 한다.
        • setExact 함수로 일회성 알람을 예약하고,
          알람 발생 시 다시 setExact 함수를 이용하여 동일한 조건의 알람을 예약
    • 정확한 시각에 수행 vs 오차 허용
      • setExact() vs setInexactRepeating()
      • 정확한 시점에 알람을 주는 것이 아니라 OS가 자체적으로 시간을 조절하게 되면
        자원 사용에 미치는 영향을 줄일 수 있다.
      • 여러 개의 애플리케이션에서 알람 발생 요청이 있을 때, 그것들을 모아서 비슷한 시간대에 있는 알람은 그 타이밍에 일괄적으로 발생시킨다.
      •  

setExact() vs setInexactRepeating()

 

Wakelock을 사용하지 않고 sleep 상태에서도 주기적으로 WiFi Scan을 하도록 만들어보자.
AlarmManger를 이용해서 sleep 상태에서도 wifi scan을 했을 때 power 소모량을 비교해보자.

Power Monitor로 동작 확인을 해보면

AlarmManager 활용

 

Wakelock 활용

wakelock을 사용하면 50mW 정도 계속해서 사용하는 것을 확인할 수 있다.
크지 않다고 느낄 수 있지만 이게 계속 지속된다면 큰 차이로 나타날 수 있다.

 

Doze mode (잠자기 모드) - (Anrdoid 6.0 - API level 23)

Doze mode에 들어가면 AlarmManager가 제한이 된다.

  • Doze 모드 진입 조건
    • 충전 중이 아님
    • 스크린이 꺼져 있음
    • 디바이스가 일정 시간 동안 움직임이 없음
  • 디바이스가 사용되지 않는 동안 배터리 소모를 줄이기 위해 사용

Doze mode 동작

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

 

Doze 및 앱 대기 모드 최적화  |  Android Developers

Test and optimize your app for the power-saving features in Android 6.0.

developer.android.com

 

  • 표준 AlarmManager 알람은 다음 유지관리 기간으로 연기된다.
    • setExact() 및 setWindow() 포함
  • Doze 모드 중 알람이 실행되도록 설정해야 하는 경우
    • setAndAllowWhileIdle() → set()과 유사
    • setExactAndAllowWhileIdle() → setExact()과 유사
      • 최소 주기 시간 : 1분에 한번(비 Doze 모드), 15분(Doze 모드)
  • setAlarmClock()으로 설정된 알람은 정상적으로 실행됨
    • 알람이 실행되기 직전에 Doze 모드 종료됨