由于某种原因,我的 Android 手机无法进入睡眠状态。我假设唤醒锁使其保持唤醒状态,但无法判断哪些唤醒锁处于活动状态。正在运行的服务没有列出任何可疑的内容,当然也与平常没有什么不同。所以我的问题是:
当进程结束时,Android 一定会释放唤醒锁吗?是否有可能应用程序写得不好并且在退出之前没有释放唤醒锁?
有什么方法可以查看活动的唤醒锁吗?
这就是
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 中,您可以在此处查看唤醒锁列表:
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 一定会释放唤醒锁吗?
我对此表示怀疑,尽管我不确定。
是否有可能应用程序编写得很糟糕并且在退出之前没有释放唤醒锁?
据我所知,是的。
有什么方法可以查看活动的唤醒锁吗?
运行
adb shell dumpsys power
。
正如其他人已经说过的,adb shell dumpsys power 可以向您显示活动的唤醒锁。
但是,对于未释放唤醒锁的应用程序,按照此处的答案: https://stackoverflow.com/a/16258624/428271 应该是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})
查看活动唤醒锁运行:
adb shell dumpsys power|grep -iwake
您可以查看 Google Play 中提供的“Wakelock Detector”应用程序
它有一个简单的 UI,显示每个应用程序获取的唤醒锁的详细列表 正如您所提到的,它在顶部显示活动的正在运行的应用程序,目前可能存在唤醒锁。
包含应用程序和系统级数据的 Android 设备当前状态的完整图片称为“Android 转储”。此快照提供了设备上内存、活动进程和各种系统组件的全面概述。 https://frptech.co/android-dump/
当进程结束时,Android 不会释放唤醒锁。它应该在结束之前由进程显式释放。