Doze(잠자기) 모드 분석 |
|
Doze의 뜻은? "1.깜빡 잠이 들다, 졸다 2.(보통 낮에) 잠깐 잠, 낮잠" 을 갖고 있다.
Android 에서 Doze(잠자기) 모드는 오랫동안 단말기가 사용중이 아닐경우 단말기의 배터리를 절약 하기 위한 모드, Doze 모드로 전환 되게 된다.
Doze 모드 란 |
Doze 모드로 전환되게 되면 '네트워크'와 '백그라운드' 작업을 지연? 시킴으로써 단말기의 배터리를 절약 할수 있게 되는 것이다.
Android 6.0 M 마시멜로우에서 적용되었다.
Doze 모드는 아래의 조건이 모두 충족할때 발생한다.
1. 배터리가 충전 중이 아닐때,
2. 휴대폰이 물리적으로 이동 중이 아닐때(자이로센서)
3. 스크린 오프 상태로 오랫동안 방치 되었을 경우
(7.0 에서 스크린 온오프 이벤트 발생시 도즈모드 해제됨)
▶ | 잠자기 모드 제한 사항 |
- 네트워크 액세스가 정지됨.
- 시스템 Wake locks를 무시함
- 표준 AlarmManager(setExact() 및 setWindow())은 연기됨.
setAndAllowWhileIdle() 또는 setExactAndAllowWhileIdle() 을 사용 하여 방어(9분마다 최대 1회 실행됨)
setAlarmClock()으로 설정된 알람은 정상적으로 실행됨.
- 시스템은 Wi-Fi 스캔을 수행하지 않음.
- 동기화 어탭터 실행을 허용하지 않음 (AbstractThreadedSyncAdapter)
- 시스템 JobScheduler 실행을 허용하지 않음.
▶ | Doze 모드 방어 |
- AlarmManager 메서드
- setAndAllowWhileIdle() 및 setExactAndAllowWhileIdle()을 도입 하여 9분마다 최대 한 번 실행되도록 함.
- 허용 목록에 앱을 추가 한다.
- 필요한 경우, 사용자는 허용 목록에서 수동으로 앱을 제거 할수 있다
Doze 모드 Test 하기. |
ADB 로 연결하여 단말기를 Doze로 활성화 할 수 있다.
▶ | Device 연결 확인. |
$ adb.exe devices |
▶ | Doze 모드 활성화 |
2번째 명령을 2회 이상 실행하여야 Doze 모드로 진입하기도 한다,
IDLE -> IDLE-PENDING로 진입 하면 Doze 이다.
$ adb shell dumpsys battery unplug $ adb shell dumpsys deviceidle step |
C:\Program Files\Android\android-sdk\platform-tools>adb shell dumpsys deviceidle step Stepped to: SENSING C:\Program Files\Android\android-sdk\platform-tools>adb shell dumpsys deviceidle step Stepped to: IDLE C:\Program Files\Android\android-sdk\platform-tools>adb shell dumpsys deviceidle step Stepped to: IDLE_MAINTENANCE |
▶ | Doze 모드 설정 및 확인하기. |
$ adb shell dumpsys deviceidle |
C:\Program Files\Android\android-sdk\platform-tools>adb shell dumpsys deviceidle Settings: inactive_to=+30m0s0ms sensing_to=+4m0s0ms locating_to=+30s0ms location_accuracy=20.0m motion_inactive_to=+10m0s0ms idle_after_inactive_to=+30m0s0ms idle_pending_to=+5m0s0ms max_idle_pending_to=+10m0s0ms idle_pending_factor=2.0 idle_to=+60m0s0ms max_idle_to=+6h0m0s0ms idle_factor=2.0 min_time_to_alarm=+60m0s0ms max_temp_app_whitelist_duration=+5m0s0ms mms_temp_app_whitelist_duration=+60s0ms sms_temp_app_whitelist_duration=+20s0ms Whitelist (except idle) system apps: com.skt.prod.phone com.android.providers.downloads com.sec.android.daemonapp com.android.vending com.skt.prod.dialer com.skt.skaf.Z00000TAPI com.skt.skaf.Z0000TSEED com.google.android.gms com.sec.spp.push Com.sktelecom.minit com.skt.skaf.OA00018282 com.skt.skaf.OA00199800 com.skt.skaf.A000Z00040 Whitelist system apps: com.skt.prod.phone com.skt.prod.dialer com.skt.skaf.Z00000TAPI com.skt.skaf.Z0000TSEED com.google.android.gms com.sec.spp.push Com.sktelecom.minit com.skt.skaf.OA00018282 com.skt.skaf.OA00199800 com.skt.skaf.A000Z00040 Whitelist (except idle) all app ids: 10000 10013 10025 10031 10037 10051 10052 10057 10063 10075 10085 10159 10165 Whitelist all app ids: 10000 10013 10031 10051 10052 10057 10063 10075 10085 10165 mEnabled=true m3rdWhitelistEnable=false mForceIdle=false mSigMotionSensor={Sensor name="SAMSUNG Significant Motion Sensor", vendor="Sam sung Inc.", version=2, type=17, maxRange=1.0, resolution=1.0, power=0.3, minDela y=0} mCurDisplay=Display id 0: DisplayInfo{"湲곕낯?쇰줈 ?쒓났?섎뒗 ?붾㈃", uniqueId "local:0", app 1440 x 2560, real 1440 x 2560, largest app 2560 x 2464, smallest app 1440 x 1344, mode 1, defaultMode 1, modes [{id=1, width=1440, height=2560, fps=59.0}], colorTransformId 1, defaultColorTransformId 1, supportedColorTransfo rms [{id=1, colorTransform=-22}], rotation 0, density 640 (580.571 x 580.571) dp i, layerStack 0, appVsyncOff 0, presDeadline 17949152, type BUILT_IN, state OFF, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS}, DisplayMetrics{density=4.0, widt h=1440, height=2560, scaledDensity=4.0, xdpi=580.571, ydpi=580.571}, isValid=tru e mScreenOn=false mCharging=false mSigMotionActive=true mSensing=false mNotMoving=false mLocating=false mHaveGps=false mLocated=false mState=IDLE_PENDING mInactiveTimeout=+30m0s0ms mNextAlarmTime=+29m20s765ms mNextIdlePendingDelay=+5m0s0ms mNextIdleDelay=+60m0s0ms |
▶ | 앱을 대기 모드에서 앱 테스트 |
1. 앱을 실행시킨 다음 활성 상태로 그냥 둡니다.
2. 다음 명령어를 실행하여 앱에서 강제로 앱 대기 모드를 시작한다
$ adb shell dumpsys battery unplug
$ adb shell am set-inactive <packageName> true
3. 다음 명령어를 사용하여 앱이 활성화되는 것을 시뮬레이션 합니다.
$ adb shell am set-inactive <packageName> false
$ adb shell am get-inactive <packageName>
확인하지 않았음. |
참고 |
안드로이드 가이드
https://developer.android.com/training/monitoring-device-state/doze-standby.html#using_gcm
7.0에서 변경 사항'안드로이드' 카테고리의 다른 글
[안드로이드] 네비게이션 바 숨김 효과 만들기 (0) | 2021.04.07 |
---|---|
[안드로이드] 종료 작업관리자 에서도 안보이게 (0) | 2017.06.05 |
[안드로이드] 카메라 이벤트 받기 동적, 정적 BroadCastReceiver 받기 (0) | 2017.04.24 |
[안드로이드] Broadcast 를 이용한 앱간 통신 (0) | 2017.04.19 |
안드로이드 다른 어플리케이션 종료 시키기 (2) | 2014.10.08 |