29

For some reason my Android phone won't go to sleep. I assume that a wakelock is keeping it awake, but there is no way to tell which wakelocks are active. The running services doesn't list anything suspicious, and certainly nothing different from usual. So my questions are:

  1. Does Android definitely release wakelocks when a process ends? Is it possible an app was badly written and didn't release a wakelock before exiting?

  2. Is there any way to see the active wakelocks?

This is what dumpsys power shows:

$ dumpsys power
Power Manager State:
  mIsPowered=true mPowerState=0 mScreenOffTime=226093 ms
  mPartialCount=0
  mWakeLockState=
  mUserState=
  mPowerState=
  mLocks.gather=
  mNextTimeout=91922738 now=92136117 -213s from now
  mDimScreen=true mStayOnConditions=0
  mScreenOffReason=3 mUserState=0
  mBroadcastQueue={-1,-1,-1}
  mBroadcastWhy={0,0,0}
  mPokey=1 mPokeAwakeonSet=false
  mKeyboardVisible=false mUserActivityAllowed=false
  mKeylightDelay=6000 mDimDelay=47000 mScreenOffDelay=7000
  mPreventScreenOn=false  mScreenBrightnessOverride=-1  mButtonBrightnessOverride=-1
  mScreenOffTimeoutSetting=60000 mMaximumScreenOffTimeout=2147483647
  mLastScreenOnTime=0
  mBroadcastWakeLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
  mStayOnWhilePluggedInScreenDimLock=UnsynchronizedWakeLock(mFlags=0x6 mCount=0 mHeld=false)
  mStayOnWhilePluggedInPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
  mPreventScreenOnPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
  mProximityPartialLock=UnsynchronizedWakeLock(mFlags=0x1 mCount=0 mHeld=false)
  mProximityWakeLockCount=0
  mProximitySensorEnabled=false
  mProximitySensorActive=false
  mProximityPendingValue=-1
  mLastProximityEventTime=0
  mLightSensorEnabled=false
  mLightSensorValue=-1.0 mLightSensorPendingValue=-1.0
  mLightSensorScreenBrightness=35 mLightSensorButtonBrightness=255 mLightSensorKeyboardBrightness=0
  mUseSoftwareAutoBrightness=true
  mAutoBrightessEnabled=false
  mScreenBrightness: animating=false targetValue=-1 curValue=0.0 delta=-1.3333334

mLocks.size=0:

mPokeLocks.size=1:
    poke lock 'PhoneApp': POKE_LOCK_IGNORE_CHEEK_EVENTS
tshepang
  • 12,111
  • 21
  • 91
  • 136
Timmmm
  • 88,195
  • 71
  • 364
  • 509

8 Answers8

28

In new versions of Android you can see list of wakelocks here:

adb shell "cat /sys/kernel/debug/wakeup_sources"
obezyan
  • 434
  • 4
  • 8
22

You can use below adb command to require a wake lock

  adb shell "echo mylock > /sys/power/wake_lock"

Then, you can use below command to watch if this lock is active. You will see the time column continuously change, it means the wake lock is active

  watch -n 1 'adb shell "cat /proc/wakelocks" | grep mylock'

Now, use this adb command to release the wake lock

  adb shell "echo mylock > /sys/power/wake_unlock"

Then, check it again, the time column will freeze, it means the wake lock is non active

  watch -n 1 'adb shell "cat /proc/wakelocks" | grep mylock'

You can use the same technique to observe the wake lock you acquire in the code.

pevik
  • 4,523
  • 3
  • 33
  • 44
Browny Lin
  • 2,427
  • 3
  • 28
  • 32
  • 5
    You need root access for this. – newbyca Sep 09 '13 at 19:21
  • 3
    In recent versions of Android (not sure which version it starts), wakelocks list are available in /sys/kernel/debug/wakeup_sources and /sys/kernel/debug/wakeup_sources_active – 3c71 Sep 09 '15 at 05:58
16

Does Android definitely release wakelocks when a process ends?

I doubt it, though I do not know for certain.

Is it possible an app was badly written and didn't release a wakelock before exiting?

AFAIK, yes.

Is there any way to see the active wakelocks?

Run adb shell dumpsys power.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491
  • Hmmm, `dumpsys power` isn't very illuminating, there seem to be no active wakelocks yet the phone still won't sleep. Very annoying: – Timmmm Apr 26 '11 at 21:59
7

As others have already said, adb shell dumpsys power can show you active wakelocks.

However, for apps that didn't release wakelock, as per the answer here: https://stackoverflow.com/a/16258624/428271 It should be released by Android. However, it is for case where app/process is killed, but it should be applicable when app/process is complete too. It also provides the source code references rather than just saying 'checked in code'

Community
  • 1
  • 1
Kiran Parmar
  • 788
  • 9
  • 26
6

For what it's worth, on Android 7.1.1 this is exactly what I was looking for:

greatqlte:/ $ dumpsys power | grep WAKE_LOCK
  PARTIAL_WAKE_LOCK              'ES Wake Lock' ACQ=-38m52s804ms LONG (uid=10275 pid=12504)                                                                                                 
  PARTIAL_WAKE_LOCK              '*net_scheduler*' ACQ=-40ms (uid=10031 pid=3026 ws=Work Source{10031 com.google.android.gms})                                                               
user1261470
  • 141
  • 3
  • 6
4

To see active wake-locks run :

adb shell dumpsys power|grep -i wake

crissyg
  • 93
  • 3
3

You can check "Wakelock Detector" app which is available in Google Play

It has a simple UI which shows detail list of acquired wakelocks per each application and as you mentioned, it shows active running apps on the top, which might have wakelock present at the moment.

Wakelock detector

UzumApps
  • 31
  • 5
-1

Android does not release wakelocks when the process ends. It should be explicitly released by the process before ending.

Eastern Monk
  • 6,395
  • 8
  • 46
  • 61