리얼라이져의 마케팅, 개발, 창업 블로그

안드로이드 DOZE 모드 관련 처리 공부내용 (6.0, 7.0기준) 본문

IT/안드로이드

안드로이드 DOZE 모드 관련 처리 공부내용 (6.0, 7.0기준)

nadadhl 2020. 2. 8. 22:55
728x90

 

'포트폴리오' 용으로  만든  알람앱이 하나 있다.

알람이 울리는 시간이 되면,  잠금화면 위에   알람이  울리는  구조다. 

 

처음에는  테스트를  위해,  2분 내지  3분 뒤  시간으로 맞춰서,  알람을  테스트했다

원하는대로  알람 기능이 잘 작동 되었다.

 

잘되어서  문제가 없는 줄 알고,   다음날   아침  7시에  맞춰두고,  잠을 잤다.

 

결과는  아침  10시에  일어났다.   

 

???

 

알람이 울리지 않았던 것이다........

 

테스트 할때는  잘작동하던,   알람이  왜  작동이 안되었을까???

 

이유를 찾아보니,   안드로이드  6.0  마쉬멜로우 버전 이상부터   Doze모드라는  정책이  추가되었다고 한다. 

마침  내 핸드폰이  마쉬멜로우  버전이어서   Doze모드  때문일것 이라고  예측했다.

 

 

아래는  그렇게  공부하게된  도즈 모드 관련 내용이다.

 

 

 

 

Doze 모드란???

기기가   충전기와 연결되어있지 않은 상태,  기기의 움직임이  없는 상태  그리고 스크린이 꺼진 상태에서  실행되는 

배터리  절약 정책이라고 한다. 

(이거는  6.0 버전(sdk 23) 일때  경우고,  nougat 7.0에서는 움직일때도  도즈모드가  실행된다고 한다)

 

 

 

 

Doze 모드에  빠지면??

다음과 같은  일들이 일어난다고 함.

 

1. 네트워크  엑세스가 중단됨.

2. Sync Adapter  실행 안됨.

3. Job scheduler 실행 안됨. 

4. Wakelock  무시됨.

5. Alarm manager  실행  안됨. -> mainatenance windows로 유예 

(mainatenance window는 아래 Doze 모드  실행  과정 설명 참고)

 

6. wifi  스캐인 안됨.  

7. GPS 작동안됨.

 

나의 경우에는  알람이 실행될때,  Alarmmanger와 Wakelock 기능도 같이  넣어놨는데,   Doze 모드에  빠지면 

저 두개다  실행이 안된다고 한다.......

 

 

 

 

 

아래는  기기가  Doze모드  실행  과정을 보여주는   이미지다.

6.0  버전의 경우  위와  같이  실행된다고 한다. 

 

우선  맨처음에 주황색 부분의  시간 ( 위에서 말한  도즈 모드 빠지는 상태 조건 진행 시간 )

이  지나면 초록색으로  Doze가 시작되는걸  볼수 있다.

참고로 Doze 모드가 시작되기전  시간의  길이는  기기별 제조사 정책에 따라  다르다고 한다. 

 

그리고 DOZE모드 진행시 도중에  주항색의 짧은 구간이 있는 걸  볼수 있는데

이건  maintenance window 구간이라고 한다. 

 

이 구간에서는  잠심  도즈모드가  풀리는데   이때  도즈모드로  유예되었던  Alarm manger의 경우  실행된다고 한다.

그리고  이 구간도  점점  실행되는  간격이  넓어지는걸  볼수있다.

DOZE모드에  오래 빠질수록  점점 maintenance window 의 실행 빈도가 점점  줄어진다고  볼수 있는듯 함.

 

결국  블랙홀로....   

나의 알람앱도  이렇게  블랙홀에  빠져서    울리지 않았던게  아닌가 싶다.  

 

 

 

 

다음은  조사중 알게된  nogat 버젼(7.0,  SDK 24)   DOZE모드 정책이다.

6.0과는  조금 다른 점이 있다.

 

바로  DOZE모드에  레벨이  존재한다 이다. 

 

 

위 사진은  7.0에서  적용된 DOZE 모드 진행 과정  이미지다.

보면  도즈 모드가  두가지로  나뉘는걸 볼수있다.

 

우선,  첫번째  DOZE모드이다.

6.0때는  화면 꺼지고,  배터리 전원 공급이 없는 상태로  가만히  기기가  놓여있다면,   DOZE모드에  들어갔지만, 

7.0부터는  위 조건에서  디바이스가  움직여도  진행된다.

 

핸드폰을 사용하지 않고,  들고 다니는 경우를  대비해서  추가된 정책인것 같다.

 

특이점은  이렇개  1단계 DOZE 모드 실행시, 

