web-dev-qa-db-fra.com

Comment puis-je voir quels wakelocks sont actifs

Pour une raison quelconque, mon téléphone Android ne va pas dormir. Je suppose qu'un wakelock le garde éveillé, mais il n'y a aucun moyen de savoir quels wakelocks sont actifs. Les services en cours ne répertorient rien de suspect, et certainement rien de différent de d'habitude. Donc mes questions sont:

  1. Android libère-t-il définitivement wakelocks à la fin d'un processus? Est-il possible qu'une application ait été mal écrite et n'ait pas publié de wakelock avant de quitter?

  2. Est-il possible de voir les wakelocks actifs?

C'est ce que montre 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
25
Timmmm

Dans les nouvelles versions d'Android, vous pouvez voir la liste des wakelocks ici:

adb Shell "cat /sys/kernel/debug/wakeup_sources"
23
obezyan

Vous pouvez utiliser la commande ci-dessous adb pour exiger un verrouillage de réveil 

  adb Shell "echo mylock > /sys/power/wake_lock"

Ensuite, vous pouvez utiliser la commande ci-dessous pour voir si ce verrou est actif. Vous verrez que la colonne heure change continuellement, cela signifie que le verrouillage de réveil est activé. 

  watch -n 1 'adb Shell "cat /proc/wakelocks" | grep mylock'

Maintenant, utilisez cette commande adb pour libérer le verrou de réveil 

  adb Shell "echo mylock > /sys/power/wake_unlock"

Ensuite, vérifiez à nouveau, la colonne de temps va geler, cela signifie que le verrouillage de réveil est non actif

  watch -n 1 'adb Shell "cat /proc/wakelocks" | grep mylock'

Vous pouvez utiliser la même technique pour observer le verrouillage de sillage acquis dans le code. 

20
Browny Lin

Android libère-t-il définitivement wakelocks à la fin d'un processus?

J'en doute, mais je n'en suis pas certain.

Est-il possible qu'une application ait été mal écrite et n'ait pas publié de wakelock avant de quitter?

Autant que je sache, oui.

Est-il possible de voir les wakelocks actifs?

Exécutez adb Shell dumpsys power.

14
CommonsWare

Comme d'autres l'ont déjà dit, adb Shell dumpsys power peut vous montrer des wakelocks actifs.

Cependant, pour les applications qui ne libèrent pas wakelock, selon la réponse ci-dessous: https://stackoverflow.com/a/16258624/428271 Il devrait être publié par Android. Cependant, c'est pour le cas où app/process est tué, mais cela devrait être applicable lorsque app/process est également terminé. Il fournit également les références de code source au lieu de simplement dire "code vérifié"

6
Kiran Parmar

Vous pouvez consulter l'application "Wakelock Detector" disponible dans Google Play. 

Il a une interface utilisateur simple qui montre la liste détaillée des wakelocks acquis pour chaque application Et comme vous l'avez mentionné, il montre applications actives en cours d'exécution en haut, ce qui pourrait avoir wakelock présentement.

Détecteur Wakelock

3
UzumApps

Pour voir les verrous de sillage actifs exécutés:

adb Shell dumpsys power | grep -i wake  

2
crissyg

Pour ce que ça vaut, sur Android 7.1.1, c'est exactement ce que je cherchais:

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})                                                               
0
user1261470

Android ne libère pas les wakelocks à la fin du processus. Il doit être explicitement publié par le processus avant de se terminer. 

0
Eastern Monk