Comment traiter avec (orphelin) WakeLocks?

40

Je suppose que la plupart d'entre vous au moins avez entendu parler de WakeLocks . Beaucoup d’entre vous les auront déjà expérimentés - que ce soit en connaissance de cause ou non. Certains savent peut-être comment les gérer en général - mais peu d’entre eux savent comment s’adapter aux "candidats les plus compliqués".

Pour ceux qui ne le savent pas, le lien ci-dessus mène à une explication, un bref résumé: Les applications peuvent demander WAKE_LOCKà laisser un composant de l'appareil en veille afin qu'elles puissent effectuer une tâche même lorsque l'écran est éteint. Ceci est très utile dans la plupart des cas (par exemple, en gardant l’écran allumé pendant la navigation, en gardant le Wi-Fi actif pour diffuser de la musique), mais si vous l’utilisez mal, votre batterie sera épuisée rapidement (jusqu’à 25% par heure). .

La plupart du temps, il est facile d'identifier la source (en général, une application qui se comporte mal) - je vais le montrer dans une réponse ci-dessous, car cela pourrait s'avérer utile pour de nombreux utilisateurs. Mais que faire si l'application qui a demandé le WakeLock se ferme sans le relâcher? Le système Android ne s'en occupera pas . Bien sûr, un redémarrage résoudrait le problème - mais ce n’est pas toujours une option (souhaitée).

Donc, du point de vue des utilisateurs (je ne parle pas des solutions de développement, mais comment un utilisateur peut gérer les choses):

Que peut-on faire * de la part de l'utilisateur * pour résoudre le problème et éviter l'épuisement supplémentaire de la batterie?

Je préfère les réponses n'impliquant pas la racine (pour que tous les utilisateurs puissent en bénéficier). Toutefois, les "solutions enracinées" sont tout à fait valables et sont également les bienvenues.

Izzy
la source
2
J'avais l'impression que ce n'était vrai que si vous créiez le wakelock de la "mauvaise" manière en utilisant /sys/power/wake_lock, mais que si vous le faisiez de la "bonne" manière en utilisant PowerManager et PowerManager.WakeLock, le service détiendrait tous les deux le véritable wakelock. et relâchez-le même si votre processus était tué ...
Izkata
1
Selon les informations que j'ai liées, ce n'est évidemment pas le cas. Quelqu'un a signalé que les sources du noyau avaient été vérifiées et qu'il n'avait trouvé aucune indication à ce sujet. Astuce pour les développeurs: « semble wakelocks partielle » peut être demandée chronométré , de sorte qu'ils avaient expirent automatiquement lorsque la minuterie est et le Aquire de wakelock n'a pas été actualisé. Ce doit être le "moyen sûr" auquel vous faites référence.
Izzy

Réponses:

37

Comment puis-je savoir que je suis affecté?

C'est probablement la première question à ceux qui ne sont pas familiers avec ce sujet. Avec Gingerbread (Android 2.3) et les versions ultérieures, vous disposez d'un service qui vous aide à comprendre: les statistiques de la batterie. Bien que les fabricants tendent à le placer à différents points, il se trouve principalement dans Paramètres → À propos du téléphone → Batterie ou similaire, et affiche une liste des applications ayant utilisé presque toute votre batterie. En plus de cela est un petit graphique. Appuyez dessus, et cela vous mènera à un écran similaire à celui-ci:

statistiques de la batterie
Capture d'écran des statistiques de la batterie sur Android 2.3

J'ai choisi une capture d'écran de l'un de mes appareils qui illustre le problème. En regardant les deux barres bleues inférieures ("Aktiv" = le périphérique a été maintenu éveillé (actif), "Bildschirm an" = "Screen on"), la barre bleue la plus à droite sur "Aktiv" indique un WakeLock: le périphérique a été maintenu occupé malgré le fait que l'écran était éteint. Nous pouvons donc être pratiquement certains que nous avons un WakeLock - mais nous ne pouvons pas dire qui l’a provoqué.

