Jak radzić sobie z (osieroconymi) WakeLocks?


40

Chyba większość z was przynajmniej słyszała o WakeLocks . Wielu z was już ich doświadczyło - świadomie czy nie. Niektórzy mogą wiedzieć, jak sobie z nimi poradzić, ale tylko nieliczni wiedzą, jak postępować z „bardziej skomplikowanymi kandydatami”.

Dla tych, którzy nie wiedzą, chociaż powyższy link prowadzi do wyjaśnienia, krótkie podsumowanie: Aplikacje mogą poprosić o WAKE_LOCK„wstrzymanie” elementu urządzenia, aby mogli wykonać zadanie, nawet gdy wyświetlacz jest wyłączony. Jest to bardzo przydatne w większości przypadków (np. Utrzymanie ekranu podczas nawigacji, utrzymywanie Wi-Fi aktywne w celu strumieniowego przesyłania muzyki) - ale użyte w niewłaściwy sposób powoduje wyczerpanie baterii w krótkim okresie (do 25% na godzinę) .

W większości przypadków łatwo jest zidentyfikować źródło (zwykle źle zachowująca się aplikacja) - pokażę to w odpowiedzi poniżej, ponieważ może to okazać się pomocne dla wielu użytkowników. Ale co zrobić, jeśli aplikacja, która poprosiła o WakeLock, zakończy działanie bez jej zwolnienia? System Android nie zajmie się tym . Oczywiście ponowne uruchomienie rozwiązałoby problem - ale nie zawsze jest to (pożądana) opcja.

Z punktu widzenia użytkowników (nie pytam o rozwiązania programistyczne, ale o to, jak użytkownik może sobie poradzić):

Co może zrobić * użytkownik *, aby rozwiązać problem i uniknąć dalszego rozładowania baterii?

Wolę odpowiedzi bez udziału roota (aby wszyscy użytkownicy mogli z niego skorzystać). Jednak „zrootowane rozwiązania” są w pełni aktualne i mile widziane.


2
Miałem wrażenie, że było to prawdą tylko wtedy, gdy utworzyłeś wakelock w „niewłaściwy” sposób, używając /sys/power/wake_lock, ale że jeśli zrobiłeś to w „właściwy” sposób za pomocą PowerManager i PowerManager.WakeLock, usługa utrzymałaby prawdziwy wakelock i zwolnijcie go, nawet jeśli wasz proces został zabity ...
Izkata,

1
Według informacji, które podłączyłem, oczywiście tak nie jest. Ktoś donosi, że sprawdził źródła jądra i nie znalazł na to żadnej wskazówki. Wskazówka dla programistów: wygląda na to, że można zażądać „częściowych wakelocków” o czas , więc wygasną one automatycznie, gdy czas się skończy, a wakelock aquire nie zostanie odświeżony. To musi być „bezpieczny sposób”, o którym mowa.
Izzy

Odpowiedzi:


37

Jak mogę stwierdzić, że mam na to wpływ?

Jest to prawdopodobnie pierwsze pytanie dla osób niezaznajomionych z tym tematem. Dzięki Gingerbread (Android 2.3) i nowszym masz na pokładzie usługę, która pomaga Ci zrozumieć: statystyki baterii. Chociaż producenci zwykle umieszczają go w różnych punktach, najczęściej można go znaleźć w Ustawieniach → Informacje o telefonie → Bateria lub podobna, i pokazuje listę aplikacji, które wykorzystały większość baterii. Na dodatek jest mały wykres. Dotknij tego, a pojawi się ekran podobny do tego:

statystyki baterii
Zrzut ekranu statystyk baterii na Androidzie 2.3

Wybrałem zrzut ekranu z jednego z moich urządzeń, który ilustruje problem. Patrząc na dwa dolne niebieskie słupki („Aktiv” = urządzenie pozostało w stanie czuwania (aktywne), „Bildschirm an” = „Screen on”), prawy niebieski pasek na „Aktiv” wskazuje, że WakeLock: urządzenie było zajęte pomimo fakt, że ekran został wyłączony. Dzięki temu możemy być całkiem pewni, że mamy WakeLock - ale nie wiemy, kto go spowodował.

