일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- toastmessage
- git 저장소
- nextInt()
- 이클립스 코틀린
- E212: Can't open file for writing
- Android
- basic toast
- BuildConfig
- aws 느림
- gitemoji
- AWS
- 안드로이드 스튜디오 에러
- 안드로이드
- git commit 해쉬
- git 안드로이드 스튜디오 연동
- ppk to pem
- access modifier
- aws 리전 변경
- was server
- doze mode
- utf8 인코딩
- git
- kotlin plugin
- 코틀린 플러그인
- 자바
- nginx 한글 깨짐
- error while loading state for instance 0x0 of device 'goldfish_pipe
- 에뮬레이터 에러
- 도즈모드
- 탄력적 ip
- Today
- Total
리얼라이져의 마케팅, 개발, 창업 블로그
안드로이드 DOZE 모드 관련 처리 공부내용 (6.0, 7.0기준) 본문
'포트폴리오' 용으로 만든 알람앱이 하나 있다.
알람이 울리는 시간이 되면, 잠금화면 위에 알람이 울리는 구조다.
처음에는 테스트를 위해, 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모드 관련해서 처리 한 내용이다.
끝~
개발자가 되기 위해 공부 중인 비전공자 학생입니다.
아직 부족하여, 부족하거나 틀린 내용이 있을수 있으니,
그부분에 대해서 생각을 댓글로 공유해주시면
감사하겠습니다.^^
'IT > 안드로이드' 카테고리의 다른 글
drwable과 mipmap 차이 (0) | 2023.09.01 |
---|---|
안드로이드 스튜디오 - 클래스 생성시 자동 주석 처리 기능 (0) | 2020.09.09 |
Firebase에 안드로이드 프로젝트 등록하기 (0) | 2020.07.28 |
안드로이드 스튜디오 Git 연동 및 Git-Hub 원격 push (0) | 2020.05.15 |
안드로이드 토스트 메세지 띄우기 (0) | 2019.03.27 |