Wie gehe ich mit (verwaisten) WakeLocks um?

Ich denke, die meisten von Ihnen haben zumindest von WakeLocks gehört . Viele von Ihnen werden sie bereits erlebt haben – ob wissentlich oder nicht. Manche wissen vielleicht, wie man mit ihnen im Allgemeinen umgeht – aber nur wenige wissen, wie man mit den „komplizierteren Kandidaten“ umgeht.

Für diejenigen, die es nicht wissen, obwohl der obige Link zu einer Erklärung führt, eine kurze Zusammenfassung: Apps können a anfordern WAKE_LOCK, eine Gerätekomponente aus dem "Schlafmodus" zu halten, damit sie eine Aufgabe ausführen können, selbst wenn das Display ausgeschaltet ist. Dies ist in den meisten Fällen sehr nützlich (z. B. den Bildschirm während der Navigation eingeschaltet zu lassen, das WLAN zum Streamen von Musik aktiv zu halten) – aber falsch verwendet führt es dazu, dass Ihr Akku kurzfristig entladen wird (bis zu 25 % pro Stunde). .

Meistens ist es einfach, die Quelle zu identifizieren (normalerweise eine schlecht funktionierende App) – ich werde dies in einer Antwort unten zeigen, da es sich für viele Benutzer als hilfreich erweisen könnte. Aber was tun, wenn die App, die das WakeLock angefordert hat, beendet wird, ohne es freizugeben? Das Android-System kümmert sich nicht darum . Sicher, ein Neustart würde das Problem lösen – aber es ist nicht immer eine (erwünschte) Option.

Also aus Benutzersicht (ich frage nicht nach Entwicklungslösungen, sondern wie ein Benutzer mit Dingen umgehen kann):

Was kann *vom Benutzer* getan werden , um das Problem zu lösen und eine weitere Batterieentladung zu vermeiden?

Ich bevorzuge Antworten ohne Root (damit alle Benutzer davon profitieren können). Aber auch „Rooted Solutions“ sind voll gültig und willkommen.

Ich hatte den Eindruck, dass dies nur zutrifft, wenn Sie das Wakelock auf die „falsche“ Weise erstellt haben, indem /sys/power/wake_lockSie , aber dass, wenn Sie es auf die „richtige“ Weise mit PowerManager und PowerManager.WakeLock erstellt haben, der Dienst beide das echte Wakelock enthalten würde und geben Sie es frei, auch wenn Ihr Prozess beendet wurde ...
Nach den von mir verlinkten Informationen ist das offensichtlich nicht der Fall. Dort berichtet jemand, er habe die Kernel-Quellen überprüft und keinen Hinweis darauf gefunden. Hinweis für Entwickler: Anscheinend können "partielle Wakelocks" zeitgesteuert angefordert werden , sodass sie automatisch ablaufen, wenn der Timer abgelaufen ist und die Wakelock-Erfassung nicht aktualisiert wurde. Das muss der "sichere Weg" sein, auf den Sie sich beziehen.

Antworten (4)

Wie erkenne ich, dass ich betroffen bin?

Dies ist wahrscheinlich die erste Frage an diejenigen, die mit diesem Thema nicht vertraut sind. Mit Gingerbread (Android 2.3) und höher haben Sie einen Dienst an Bord, der Ihnen hilft, herauszufinden: Batteriestatistiken. Obwohl die Hersteller dazu neigen, es an verschiedenen Stellen zu platzieren, ist es meistens unter Einstellungen → Über das Telefon → Akku oder ähnliches zu finden und zeigt eine Liste der Apps, die den größten Teil Ihres Akkus verbraucht haben. Darüber befindet sich eine kleine Grafik. Tippen Sie darauf und Sie gelangen zu einem ähnlichen Bildschirm wie diesem:

Batteriestatistiken
Screenshot der Batteriestatistik auf Android 2.3

Ich habe einen Screenshot von einem meiner Geräte ausgewählt, der das Problem veranschaulicht. Betrachtet man die unteren beiden blauen Balken ("Aktiv" = Gerät wurde wach gehalten (aktiv), "Bildschirm an" = "Bildschirm an"), zeigt der rechte blaue Balken bei "Aktiv" ein WakeLock: Gerät wurde trotzdem beschäftigt gehalten die Tatsache, dass der Bildschirm ausgeschaltet war. So können wir ziemlich sicher sein, dass wir ein WakeLock haben – aber wir können nicht sagen, wer es verursacht hat.