Jeśli twoje urządzenie nie oferuje tego ekranu (lub pasków u dołu: Właśnie odkryłem, że np. LG Optimus 4X z Androidem 4.0.3 odciął te paski), możesz je znaleźć np. Za pomocą GSam Battery Monitor :

GSam Battery Monitor
Podobne informacje z GSam Battery Monitor - tutaj wspomniane „niebieskie paski” są żółte / pomarańczowe

Co spowodowało WakeLock?

Niestety na to pytanie nie można odpowiedzieć przy użyciu wstępnie zainstalowanych aplikacji (z wyjątkiem, być może, niektórych niestandardowych ROM). Ale są dostępne narzędzia, które mogą. Najbardziej znanym kandydatem na to jest BetterBatteryStats , i pokazuje nam przyczynę w częściowej sekcji wakelocks :

BetterBatteryStats BetterBatteryStats2
Zrzuty ekranu z BetterBatteryStats

W pierwszym przykładzie 2 (pobranym ze strony sklepu z aplikacjami) zdarzenie powodujące większość WakeLocks było pożądane: nie chcemy, aby odtwarzanie zostało zatrzymane podczas słuchania muzyki. Tak więc drugi przykład 3 (wzięty z prawdziwego przypadku na jednym z moich urządzeń) może okazać się lepszy: 3 najwyższe zdarzenia są spowodowane przez tę samą aplikację, która potrzebowała WakeLock do utrzymania aktywnej usługi push IMAP.

Alternatywą dla BetterBatteryStats jest aplikacja Wakelock Detector wspomniana w odpowiedzi UzumApps - która wydaje się łatwiejsza w obsłudze, zwłaszcza dla osób bez technologii:

Wakelock Detector: szczegóły aplikacji Detektor Wakelock: Wybierz procesy
Detektor Wakelock - kliknij obraz, aby powiększyć. (Źródło: Google Play )

Co można zrobić?

Jeśli sprawa jest tak jasna, jak w drugim przykładzie w poprzedniej sekcji, działanie jest dość oczywiste - przynajmniej w moim przypadku: Nie muszę być natychmiast informowany o nadejściu wiadomości; opóźnienie 30 minut jest absolutnie dopuszczalne. Więc poszedłem do aplikacji poczty, wyłączyłem IMAP Push (patrz też: Push Email ) i zamiast tego przestawiłem się na 30-minutowy interwał odpytywania. WakeLocks nie zniknął całkowicie, ale znacznie spadł - żywotność baterii znacznie się poprawiła.

Jest też przypadek wspomniany w samym pytaniu: Aplikacja o złym działaniu, która nie wypuszcza swojego WakeLock. Skonfrontuj twórcę ze swoimi odkryciami i poproś o naprawę. Jeśli dostarczy: problem rozwiązany. Jeśli nie: prawie zawsze dostępna jest alternatywna aplikacja.

Co jeśli jest to sam system Android?

Tak, czasami tak to wygląda: 98% lub więcej konsumowane przez jakąś usługę Android. Och, jeśli wynosi 98%, w większości przypadków kandydat nazywa się LocationManagerService . Zły facet szpieguje nas? Niekoniecznie. W tym szczególnym przypadku wymieniony „zły facet” nie jest nawet winny - przynajmniej nie bezpośrednio. Oto kolejna aplikacja zbyt często żądająca bieżącej lokalizacji. Istnieje doskonały artykuł na Setera.org na ten temat: Pinpointing Android LocationManagerService drenaż baterii . Aby dać streszczenie: używa Androidadumpsysfunkcja (wymaga roota!), aby zrzucić stan systemu i pozwala zbadać detektory ustanowione dla usługi LocationManagerService. Bliższe spojrzenie na ich konfigurację pokazuje, które ciągle „uderzają” go o informacje o lokalizacji (niektóre robią to na stałe, tj. Bez przerwy). Ponieważ identyfikator aplikacji jest wymieniony razem, aw innym miejscu zrzutu, nawet wraz z nazwą techniczną aplikacji, nadal możesz go zidentyfikować i podjąć odpowiednie działania.

A co z UFO?

