出于某种原因,我的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
答案 0 :(得分:23)
在新版Android中,您可以在此处查看唤醒锁列表:
adb shell "cat /sys/kernel/debug/wakeup_sources"
答案 1 :(得分:20)
您可以使用以下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'
您可以使用相同的技术来观察您在代码中获得的唤醒锁定。
答案 2 :(得分:15)
当进程结束时,Android肯定会发布唤醒锁吗?
我对此表示怀疑,尽管我不确定。
是否有可能是一个应用程序写得不好而且在退出之前没有发布唤醒锁?
AFAIK,是的。
有没有办法看到活跃的唤醒锁?
运行adb shell dumpsys power
。
答案 3 :(得分:6)
正如其他人已经说过的那样,adb shell dumpsys的力量可以向你展示活跃的唤醒锁。
然而,对于那些没有发布唤醒锁的应用,根据这里的答案: https://stackoverflow.com/a/16258624/428271 它应该由Android发布。但是,它适用于app / process被杀死的情况,但是当app / process也完成时它应该适用。它还提供源代码引用,而不仅仅是说“签入代码”
答案 4 :(得分:3)
您可以查看Google Play中提供的“ Wakelock Detector ”应用
它有一个简单的UI,显示每个应用程序获取的唤醒锁的详细列表 正如您所提到的,它会在顶部显示有效运行的应用,目前可能会出现 wakelock 。
答案 5 :(得分:2)
要查看活动的唤醒锁定运行:
adb shell dumpsys power | grep -i wake
答案 6 :(得分:0)
Android在进程结束时不会释放唤醒锁。它应该在结束之前由流程明确释放。
答案 7 :(得分:0)
对于它的价值,在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})