40 votes

Comment gérer les WakeLocks (orphelins) ?

Je suppose que la plupart d'entre vous ont au moins entendu à propos de WakeLocks . Beaucoup d'entre vous auront expérimenté déjà, que ce soit sciemment ou non. Certains savent peut-être comment les traiter en général, mais rares sont ceux qui savent comment traiter les "candidats les plus compliqués".

Pour ceux qui ne le savent pas, bien que le lien ci-dessus mène à une explication, un bref résumé : les applications peuvent demander une WAKE_LOCK pour empêcher un composant du dispositif de "dormir", afin qu'il puisse effectuer une tâche même lorsque l'écran est éteint. C'est très utile dans la plupart des cas (par exemple, garder l'écran allumé pendant la navigation, garder le WiFi actif pour diffuser de la musique) - mais utilisé de la mauvaise façon, il entraîne une décharge de la batterie à court terme (jusqu'à 25 % par heure).

La plupart du temps, il est facile d'identifier la source (généralement une application qui se comporte mal). Je vais montrer cela dans une réponse ci-dessous, car cela pourrait être utile à de nombreux utilisateurs. Mais que faire si l'application qui a demandé le WakeLock sort sans le libérer ? 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 demande pas de solutions de développement, mais comment un utilisateur peut gérer les choses) :

Ce qui peut être fait *par l'utilisateur* pour résoudre le problème et éviter de vider davantage la batterie ?

Je préfère les réponses no impliquant la racine (afin que tous les utilisateurs puissent en bénéficier). Cependant, les "solutions racine" sont tout à fait valables et bienvenues également.

2 votes

J'avais l'impression que cela n'était vrai que si l'on créait le wakelock de la "mauvaise" façon, en utilisant la fonction /sys/power/wake_lock mais que si vous le faites de la "bonne" façon en utilisant PowerManager et PowerManager.WakeLock, le service conservera le vrai wakelock et le libérera même si votre processus est tué...

1 votes

D'après les informations que j'ai liées, ce n'est manifestement pas le cas. Quelqu'un rapporte qu'il a vérifié les sources du noyau et n'a pas trouvé d'indication à ce sujet. Conseil pour les développeurs : il semble que des "wakelocks partiels" peuvent être demandés. chronométré Ainsi, ils expirent automatiquement lorsque la minuterie est terminée et que l'acquisition du wakelock n'a pas été rafraîchie. Cela doit être la "méthode sûre" à laquelle vous faites référence.

37voto

Milner Points 533

Comment puis-je savoir si je suis affecté ?

C'est probablement la première question que se posent ceux qui ne sont pas familiers avec ce sujet. Avec Gingerbread (Android 2.3) et les versions ultérieures, vous disposez d'un service à bord qui vous aide à y voir clair : les statistiques sur la batterie. Bien que les fabricants aient tendance à le placer à différents endroits, on le trouve principalement dans les rubriques suivantes Paramètres → À propos du téléphone → Batterie ou similaire, et affiche une liste des applications ayant le plus utilisé votre batterie. Au-dessus de cette liste se trouve un petit graphique. Touchez-le, et vous verrez apparaître un écran similaire à celui-ci :

battery stats
Capture d'écran des statistiques de la batterie sous 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" = L'appareil est resté éveillé (actif), "Bildschirm an" = "Écran allumé"), la barre bleue la plus à droite sur "Aktiv" indique un WakeLock : Le dispositif a été maintenu actif malgré le fait que l'écran était éteint. Nous pouvons donc être pratiquement sûrs d'avoir 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, le LG Optimus 4X fonctionnant sous Android 4.0.3 a supprimé ces barres), vous pouvez les trouver en utilisant par exemple Moniteur de batterie GSam :

GSam Battery Monitor
Informations similaires provenant de Moniteur de batterie GSam -- Ici, les "barres bleues" mentionnées sont jaunes/oranges.

Qu'est-ce qui a causé le WakeLock ?