Niestety istnieją: Aplikacje, które zarejestrowały WakeLock - a następnie zakończyły działanie bez jego zwolnienia. Pozostały * Nieużywane F *** ing Przestarzałe * - Blokada WakeLocks jest bezużyteczna. Więc nie ma sposobu, aby po prostu przenieść aplikację na pierwszy plan i zmienić jej konfigurację, lub pozwolić jej zwolnić WakeLocks.

Tutaj jedynym znanym mi rozwiązaniem jest restart - i chciałbym mieć lepsze rozwiązanie. Oczywiście, jeśli znasz winną aplikację, kroki jej dotyczące są takie same jak powyżej: poinformuj programistę, uzyskaj poprawkę - lub wymień aplikację. Ale o pozbyciu się obecnego WakeLock? Może ktoś inny może zapewnić lepszą alternatywę dla ponownego uruchomienia?

Czy są jakieś zalecane dalsze odczyty?

Pewnie. Na razie mogę dodać więcej później:


2
Lepsze wykształcenie dla programistów, aby powiedzieć… „Zwolnij wakelocks, kiedy już z nimi skończysz i posprzątaj po sobie”?
t0mm13b,

3
Głosujcie na mnie za jak zawsze oszałamiającą odpowiedź !!! Nigdy się nie nudzisz, prawda? : D
t0mm13b,

2
Jasne - ale zobacz moje pytanie: wyraźnie NIE pytam o stronę programistyczną, ale z perspektywy użytkownika . Może muszę to uczynić bardziej oczywistym;)
Izzy

1
Znudzony? Czy ktoś może wyjaśnić, jak to jest? XD Nie, zawsze mam coś na myśli. Jeśli czuję, że jest wystarczająco dobry, nawet pytam o to tutaj (zobacz mój profil: nie pytam często), chociaż mogę uzyskać (częściową) odpowiedź. Informacja zwrotna tutaj jest zawsze odświeżająca, jeśli pytanie jest tego warte :)
Izzy

1
Proszę zrób! I zgłoś swoje ustalenia! Właśnie miałem opisany problem z „osieroconym” WakeLocks. Grzebiąc przez godzinę, nie dotarłem dalej, niż zobaczyłem, że to LocationManagerService . Zarejestrowane dla aktualizacji wszystkie 0 sekund (sic!) Było Ustawienia Androida (=: - 0). Wyszedłem z niego, zatrzymałem go, zabiłem z linii poleceń ... nie ma sposobu, aby pozbyć się zamków. WTF czy ustawienia tam zrobiły? Ponowne uruchomienie go rozwiązało, oczywiście - ale czy to jest Windows Phone, który musimy restartować dwa razy dziennie?
Izzy

6

Krótko mówiąc, jest to bardzo dobre pytanie, ale obawiam się, że to więcej niż uzasadnienie dla użytkownika końcowego!

Przeprojektuj jądro, aby wyeliminować blokady wake-up i użyj bardziej dokładnego i skutecznego sposobu zarządzania tą zasadą, tym samym przedłużając żywotność baterii.

Niestety, zostało zaakceptowane jako de facto rozwiązanie umożliwiające „zarządzanie energią”, mimo że nie jest również całkiem wydajne! Odbyła się obszerna dyskusja na temat wakelocków (z Greghiem Kroah Hartmanem - guru Linuksa zajmującym się tworzeniem sterowników - szukam dokładnego linkowania), innymi stronami, takimi jak LWN.net i innym artykułem wyjaśnionym na tej samej stronie tutaj . W tym artykule Gregh Kroah Hartman odniósł się do tego bloga , w którym wydaje się zgadzać z alternatywnym rozwiązaniem zaproponowanym przez Rafaela J. Wysockiego, wiele udokumentował o potencjalnej alternatywie. Nie jestem pewien, czy jest to faktycznie dostępne w bardziej nowoczesnym jądrze v3.xx

Źle zaprojektowane aplikacje mogą i często żądają wakelocków, takich jak utrzymanie ekranu, ale w rzeczywistości w tym scenariuszu utrzymywania ekranu jest skuteczniejszy sposób:

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);

