Ciągłe częściowe blokady uśpienia

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.
  • 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 do release() 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.
. .