Malheureusement, il est impossible de répondre à cette question en utilisant des applications préinstallées (à l'exception, peut-être, de certaines ROM personnalisées). Mais il existe des outils qui le peuvent. Le candidat le plus connu pour cela est BetterBatteryStats et nous montre la cause dans son wakelocks partiels section :

BetterBatteryStatsBetterBatteryStats2
Captures d'écran de BetterBatteryStats

Dans le premier exemple 2 (extrait 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 pendant que nous écoutons de la musique. Donc le deuxième exemple 3 (tirée d'un cas réel sur l'un de mes appareils) pourrait s'avérer meilleure : les 3 événements les plus élevés sont causés par la même application, qui avait besoin du WakeLock pour maintenir le service push IMAP actif.

Pour une alternative à BetterBatteryStats , consultez le Détecteur Wakelock application mentionnée dans Réponse d'UzumApps -- qui semble plus facile à manier, surtout pour les non-techniciens :

Wakelock Detector: App details Wakelock Detector: Select processes
Détecteur Wakelock -- Cliquez sur l'image pour l'agrandir. (Source : Google Play )

Que peut-on faire ?

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

Il y a aussi le cas mentionné dans la question elle-même : Une application qui se comporte mal ne libère pas son WakeLock. Confrontez le développeur avec vos découvertes et demandez une correction. S'il s'exécute : problème résolu. Dans le cas contraire : Il y a presque toujours une application alternative disponible.

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

Oui, parfois ça ressemble à ça : 98% ou plus consommés par un service Android. Oh, si c'est 98%, dans la plupart des cas, le candidat s'appelle LocationManagerService . Le méchant nous espionne ? Pas nécessairement. Dans ce cas particulier, le "méchant" cité n'est même pas coupable - du moins pas directement. Il s'agit ici d'une autre application qui demande trop fréquemment la localisation actuelle. Il y a un excellent article sur Setera.org à ce sujet : Détermination de l'usure de la batterie du service LocationManagerService d'Android . Pour résumer, il utilise l'interface d'Android. dumpsys (qui nécessite une racine !) pour vider l'état du système, et vous permet d'examiner les écouteurs établis pour le LocationManagerService. Un examen plus approfondi de leur configuration montre lesquels sont constamment en train de "marteler" le service pour obtenir des informations de localisation (certains le font en permanence, c'est-à-dire sans interruption). Comme l'ID de l'application est répertorié, et à un autre endroit dans la décharge, 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 en existe : Des applications qui ont enregistré un WakeLock -- et qui sont sorties sans le libérer. Ce qui reste, ce sont des *Unused F***ing Obsoletes* -- des WakeLocks retenus pour aucune utilisation. Il n'y a donc aucun moyen de ramener simplement l'application au premier plan et de la reconfigurer, ou de lui faire libérer 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 : informer le développeur, obtenir une correction -- ou remplacer l'application. Mais pour ce qui est de se débarrasser du actuel WakeLock ? Peut-être que quelqu'un d'autre peut fournir une meilleure alternative au redémarrage ?

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

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

2 votes

Une meilleure éducation aux développeurs pour dire... "Libérez les wakelocks quand vous en avez fini avec eux et nettoyez après vous" ?

3 votes

Upvote de ma part pour ta réponse toujours aussi étonnante ! !! Vous ne vous lassez jamais de cela, n'est-ce pas ? :D

2 votes

Bien sûr mais voyez ma question : Je suis explicitement PAS à propos du côté des développeurs, mais du point de vue des utilisateurs . Peut-être que je dois rendre cela plus évident ;)

6voto

Nick Pierpoint Points 7976

En bref, c'est une très bonne question, mais je crains qu'il faille aller au-delà de la simple sensibilisation de l'utilisateur final !

Reconcevoir le noyau pour éliminer les verrouillages de réveil et utiliser un moyen plus complet et plus efficace de gérer le principe, ce qui permet de prolonger l'autonomie de la batterie.

