如何查看哪些唤醒锁处于活动状态

| 由于某种原因,我的Android手机无法进入睡眠状态。我假设唤醒锁使它保持唤醒状态,但是无法确定哪个唤醒锁处于活动状态。正在运行的服务不会列出任何可疑的内容,并且肯定与平常没有什么不同。所以我的问题是: 进程结束时,Android是否肯定会释放唤醒锁?是否有可能某个应用的编写错误并且在退出前没有释放唤醒锁? 有什么办法可以看到活动的唤醒锁吗? 这是ѭ0显示的内容:
$ 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
    
已邀请:
在新版本的Android中,您可以在此处查看唤醒锁列表:
adb shell \"cat /sys/kernel/debug/wakeup_sources\"
    
您可以使用下面的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\'
您可以使用相同的技术来观察您在代码中获得的唤醒锁。     
  进程结束时,Android是否肯定会释放唤醒锁? 我不确定,尽管我不确定。   是否有可能某个应用的编写错误并且在退出前没有释放唤醒锁? AFAIK,是的。   有什么办法可以看到活动的唤醒锁吗? 运行
adb shell dumpsys power
。     
正如其他人已经说过的那样,adb shell dumpsys功能可以向您显示活动的唤醒锁。 但是,对于未释放唤醒锁的应用程序,请按照此处的答案进行操作: https://stackoverflow.com/a/16258624/428271 它应该由Android发布。但是,这适用于应用程序/进程被终止的情况,但也应适用于应用程序/进程完成时。它还提供了源代码参考,而不仅仅是说“已在代码中签入”     
您可以检查\“ Wakelock Detector \”应用程序,该应用程序在Google Play中可用 它有一个简单的UI,其中显示了每个应用程序获取的唤醒锁的详细列表。 正如您所提到的,它在顶部显示正在运行的应用程序,此刻可能存在唤醒锁。 唤醒锁检测器     
要查看活动的唤醒锁,请执行以下操作: adb shell dumpsys power | grep -i唤醒     
进程结束时,Android不会释放唤醒锁。它应在结束之前由进程显式释放。     
对于它的价值,在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})                                                               
    

要回复问题请先登录注册