안드로이드

[안드로이드] Doze(잠자기) 모드 분석

IT꿈나무 2017. 4. 21. 10:02
반응형


 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분마다 최대 한 번 실행되도록 함.
6.0이하 api에 적용 되지 않음.
GCM(Google Clude Messaging)를 이요하여 깨움.
  • 허용 목록에 앱을 추가 한다.
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 메니페스트에 유즈퍼미션에 등록한다.
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS  인텐트를 실행하여 대화상자를 트리거 한다.
  • 필요한 경우, 사용자는 허용 목록에서 수동으로 앱을 제거 할수 있다

 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에서 변경 사항
 https://developer.android.com/about/versions/nougat/android-7.0-changes.html?hl=ko



반응형