Podczas gdy dążenie do uniknięcia tego od żargonu itp. Dla użytkownika końcowego, tak naprawdę sedno problemu sprowadza się do kodu jądra w sposobie zarządzania wakelockami.

Oto krótkie podsumowanie XDA na temat tego, czym są wakelocks dla niewtajemniczonych. Dzięki zastosowaniu BetterBatteryStats , można było dokładnie zobaczyć, które proces rozładowania akumulatora, wiki jest hostowany na github i jest dostępny na rynku tutaj .


1
Zabawne, że wskazałeś ten sam wątek XDA, o którym wspomniałem. Zgadzam się z Tobą, że system powinien zachować większą ostrożność (np. Poprzez zwolnienie WakeLocks wymaganych przez aplikacje, które już nie działają). I że programiści powinni bardziej uważać na kodowanie (poprzez jawne uwalnianie ich w odpowiednich stanach cyklu życia). Ale to nie pomaga nam użytkownikom wiedzieć . Mam nadzieję, że moja odpowiedź daje wgląd w to, co użytkownik może zrobić - i że jeden z was „techników” może wypełnić lukę!
Izzy

3

Sprawdź Wakelock Detector: XDA-Developers / Google Play :

Detektor Wakelock grupuje wakelocks aplikacji w jeden rozwijany widok dla lepszego wyglądu. I pokazuje, które aplikacje są uruchomione. W rozszerzonym widoku aplikacji znajdują się przyciski informacyjne „Odinstaluj zabijanie”.

Wakelock Detector: szczegóły aplikacji Detektor Wakelock: Wybierz procesy
Kliknij obraz, aby powiększyć. (Źródło: Google Play )

Ujawnienie: Jestem jednym z odpowiedzialnych programistów tej aplikacji. Czterech kolejnych przyjaciół pracuje ze mną jako hobby.


Dziękuję Ci! To naprawdę cenna informacja. Czy mógłbyś dodać więcej szczegółów do swojej odpowiedzi, np. Co czyni ją tak wyjątkową? Dodałbym wtedy zrzuty ekranu. Dopóki tego nie zrobisz: oto link do Playstore do aplikacji ...
Izzy

Dziękuję za szczegóły! Połączyłem je w twoją odpowiedź, mam nadzieję, że nie masz nic przeciwko :) Pytanie zrozumienia: Powiedzmy, że aplikacja wysyła zapytanie o lokalizację w odstępie „0 sekund”. Spowoduje to, że usługa LocationService zablokuje urządzenie. Czy Wake Lock Detector wskaże wówczas odpowiedzialną aplikację jako prawdziwą przyczynę - lub usługę LocationService , ponieważ nie jest częścią tego pakietu aplikacji?
Izzy

Odpowiedź na twoje pytanie brzmi „nie”, ponieważ detektor wakelock grupuje wakelocks, które należą do tej samej nazwy pakietu aplikacji. Ponieważ usługa lokalizacji należy do systemu
operacyjnego

Wielkie dzięki! Miałem nadzieję na łatwe rozwiązanie „Co jeśli to sam system Android?” część. Wygląda na to, że nie ma czegoś takiego - ale jeśli to możliwe, dobrym pomysłem może być integracja z WLD :)
Izzy

2
Dziękuję za twoją opinię, rozważę ją i popracuję nad tym. WLD wygląda dobrze !!! :)
UzumApps,

1

Kilka sposobów, które pomogłyby użytkownikom urządzeń, które nie zostały uruchomione

  1. Widząc, że @Uzumapps, jeden z twórców aplikacji opublikował rozwiązanie przy użyciu Wakelock Detector ( WLD ), jestem zaskoczony, że nie zaktualizował się o używaniu aplikacji, której można również używać bez roota o nazwie Wakelock Detector Light ! Odkryłem, że szukałem rozwiązania dla mojego nowego urządzenia (nieukończonego).

Jest to najnowszy rozwój, dlatego opublikowano go dla użytkowników nieutrojonowanych urządzeń. Testowany jako działający w Moto X Play (Android 6.0.1)

Uwaga: nie mogłem uruchomić drugiej metody, chętnie skorzystam z rozwiązania edycyjnego, które sprawi, że będzie działać dla niezbyt doświadczonych facetów takich jak ja

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.