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:
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?
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
Dans les nouvelles versions d'Android, vous pouvez voir la liste des wakelocks ici:
adb Shell "cat /sys/kernel/debug/wakeup_sources"
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.
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
.
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é"
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.
Pour voir les verrous de sillage actifs exécutés:
adb Shell dumpsys power | grep -i wake
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})
Android ne libère pas les wakelocks à la fin du processus. Il doit être explicitement publié par le processus avant de se terminer.