Si votre appareil ne propose pas cet écran (ou les barres en bas: je viens de découvrir par exemple que le LG Optimus 4X sous Android 4.0.3 a coupé ces barres), vous pouvez les trouver par exemple à l'aide de GSam Battery Monitor :

Moniteur de batterie GSam
Des informations similaires de GSam Battery Monitor - ici les "barres bleues" mentionnées sont jaune / orange

Quelle est la cause du WakeLock?

Malheureusement, il est impossible de répondre à cette question à l'aide d'applications préinstallées (à l'exception peut-être de certaines ROM personnalisées). Mais il existe des outils disponibles qui peuvent. Le meilleur candidat connu est BetterBatteryStats , et nous en montre la cause dans sa section sur les réveils partiels :

BetterBatteryStats BetterBatteryStats2
Captures d'écran de BetterBatteryStats

Dans le premier exemple 2 (tiré de la page Playstore de l'application), l'événement à l'origine de la plupart des WakeLocks était un événement souhaité: nous ne voulons pas que la lecture soit arrêtée lors de l'écoute de musique. Ainsi, le deuxième exemple 3 (tiré d'un cas réel sur l'un de mes appareils) pourrait s'avérer meilleur: les 3 événements les plus importants sont causés par la même application, qui nécessitait le WakeLock pour maintenir le service push IMAP actif.

Pour une alternative à BetterBatteryStats , consultez l' application Wakelock Detector mentionnée dans la réponse d'UzumApps - qui semble plus facile à gérer, en particulier pour les non-techniciens:

Wakelock Detector: Détails de l'application Détecteur Wakelock: Sélectionner les processus
Wakelock Detector - Cliquez sur l'image pour l'agrandir. (Source: Google Play )

Ce qui peut être fait?

Si le cas est aussi clair que dans le deuxième exemple de la section précédente, l'action est assez évidente - du moins dans mon cas: je n'ai pas besoin d'être informé immédiatement lorsqu'un courrier arrive; un délai de 30 minutes est tout à fait acceptable. Je suis donc allé dans l'application de messagerie, j'ai désactivé IMAP Push (voir aussi: Push Email ) et je suis passé à un intervalle d'interrogation de 30 minutes. WakeLocks n'a pas complètement disparu, mais a chuté de façon notable - la durée de vie de la batterie s'est nettement améliorée.

Ensuite, il y a le cas mentionné dans la question elle-même: une mauvaise application ne libérant pas son WakeLock. Confrontez le dev avec vos découvertes et demandez une solution. S'il livre: problème résolu. Si non: il y a presque toujours une application alternative disponible.

Et si c'est le système Android lui-même?

Ouais, parfois ça ressemble à ça: 98% ou plus consommé par certains services Android. Oh, si c'est 98%, dans la plupart des cas, le candidat s'appelle LocationManagerService . Un méchant nous espionnant? Pas nécessairement. Dans ce cas particulier, le "méchant" cité dans la liste n’est même pas coupable - du moins pas directement. Ici, il s'agit d'une autre application demandant trop fréquemment l'emplacement actuel. Il existe un excellent article sur Setera.org à ce sujet: Identifier l' épuisement de la batterie de l'Android LocationManagerService . Pour donner un résumé: Il utilise Androiddumpsysfonctionnalité (nécessite la racine!) pour vider un état du système et vous permettre d’examiner les écouteurs établis pour LocationManagerService. Un examen plus approfondi de leur configuration montre des informations qui «martèlent» constamment pour obtenir des informations de localisation (certaines le font en permanence, c'est-à-dire sans interruption). Comme l'ID de l'application est répertorié, et à un autre endroit de la sauvegarde, même avec le nom technique de l'application, vous pouvez toujours l'identifier et prendre les mesures appropriées.

Et qu'en est-il des ovnis?

Malheureusement, il existe de telles applications: les applications qui ont enregistré un WakeLock - et qui sont ensuite sorties sans le relâcher. Ce qui reste sont * Obsolètes non utilisés * - WakeLocks n'est pas utilisé. Il n'y a donc aucun moyen de simplement mettre l'application au premier plan et de la reconfigurer, ou de lui faire publier ses WakeLocks.

Ici, la seule solution que je connaisse est un redémarrage - et j'aimerais avoir une meilleure solution. Bien sûr, si vous connaissez l'application coupable, les étapes la concernant sont les mêmes que ci-dessus: informez le dev, obtenez une solution - ou remplacez l'application. Mais pour vous débarrasser du WakeLock actuel ? Peut-être que quelqu'un d'autre peut fournir une meilleure alternative au redémarrage?

Y a-t-il des lectures supplémentaires recommandées?

Sûr. Un pour l'instant, je pourrais en ajouter d'autres plus tard:

Izzy
la source
2
Une meilleure éducation pour les développeurs à dire ... "Libérez wakelocks quand vous avez fini avec eux et nettoyez après vous-même"?
t0mm13b
3
Upvote de moi pour votre réponse toujours aussi magnifique !!! Tu ne t'ennuies jamais de ça, n'est-ce pas? : D
t0mm13b
2
Bien sûr, mais voyez ma question: je ne pose pas explicitement des questions sur les développeurs, mais du point de vue des utilisateurs . J'ai peut-être besoin de rendre cela plus évident;)
Izzy
1
Ennuyé? Quelqu'un peut-il s'il vous plaît expliquer ce que c'est XD Non, j'ai toujours quelque chose en tête. Si je le trouve assez bon, je pose même la question ici (voir mon profil: je ne le demande pas souvent), bien que je puisse avoir une réponse (partielle). Les retours ici sont toujours rafraîchissants si la question en vaut la peine :)
Izzy
1
S'il vous plaît faire! Et rapportez vos découvertes! Je viens d'avoir ce problème décrit avec les "orphelins" WakeLocks. En fouillant pendant une heure, je ne suis pas allé plus loin que de constater que c'était le LocationManagerService . Enregistré pour les mises à jour toutes les 0sec (sic!) Était les paramètres Android (=: - 0). Je l'ai sortie, arrêtée, tuée à la ligne de commande ... aucun moyen de se débarrasser des serrures. WTF a fait les paramètres là-bas? Un redémarrage a résolu le problème, bien sûr - mais s'agit-il d'un WindowsPhone qu'il faut redémarrer deux fois par jour?
Izzy
6