Malheureusement, il a été accepté comme une solution de facto pour permettre la "gestion de l'énergie", bien qu'il ne soit pas exactement 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 - je suis en train de chercher le lien exact sur Google), d'autres sites tels que LWN.net et un autre article expliqué sur le même site ici . Il s'agit de l'article auquel Gregh Kroah Hartman a fait référence. blog dans lequel il semble être d'accord avec la solution alternative proposée par l'UE. Rafael J. Wysocki ont beaucoup documenté l'alternative potentielle. Je ne suis pas sûr que cela soit réellement en place dans le noyau plus moderne v3.x.x.

Les applications mal conçues peuvent et demandent souvent des wakelocks comme le maintien de l'écran allumé, mais en fait, dans ce scénario de maintien de l'écran allumé, il existe un moyen plus efficace de le faire :

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

Bien que nous nous efforcions d'éviter tout jargon pour l'utilisateur final, le cœur du problème se résume au code du noyau dans la manière dont les wakelocks sont gérés.

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

1 votes

C'est drôle que tu pointes vers le même fil de discussion XDA que j'ai mentionné. Je suis d'accord avec vous pour dire que le système devrait faire plus attention (par exemple en libérant les WakeLocks demandés par les applications qui ne sont plus en cours d'exécution). Et que les développeurs devraient faire plus attention en codant (en les libérant explicitement aux états appropriés du cycle de vie). Mais cela n'aide pas les utilisateurs connaître . J'espère que ma réponse donne un aperçu de ce qu'un utilisateur peut faire - et que l'un de vous, les "techniciens", pourra combler le vide laissé !

3voto

UzumApps Points 49

Vérifiez Détecteur Wakelock : XDA-Developers / Google Play :

Le détecteur de wakelock regroupe les wakelocks de l'application en une seule vue extensible pour une meilleure visualisation. Et il montre quelles applications sont en cours d'exécution. Et il y a des boutons d'information sur la désinstallation dans la vue étendue de l'application.

Wakelock Detector: App details Wakelock Detector: Select processes
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 comme un hobby.

0 votes

Merci ! C'est une information précieuse en effet. Pourriez-vous ajouter quelques détails supplémentaires à votre réponse, par exemple, ce qui la rend si spéciale ? J'ajouterais alors quelques captures d'écran. En attendant que ce soit fait : Voici le Lien Playstore vers l'application ...

0 votes

Merci pour les détails ! Je les ai fusionnés dans votre réponse, j'espère que cela ne vous dérange pas :) Question de compréhension : Supposons qu'une application interroge la localisation en utilisant un intervalle de "0 seconde". Cela entraînerait le LocationService pour déverrouiller l'appareil. Est-ce que Détecteur de verrouillage du réveil montrer l'application responsable comme étant la vraie cause ou le LocationService car il ne fait pas partie de ce paquet d'applications ?

0 votes

La réponse à votre question est "non" car le détecteur de wakelock regroupe les wakelocks qui appartiennent au même nom de pack d'applications. Comme le service de localisation appartient à Android os, la solution serait de vérifier les autorisations de l'utilisateur de l'application.

1voto

beeshyams Points 37355

Voici quelques moyens qui pourraient vous aider dispositif non enraciné utilisateurs

  1. Voyant que @Uzumapps, l'un des développeurs de l'application a posté une solution en utilisant Détecteur Wakelock ( WLD ), je suis surpris qu'il n'ait pas mis à jour l'utilisation de l'application qui peut aussi être utilisée sans racine appelé Wakelock Detector Light ! J'ai découvert ce site en cherchant une solution pour mon nouvel appareil (non rooté).

Il s'agit d'un développement récent, d'où la publication de ce message pour les utilisateurs d'appareils non enracinés. Testé comme fonctionnant sur Moto X Play (Android 6.0.1)

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

  • Manuel d'utilisation de la WLD ici

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

    adb shell dumpsys power | grep -i partial_wake_lock

Note : Je n'ai pas réussi à faire fonctionner la deuxième méthode, je serais heureux de pouvoir éditer une solution pour la faire fonctionner pour des personnes non averties comme moi.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X