Wenn Ihr Gerät diesen Bildschirm nicht bietet (oder die Balken unten: Ich habe gerade entdeckt, dass z. B. das LG Optimus 4X mit Android 4.0.3 diese Balken abgeschnitten hat), können Sie sie z. B. mit GSam Battery Monitor finden :

GSam-Batteriemonitor
Ähnliche Informationen von GSam Battery Monitor - hier sind die erwähnten "blauen Balken" gelb/orange

Was hat das WakeLock verursacht?

Leider lässt sich diese Frage nicht mit vorinstallierten Apps beantworten (außer vielleicht einigen Custom ROMs). Aber es gibt Tools, die das können. Der bekannteste Kandidat dafür ist BetterBatteryStats , und zeigt uns die Ursache in seinem Abschnitt über teilweise Wakelocks :

Bessere Batteriestatistiken BetterBatteryStats2
Screenshots von BetterBatteryStats

Im ersten Beispiel 2 (aus der Playstore-Seite der App) war das Ereignis, das die meisten WakeLocks verursacht, ein gewünschtes: Wir möchten nicht, dass die Wiedergabe beim Musikhören gestoppt wird. Das zweite Beispiel 3 (aus einem realen Fall auf einem meiner Geräte) könnte sich also als besser erweisen: Die obersten 3 Ereignisse werden von derselben App verursacht, die das WakeLock benötigte, um den IMAP-Push-Dienst aktiv zu halten.

Eine Alternative zu BetterBatteryStats finden Sie in der Wakelock Detector - App, die in der Antwort von UzumApps erwähnt wird – die insbesondere für Nicht-Techniker einfacher zu handhaben scheint:

Wakelock-Detektor: App-Details Wakelock-Detektor: Wählen Sie Prozesse aus
Wakelock-Detektor -- Zum Vergrößern auf das Bild klicken. (Quelle: GooglePlay )

Was kann getan werden?

Wenn der Fall so klar ist wie im zweiten Beispiel im vorherigen Abschnitt, ist die Aktion ziemlich offensichtlich - zumindest in meinem Fall: Ich muss nicht sofort benachrichtigt werden, wenn eine Mail ankommt; eine Verzögerung von 30min ist absolut akzeptabel. Also ging ich in die Mail-App, deaktivierte IMAP-Push (siehe auch: Push-E-Mail ) und stellte stattdessen auf ein 30-minütiges Abfrageintervall um. WakeLocks verschwanden nicht vollständig, gingen aber deutlich zurück – die Akkulaufzeit verbesserte sich merklich.

Dann gibt es den Fall, der in der Frage selbst erwähnt wird: Eine sich schlecht verhaltende App, die ihr WakeLock nicht freigibt. Konfrontieren Sie den Entwickler mit Ihren Erkenntnissen und bitten Sie um eine Lösung. Liefert er: Problem gelöst. Falls nicht: Es gibt fast immer eine alternative App.

Was ist, wenn es das Android-System selbst ist?

Ja, manchmal sieht es genau so aus: 98 % oder mehr werden von einem Android-Dienst verbraucht. Oh, wenn es 98 % sind, heißt der Kandidat in den meisten Fällen LocationManagerService . Bösewicht, der uns ausspioniert? Nicht unbedingt. In diesem speziellen Fall ist der aufgeführte "Bösewicht" nicht einmal schuldig - zumindest nicht direkt. Hier ist es eine andere App, die zu häufig den aktuellen Standort abfragt. Auf Setera.org gibt es dazu einen ausgezeichneten Artikel: Pinpointing Android LocationManagerService battery drain . Um eine Zusammenfassung zu geben: Es verwendet Androiddumpsys-Funktion (erfordert Root!) zum Sichern eines Systemstatus und ermöglicht es Ihnen, die für den LocationManagerService eingerichteten Listener zu untersuchen. Ein genauerer Blick auf ihre Konfiguration zeigt, dass sie ständig nach Standortinformationen "hämmern" (einige tun dies permanent, dh ohne Unterbrechung). Da die App-ID zusammen mit dem technischen Namen der App und an anderer Stelle im Dump aufgeführt ist, können Sie sie dennoch identifizieren und entsprechende Maßnahmen ergreifen.

Und was ist mit UFOs?