En bref, c’est une très bonne question, mais je crains que cela ne se limite pas à informer l’utilisateur final!

Redéfinissez le noyau pour éliminer les verrous de réveil et utilisez un moyen plus efficace de mieux gérer le principe, prolongeant ainsi la durée de vie de la batterie.

Malheureusement, il a été accepté comme une solution de facto pour permettre la "gestion de l'alimentation", même s'il n'est pas vraiment efficace non plus! Il y a eu une discussion approfondie sur les wakelocks (avec Gregh Kroah Hartman - le gourou de Linux pour le développement de pilotes - cherche Google pour le lien exact), d'autres sites tels que LWN.net et un autre article expliqué sur le même site ici . C’est l’article que Gregh Kroah Hartman a mentionné dans ce blog , dans lequel il semble être d’accord avec la solution de rechange proposée par Rafael J. Wysocki et a beaucoup documenté sur l’alternative potentielle. Je ne suis pas sûr que cela soit réellement en place dans le noyau plus moderne v3.xx

Des applications mal conçues peuvent et demandent souvent des réveils tels que le maintien de l'écran, mais en réalité, dans ce scénario, l'écran est en réalité un moyen plus efficace de le faire:

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

Bien que nous nous efforcions d'éviter le jargon, etc., de l'utilisateur final, le cœur du problème se résume au code du noyau de la façon dont les wakelocks sont gérés.