원래 6.0때 DOZE 정책으로 제한되었던  기능중에   몇가지만  제한된다는 점이다.

 

다음은  1단계 DOZE모드시  제한되는  기능이다.

 

1. 네트워크  엑세스가 중단됨.

2. Sync Adapter  실행 안됨.

3. Job scheduler 실행 안됨. 

 

그뒤,   기기가  움직이지 않게되면,  즉  6.0 때  doze모드  실행 조건과  같게되면

 

2단계 DOZE모드가 실행된다. 

이때는  6.0떄  제한된  사항들이 모두  제한된다. 

 

 

 

 

그렇다면,   Doze 모드를  풀기  위해선  어떻게  해야   할까??

DOZE모드를 막기위한 방법은  여러개가 있었다.

 

관련해서 참고할 블로그

 

 

나의 경우,  Doze 모드에 빠졌을때  Alarm manager를  작동시키는게   급선무 이므로,

이와 관련된  해결법을 알아보았다.

 

두가지 방법이 있었는데

 

하나는  alarm manger에서 

setAndAllowWhileIdle() 또는 setExactAndAllowWhileIdle() 사용하는법 

 

또하나는  setAlarmClock()를 사용하는 법이다. 

 

둘의 차이를  간략하게 설명하자면, 

setAndAllowWhileIdle() 또는 setExactAndAllowWhileIdle()경우는  해당 앱을  도즈에서  깨운다고 한다.

그리고  setExactAndAllowWhileIdle()는  좀더  정확한 시간을  지원한다고 한다. 

 

 setAlarmClock()같은 경우에는  기기 전체가  도즈에서  깨어난다고 한다. 

( setAlarmClock 사용시 상태창에 알람 표시가 뜬다 .)

이경우에는   배터리 사용량이 높아진다고 한다.

 

 

처음에 나는 알람앱만  깨우면 될줄 알고,  setExactAndAllowWhileIdle()를 사용했다. 

그런데  이부분이  문제였다.

 

setExactAndAllowWhileIdle()를 통해  앱을 도즈모드에서  빠져나오겐 했지만, wake lock를  실행하지는 못한것이다.

결국, setAlarmClock()를  사용하니  도즈모드에서도  잘작동하는걸  확인했다. 

 

 

 

 

 

DOZE 모드  테스트 하는 방법

 

부끄러운 이야기지만,  나는 도즈 모드 테스트를 위해  하루 단위로  알람을 맞춰놓고,  다음날까지  핸드폰을 

건들지 않고,  도즈모드에  빠트려   테스트를  진행한적이있다. (딱 한번 그랬다....)

 

혹시나  나처럼   원식적인  방법으로   DOZE 모드  테스트 하는  분들이 있을까   적는다.

 

안드로이드 스튜디오에서  테스트를 위해 adb를   도즈모드 상태로 만드는 기능을 제공한다. 

 

우선,

안드로이드  스튜디오에  들어가면,  TERMINAL 를    실행한다.

 

여기서 cd 명령어 를 이용하여 

\sdk\platform-tools로   위치를  바꿔준다.

( 정확한 위치는   사람마다 다르므로,  아무튼 해당 위치를 찾아서 들어가야함 )

 

그다음에  아래와 같이 명령어를  차례로  넣어준다.

$ adb shell dumpsys battery unplug   ->  해당 adb를  unplug 상태로 만들어준다. 

$ adb shell dumpsys deviceidle step    -> 해당  adb를  idle(도즈 모드) 상태로  만든다.

여기서 $ adb shell dumpsys deviceidle step  를 입력시 -> inactive가  뜰수가 있는데  

이때는  $ adb shell dumpsys deviceidle enable로   디바이스가 idle 상태가  가능하도록 말해준다.

 

그뒤에  다시 $ adb shell dumpsys deviceidle step를   써주길 바란다.

그러면  여러  return값이 나오는데,   idle이라는  값이  나올때까지  $ adb shell dumpsys deviceidle step를 반복 입력해준다.

 

idle 이  나오면,   이제 기기는  도즈 모드 상태로 들어간것이다.  

이 상태에서  이제  테스트를 하면된다. 

 

테스트가 끝나면,  

$ adb shell dumpsys battery reset  -> 배터리 다시  충전 형태로 ...

$ adb shell dumpsys deviceidle disable로  idle 상태  diable로  상태를 원상복귀 시켜주면 된다. 

 

 

여기까지가  내가  doze모드 관련해서  처리 한 내용이다. 

 

 

끝~

 

 

개발자가 되기 위해  공부 중인  비전공자  학생입니다. 
아직 부족하여,  부족하거나  틀린 내용이 있을수 있으니, 
그부분에 대해서  생각을  댓글로 공유해주시면 

감사하겠습니다.^^
Comments