Leider gibt es solche: Apps, die ein WakeLock registriert haben – und dann beendet wurden, ohne es freizugeben. Was übrig bleibt, sind *Unused F***ing Obsoletes* – WakeLocks, die für keinen Gebrauch gehalten werden. Also keine Möglichkeit, die App einfach in den Vordergrund zu bringen und neu zu konfigurieren oder ihre WakeLocks freizugeben.

Hier ist die einzige mir bekannte Lösung ein Neustart - und ich hätte gerne eine bessere Lösung. Wenn Sie die schuldige App kennen, sind die diesbezüglichen Schritte natürlich die gleichen wie oben: Informieren Sie den Entwickler, erhalten Sie eine Lösung – oder ersetzen Sie die App. Aber um das aktuelle WakeLock loszuwerden? Vielleicht kann jemand anderes eine bessere Alternative zum Neustart bieten?

Gibt es empfehlenswerte weiterführende Literatur?

Sicher. Eines für jetzt, ich kann später mehr hinzufügen:

Bessere Aufklärung für Entwickler, um zu sagen: „Löse Wakelocks frei, wenn du damit fertig bist, und bereinige sie hinter dir“?
Stimmen Sie von mir für Ihre wie immer umwerfende Antwort ab!!! Das wird dir nie langweilig, oder? :D
Sicher -- aber siehe meine Frage: Ich frage ausdrücklich NICHT nach der Entwicklerseite, sondern aus der Sicht der Benutzer . Vielleicht muss ich das deutlicher machen ;)
Gelangweilt? Kann mir bitte jemand erklären wie das ist? XD Nein, ich habe immer etwas im Kopf. Wenn ich das Gefühl habe, dass es gut genug ist, frage ich sogar hier danach (siehe mein Profil: Ich frage nicht oft), obwohl ich vielleicht eine (Teil-) Antwort habe. Das Feedback hier ist immer wieder erfrischend, wenn sich die Frage lohnt :)
Wenn ich dieses Wochenende Zeit habe, werde ich unter der Haube herumstöbern, um zu sehen, ob es einen Mechanismus gibt, der den Kernel dazu bringt, verwaiste Wakelocks zu booten .... ;)
Bitte! Und berichte von deinen Erkenntnissen! Ich hatte gerade das beschriebene Problem mit den "verwaisten" WakeLocks. Als ich eine Stunde lang herumstocherte, kam ich nicht weiter, als zu sehen, dass es der LocationManagerService war . Angemeldet für Updates alle 0sec (sic!) waren die Android Settings (=:-0). Ich habe es beendet, angehalten, es an der Befehlszeile beendet ... keine Möglichkeit, die Sperren loszuwerden. WTF hat man da Einstellungen gemacht ? Ein Neustart hat es natürlich gelöst – aber ist dies ein WindowsPhone, das wir zweimal am Tag neu starten müssen?
@ t0mm13b da dieses Wochenende schon lange vorbei ist: hast du in deiner c64-Sitzung etwas Nützliches gefunden (Peek and Poke)?

Kurz gesagt, dies ist eine sehr gute Frage, aber ich fürchte, sie erfordert mehr, als nur den Endbenutzer darauf aufmerksam zu machen!

Entwerfen Sie den Kernel neu, um Wakelocks zu eliminieren, und verwenden Sie eine gründlichere und effizientere Methode, um das Prinzip besser zu verwalten und dadurch die Batterielebensdauer zu verlängern.

Leider wurde es als De-facto-Lösung akzeptiert, um "Power Management" zu ermöglichen, obwohl es auch nicht gerade effizient ist! Es gab eine ausführliche Diskussion über Wakelocks (mit Gregh Kroah Hartman – dem Linux-Guru für die Treiberentwicklung – ich googel nach dem genauen Link), anderen Websites wie LWN.net und einem weiteren Artikel, der auf derselben Website hier erklärt wurde . Dies war der Artikel, auf den Gregh Kroah Hartman in diesem Blog verwies, in dem er der von Rafael J. Wysocki vorgeschlagenen Alternativlösung zuzustimmen scheint . Er hat viel über die mögliche Alternative dokumentiert. Ich bin mir nicht sicher, ob das tatsächlich im moderneren Kernel v3.xx vorhanden ist

Schlecht gestaltete Apps können und oft Wakelocks anfordern, wie z.

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

Während wir uns bemühen, dies für den Endbenutzer frei von Fachjargon usw. zu halten, läuft der Kern des Problems wirklich auf den Kernel-Code hinaus, wie die Wakelocks verwaltet werden.

