我怎样才能看到哪些唤醒锁是活跃的

Tim*_*mmm 25 android process wakelock

出于某种原因,我的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
Run Code Online (Sandbox Code Playgroud)

obe*_*yan 24

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

adb shell "cat /sys/kernel/debug/wakeup_sources"
Run Code Online (Sandbox Code Playgroud)

  • 看起来你需要扎根于此. (5认同)
  • FWIW,活动唤醒锁存储在/ sys/kernel/debug/wakeup_sources_active中 (2认同)

Bro*_*Lin 20

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

  adb shell "echo mylock > /sys/power/wake_lock"
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下命令来监视此锁是否处于活动状态.您将看到时间列不断变化,这意味着唤醒锁定处于活动状态

  watch -n 1 'adb shell "cat /proc/wakelocks" | grep mylock'
Run Code Online (Sandbox Code Playgroud)

现在,使用此adb命令释放唤醒锁定

  adb shell "echo mylock > /sys/power/wake_unlock"
Run Code Online (Sandbox Code Playgroud)

然后,再次检查,时间列将冻结,这意味着唤醒锁定未激活

  watch -n 1 'adb shell "cat /proc/wakelocks" | grep mylock'
Run Code Online (Sandbox Code Playgroud)

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

  • 您需要root访问权限. (3认同)
  • 在Android的最新版本中(不确定它启动哪个版本),wakelocks列表在/ sys/kernel/debug/wakeup_sources和/ sys/kernel/debug/wakeup_sources_active中可用 (3认同)

Com*_*are 15

当进程结束时,Android肯定会发布唤醒锁吗?

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

有可能是一个应用程序写得不好而且在退出之前没有发布唤醒锁吗?

AFAIK,是的.

有没有办法看到活跃的唤醒锁?

跑adb shell dumpsys power.


Kir*_*mar 7

正如其他人已经说过的那样,adb shell dumpsys的力量可以向你展示活跃的唤醒锁.

但是,对于没有发布唤醒锁的应用程序,请按照以下答案:https://stackoverflow.com/a/16258624/428271 它应该由Android发布.但是,它适用于app/process被杀死的情况,但是当app/process也完成时它应该适用.它还提供源代码引用,而不仅仅是说"签入代码"


use*_*470 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})                                                               
Run Code Online (Sandbox Code Playgroud)