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

问题描述 投票:0回答:9

由于某种原因,我的 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
android process wakelock
9个回答
28
投票

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

adb shell "cat /sys/kernel/debug/wakeup_sources"

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'

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


16
投票

当进程结束时,Android 一定会释放唤醒锁吗?

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

是否有可能应用程序编写得很糟糕并且在退出之前没有释放唤醒锁?

据我所知,是的。

有什么方法可以查看活动的唤醒锁吗?

运行

adb shell dumpsys power


7
投票

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

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


6
投票

就其价值而言,在 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})                                                               

4
投票

查看活动唤醒锁运行:

adb shell dumpsys power|grep -iwake


3
投票

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

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

唤醒锁探测器


0
投票

包含应用程序和系统级数据的 Android 设备当前状态的完整图片称为“Android 转储”。此快照提供了设备上内存、活动进程和各种系统组件的全面概述。 https://frptech.co/android-dump/


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.