28

出于某种原因,我的 Android 手机无法进入睡眠状态。我假设一个唤醒锁让它保持清醒,但没有办法知道哪些唤醒锁是活动的。正在运行的服务没有列出任何可疑的东西,当然也与平常没有什么不同。所以我的问题是:

  1. 当进程结束时,Android 是否肯定会释放唤醒锁?是否有可能一个应用程序写得不好并且在退出之前没有释放唤醒锁?

  2. 有没有办法查看活动的唤醒锁?

dumpsys power表明:

$ 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
4

8 回答 8

27

在新版本的 Android 中,您可以在此处查看唤醒锁列表:

adb shell "cat /sys/kernel/debug/wakeup_sources"
于 2014-09-23T10:23:37.607 回答
22

您可以使用下面的 adb 命令来要求唤醒锁

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

然后,您可以使用以下命令查看此锁是否处于活动状态。您会看到时间栏不断变化,这意味着唤醒锁处于活动状态

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

现在,使用这个 adb 命令来释放唤醒锁

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

然后,再次查看,时间列会冻结,表示唤醒锁未激活

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

您可以使用相同的技术来观察您在代码中获得的唤醒锁。

于 2012-06-08T08:59:15.400 回答
16

当进程结束时,Android 是否肯定会释放唤醒锁?

我对此表示怀疑,尽管我不确定。

是否有可能一个应用程序写得不好并且在退出之前没有释放唤醒锁?

AFAIK,是的。

有没有办法查看活动的唤醒锁?

运行adb shell dumpsys power

于 2011-04-25T17:04:21.587 回答
7

正如其他人已经说过的, adb shell dumpsys power 可以向您显示活动的唤醒锁。

但是,对于没有释放唤醒锁的应用程序,按照这里的答案: https ://stackoverflow.com/a/16258624/428271 它应该由 Android 发布。但是,它适用于应用程序/进程被杀死的情况,但它也应该在应用程序/进程完成时适用。它还提供源代码参考,而不仅仅是说“签入代码”

于 2014-01-22T08:18:25.027 回答
4

对于它的价值,在 Android 7.1.1 上,这正是我想要的:

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})                                                               
于 2019-01-07T18:13:39.197 回答
3

您可以查看Google Play 中提供的“ Wakelock Detector ”应用程序

它有一个简单的 UI,显示每个应用程序获取的唤醒锁的详细列表,正如您所提到的,它在顶部显示活动的正在运行的应用程序,这些应用程序目前可能存在唤醒锁

唤醒锁检测器

于 2013-03-04T04:47:00.330 回答
3

要查看活动唤醒锁运行:

adb shell dumpsys power|grep -i wake

于 2018-04-12T19:42:12.520 回答
-1

进程结束时,Android 不会释放唤醒锁。它应该在结束之前由进程显式释放。

于 2012-02-12T14:15:56.727 回答