Voici un bref résumé de XDA sur ce qui est wakelocks pour les non-initiés. En utilisant BetterBatteryStats , on peut voir exactement quel processus épuise la batterie, le wiki est hébergé sur github et est disponible sur le marché ici .

t0mm13b
la source
1
C'est drôle que vous pointez sur le même fil XDA que j'ai mentionné. Je conviens avec vous que le système devrait être plus prudent (par exemple, en libérant WakeLocks à la demande d'applications qui ne fonctionnent plus). Et que les développeurs doivent prendre davantage soin de coder (en les publiant explicitement aux états appropriés du cycle de vie). Mais cela ne nous aide pas les utilisateurs à savoir . J'espère que ma réponse donne un aperçu de ce qu'un utilisateur peut faire - et qu'un de vous "technophiles" peut combler le vide laissé!
Izzy
3

Découvrez le détecteur Wakelock: XDA-Developers / Google Play :

Le détecteur Wakelock regroupe les réveils de l'application dans une seule vue extensible pour une meilleure apparence. Et cela montre quelles applications sont en cours d'exécution. Et il y a des boutons d'information sur la désinstallation dans la vue développée de l'application.

Wakelock Detector: Détails de l'application Détecteur Wakelock: Sélectionner les processus
Cliquez sur l'image pour l'agrandir. (Source: Google Play )

Divulgation: Je suis l'un des développeurs responsables de cette application. Quatre autres amis travaillent avec moi sur ce projet en tant que passe-temps.

UzumApps
la source
Merci! C'est une information précieuse en effet. Souhaitez-vous ajouter quelques détails supplémentaires à votre réponse, par exemple ce qui la rend si spéciale? J'ajouterais quelques captures d'écran alors. En attendant, voici le lien du Playstore vers l'application ...
Izzy
Merci pour les détails! Je les ai fusionnées dans votre réponse, j'espère que cela ne vous dérange pas :) Question de compréhension: Dites une application interroge l'emplacement avec un intervalle de "0 secondes". Cela entraînerait le LocationService pour réveiller le périphérique. Est-ce que Wake Lock Detector afficherait alors l'application responsable comme la cause réelle - ou le LocationService , dans la mesure où il ne fait pas partie de ce package d'applications?
Izzy
La réponse à votre question est «non» car les détecteurs de wakelock regroupent des wakelocks appartenant au même nom de package d'application. Comme le service de localisation appartient à android os, la solution serait de vérifier les autorisations de l'application app
UzumApps
Merci beaucoup! J'espérais une solution facile au "Et si c'était le système Android lui-même?" partie. On dirait que ça n'existe pas - mais si c'est possible, ce serait peut-être une bonne idée d'intégrer WLD :)
Izzy
2
Merci pour votre avis, je vais y réfléchir et y travailler. WLD a l'air bien !!! :)
UzumApps
1

Quelques façons d'aider les utilisateurs d' appareils non racinés

  1. Voyant qu'Uzumapps, l'un des développeurs de l'application a mis en ligne une solution utilisant Wakelock Detector ( WLD ), je suis surpris qu'il n'ait pas mis à jour l'utilisation de l'application, qui peut également être utilisée sans root, appelé Wakelock Detector Light ! J'ai découvert cette recherche d'une solution pour mon nouvel appareil (non rooté).

Il s’agit d’un développement récent et, par conséquent, de l’afficher pour les utilisateurs d’appareils non racinés. Testé comme fonctionnant sur Moto X Play (Android 6.0.1)

  • Téléchargez le lien WLD du Play store ci-dessus

  • Manuel d'utilisation de WLD ici

  • Instructions pour les appareils non enracinés ici . Il a tous les détails mais pour résumer:

    adb shell dumpsys power | grep -i partial_wake_lock

Remarque: je ne pouvais pas utiliser la deuxième méthode, j'aimerais une solution de montage pour que cela fonctionne avec des types non avertis comme moi.

Beeshyams
la source