Częściowe blokady uśpienia to mechanizm
Interfejs API PowerManager
który pozwala deweloperom utrzymać działanie procesora po wyłączeniu ekranu urządzenia
(na przykład z powodu przekroczenia limitu czasu systemu lub naciśnięcia przycisku zasilania przez użytkownika). Twoje
aplikacja uzyskuje częściową blokadę uśpienia przez wywołanie
acquire()
z
PARTIAL_WAKE_LOCK
flaga. Częściowa blokada uśpienia stanie się
utknęły, jeśli jest zablokowane przez dłuższy czas, gdy aplikacja jest uruchomiona w
w tle (żadna część aplikacji nie jest widoczna dla użytkownika). Ten stan jest opróżniany
poziom naładowania baterii urządzenia, ponieważ zapobiega ona zasilaniu urządzenia niższym napięciem
stanów. Częściowych blokad uśpienia należy stosować tylko wtedy, gdy jest to konieczne. Należy je uruchamiać jako
gdy nie będą już potrzebne.
Jeśli w aplikacji jest ciągła częściowa blokada uśpienia, możesz skorzystać ze wskazówek na tej stronie aby zdiagnozować i rozwiązać problem.
Wykryj problem
Nie zawsze wiesz, że częściowe blokady uśpienia aplikacji utknęły na stałe. Jeśli aplikacja została już opublikowana, Android Vitals może Ci pomóc zidentyfikować problem.
Android Vitals
Android Vitals może pomóc poprawić wydajność aplikacji, ostrzegając Cię o Konsoli Play, jeśli aplikacja jest ciągłe częściowe blokady uśpienia. Android Vitals zgłasza częściowe blokady uśpienia zatrzymuje się po co najmniej godzinie, podczas częściowego wybudzenia w tle blokada występuje w sesji baterii.
Definicja sesji baterii zależy od wersji platformy.
- W Androidzie 10 sesja baterii to zbiór wszystkich raportów o stanie baterii otrzymane w ciągu danego 24-godzinnego okresu. Raport o stanie baterii odnosi się do między dwoma ładowaniami baterii od poziomu naładowania poniżej 20% do powyżej 80% albo z dowolnego poziomu naładowania do 100%.
- W Androidzie 11 sesja baterii trwa 24 godziny.
Wyświetlana liczba sesji baterii jest sumą danych wszystkich zmierzonych użytkowników z samej aplikacji. Informacje o tym, jak Google Play zbiera dane Android Vitals: Konsola Play dokumentacji.
Gdy dowiesz się, że Twoja aplikacja ma zbyt długie częściowe blokady uśpienia, kolejnym krokiem jest rozwiązanie problemu.
Rozwiąż problem
Blokady uśpienia pojawiły się we wczesnych wersjach platformy Androida, ale ponad dlatego wiele przypadków użycia, które wcześniej wymagały blokady uśpienia, teraz działa przez nowsze interfejsy API, takie jak WorkManager.
Ta sekcja zawiera wskazówki na temat usuwania blokad uśpienia, ale na dłuższą metę rozważ migrację aplikacji, aby była zgodna z zaleceniami w najlepszym metod weryfikacji danych.
Znajdź i popraw miejsca w kodzie, w których pojawia się blokada uśpienia, takie jak połączenia z
newWakeLock(int, String)
lub
WakefulBroadcastReceiver
podklasy. Oto kilka porad:
- Zalecamy umieszczenie nazwy pakietu, klasy lub metody w blokadzie uśpienia.
tak, aby można było łatwo zidentyfikować lokalizację w źródle
na których utworzono blokadę uśpienia. Oto kilka dodatkowych wskazówek:
- W nazwie pomiń wszelkie informacje umożliwiające identyfikację.
takich jak adres e-mail. W przeciwnym razie urządzenie rejestruje
_UNKNOWN
. zamiast nazwy blokady uśpienia. - nie pobieraj nazwy klasy ani metody w sposób zautomatyzowany, na przykład przez
dzwoni do:
getName()
, bo może zostać zaciemniony przez ProGuard. Zamiast niego użyj ciągu znaków. - Do tagów blokady uśpienia nie dodawaj licznika ani unikalnych identyfikatorów. system nie może zebrać informacji o blokadach uśpienia utworzonych przez tę samą ponieważ wszystkie mają unikalne identyfikatory.
- W nazwie pomiń wszelkie informacje umożliwiające identyfikację.
takich jak adres e-mail. W przeciwnym razie urządzenie rejestruje
Upewnij się, że kod zwolnił wszystkie uzyskane blokady uśpienia. To jest jest bardziej skomplikowane niż dbanie o to, aby każde wywołanie
acquire()
ma odpowiednie wywołanie dorelease()
Oto przykład blokady uśpienia, która nie jest wywoływana z powodu niewykrytego wyjątek:Kotlin
@Throws(MyException::class) fun doSomethingAndRelease() { wakeLock.apply { acquire() doSomethingThatThrows() release() // does not run if an exception is thrown } }
Java
void doSomethingAndRelease() throws MyException { wakeLock.acquire(); doSomethingThatThrows(); wakeLock.release(); // does not run if an exception is thrown }
Oto prawidłowa wersja kodu:
Kotlin
@Throws(MyException::class) fun doSomethingAndRelease() { wakeLock.apply { try { acquire() doSomethingThatThrows() } finally { release() } } }
Java
void doSomethingAndRelease() throws MyException { try { wakeLock.acquire(); doSomethingThatThrows(); } finally { wakeLock.release(); } }
Zadbaj o to, aby blokady uśpienia zdejmowały się, gdy tylko przestaną działać niezbędną. Jeśli na przykład używasz blokady uśpienia, aby zezwolić na działanie tła do dokończenia, upewnij się, że wydanie nastąpi po zakończeniu tego zadania. Jeśli blokada uśpienia jest wstrzymywana dłużej niż oczekiwano i nie została zdejmowana, może oznaczać, że zadanie w tle zajmuje więcej czasu niż zwykle.
Po rozwiązaniu problemu w kodzie sprawdź, czy wersje aplikacji prawidłowo się wybudzają można zablokować za pomocą tych narzędzi Androida:
dumpsys – narzędzie , który dostarcza informacji o stanie usług systemowych na urządzeniu. Aby sprawdzić stan usługi zasilania, w tym listę wybudzania zamków, uruchom
adb shell dumpsys power
.Historia baterii – narzędzie analizujące dane wyjściowe błędu Androida raportu w formie wizualnej zdarzenia związane z zasilaniem.
Sprawdzone metody
Ogólnie aplikacja nie powinna unikać częściowych blokad uśpienia, ponieważ zbyt łatwo rozładowować baterię. Android zapewnia alternatywne interfejsy API dla niemal każdego przypadki użycia, które wcześniej wymagały częściowej blokady uśpienia. Pozostał 1 przypadek użycia w przypadku częściowych blokad uśpienia, ekran jest wyłączony. Jeśli używasz blokad uśpienia do uruchamiania zadań, weź pod uwagę rozwiązań alternatywnych opisanych w przewodniku po przetwarzaniu w tle.
Jeśli musisz używać częściowych blokad uśpienia, postępuj zgodnie z tymi zaleceniami:
- Upewnij się, że część aplikacji pozostaje na pierwszym planie. Przykład: jeśli musisz uruchomić usługę, uruchom pierwszy plan . Ten informuje użytkownika, że aplikacja jest nadal uruchomiona.
- Upewnij się, że logika uzyskiwania i usuwania blokad uśpienia jest tak prosta jak to tylko możliwe. Gdy logika blokady uśpienia jest powiązana ze złożonymi maszynami stanowymi, przekroczenie czasu oczekiwania, pule wykonawców i/lub zdarzenia wywołania zwrotnego, dowolny subtelny błąd, może spowodować, że blokada uśpienia będzie trwać dłużej niż zwykle. Te robaki są trudne do zdiagnozowania i debugowania.
Polecane dla Ciebie
- Uwaga: tekst linku wyświetla się, gdy JavaScript jest wyłączony
- Zablokowane klatki
- Uruchamianie testów porównawczych w trybie ciągłej integracji
- Tworzenie i pomiar profili bazowych bez testu porównawczego