Hier ist eine kurze Zusammenfassung von XDA darüber, was Wakelocks für Uneingeweihte sind. Durch die Verwendung von BetterBatteryStats konnte man genau sehen, welcher Prozess die Batterie leert, das Wiki wird auf Github gehostet und ist hier auf dem Markt erhältlich .

Komisch, dass du auf denselben XDA-Thread zeigst, den ich erwähnt habe. Ich stimme Ihnen zu, dass das System besser aufpassen sollte (z. B. durch das Freigeben von WakeLocks, die von Apps angefordert werden, die nicht mehr ausgeführt werden). Und dass Entwickler beim Codieren besser aufpassen sollten (indem sie sie explizit in den entsprechenden Stadien des Lebenszyklus freigeben). Aber das hilft uns Benutzern nicht weiter . Ich hoffe, meine Antwort gibt einen Einblick, was ein Benutzer tun kann - und dass einer von Ihnen "Technikfreaks" die verbleibende Lücke füllen kann!

Schauen Sie sich Wakelock Detector an: XDA-Developers / Google Play :

Der Wakelock-Detektor gruppiert die Wakelocks der App zur besseren Übersicht in einer erweiterbaren Ansicht. Und es zeigt, welche Apps ausgeführt werden. Und in der erweiterten Ansicht der App gibt es Schaltflächen zum Beenden der Deinstallation.

Wakelock-Detektor: App-Details Wakelock-Detektor: Wählen Sie Prozesse aus
Klicken Sie auf das Bild, um es zu vergrößern. (Quelle: GooglePlay )

Offenlegung: Ich bin einer der verantwortlichen Entwickler für diese App. Vier weitere Freunde arbeiten mit mir als Hobby an diesem Projekt.

Danke schön! Das ist in der Tat eine wertvolle Information. Würde es Ihnen etwas ausmachen, Ihrer Antwort weitere Details hinzuzufügen, z. B. was es so besonders macht? Dann würde ich noch ein paar Screenshots hinzufügen. Bis dahin: Hier der Playstore-Link zur App ...
Vielen Dank für die Einzelheiten! Ich habe sie in Ihre Antwort eingefügt, ich hoffe, Sie haben nichts dagegen :) Verständnisfrage: Angenommen, eine App fragt den Standort mit einem Intervall von "0 Sekunden" ab. Dies würde dazu führen, dass der LocationService das Gerät aufweckt. Würde Wake Lock Detector dann die verantwortliche App als wirkliche Ursache anzeigen – oder den LocationService , da er nicht Teil dieses Apps-Pakets ist?
Die Antwort auf Ihre Frage lautet „Nein“, da der Wakelock-Detektor Wakelocks gruppiert, die zum selben App-Paketnamen gehören. Da der Ortungsdienst zum Android-Betriebssystem gehört, besteht die Lösung darin, die Benutzerberechtigungen der App zu überprüfen
Vielen Dank! Ich hatte auf eine einfache Lösung für das Problem "Was ist, wenn es das Android-System selbst ist?" gehofft. Teil. Scheint so etwas nicht zu geben - aber wenn es möglich ist, könnte es eine gute Idee sein, es in WLD zu integrieren :)
Vielen Dank für Ihre Meinung, ich werde darüber nachdenken und daran arbeiten. WL sieht gut aus!!! :)

Ein paar Möglichkeiten, die nicht gerooteten Gerätebenutzern helfen würden

  1. Da @Uzumapps, einer der Entwickler der App, eine Lösung mit Wakelock Detector ( WLD ) veröffentlicht hat, bin ich überrascht, dass er nicht über die Verwendung der App namens Wakelock Detector Light aktualisiert hat, die auch ohne Root verwendet werden kann ! Ich habe dies auf der Suche nach einer Lösung für mein neues Gerät (nicht gerootet) entdeckt.

Dies ist eine neuere Entwicklung und wird daher für Benutzer von nicht gerooteten Geräten veröffentlicht. Getestet auf Moto X Play (Android 6.0.1)

  • Laden Sie WLD vom Play Store-Link oben herunter

  • Anleitung zur Verwendung von WLD hier

  • Anleitungen für nicht gerootete Geräte hier . Es hat alle Details, aber um es zusammenzufassen:

    ADB-Shell-Dumpsys-Leistung | grep -i partial_wake_lock

Hinweis: Ich konnte die zweite Methode nicht zum Laufen bringen, würde eine Bearbeitungslösung begrüßen, damit sie für nicht versierte Leute wie mich funktioniert