Wiele bibliotek i interfejsów API systemu może uzyskiwać blokady wybudzania, które można przypisać do Twojej aplikacji. Może to utrudniać zidentyfikowanie w aplikacji blokady wybudzania, która może powodować problem. Jeśli nieprawidłowo używasz interfejsu API, może to spowodować, że aplikacja będzie zbyt długo utrzymywać blokadę wybudzania, nawet jeśli nie wywołujesz bezpośrednio interfejsów API blokady wybudzania.
W tym dokumencie znajdziesz listę typowych nazw blokad wybudzania, które możesz zobaczyć podczas korzystania z narzędzi do debugowania blokad wybudzania. Możesz też zobaczyć te nazwy w raporcie Android Vitals. W niektórych przypadkach blokada może być utworzona przez bibliotekę lub interfejs API systemu. W innych przypadkach istnieje powód, dla którego narzędzie zaciemnia nazwę blokady wybudzania używaną w aplikacji. Za pomocą narzędzi do debugowania możesz zidentyfikować nieprawidłowo działające blokady wybudzania, a następnie wyszukać nazwę blokady wybudzania w tym dokumencie, aby dowiedzieć się, który interfejs API może powodować problem i jak go rozwiązać.
W tym dokumencie opisujemy sytuacje, w których mogą być tworzone blokady wybudzania. W każdym z tych przypadków blokada może być utworzona przez inną bibliotekę lub interfejs API, ale jest przypisywana do aplikacji, która wywołała ten interfejs API.
AlarmManager
- Dźwięk i multimedia
- Firebase Cloud Messaging (FCM)
- JobScheduler
- Lokalizacja
- WorkManager
_UNKNOWN
: wyświetlane przez narzędzia do debugowania, jeśli nazwa blokady wybudzania zawiera informacje umożliwiające identyfikację osoby.
AlarmManager
AlarmManager
uzyskuje blokady wybudzania i przypisuje je do aplikacji wywołującej. AlarmManager
uzyskuje blokadę wybudzania, gdy włączy się alarm, i zwalnia ją, gdy metoda onReceive()
transmisji alarmu zakończy działanie.
Nazwy blokad wybudzania
AlarmManager
tworzy blokady wybudzania o nazwie *alarm*
. (Gwiazdki są częścią nazwy blokady wybudzania i nie reprezentują symboli wieloznacznych).
Rekomendacja
Aby zoptymalizować działanie alarmu, zalecamy stosowanie tych sprawdzonych metod:
- Użyj
AlarmManager
, aby zoptymalizować częstotliwość planowania alarmów. - Używaj tylko alarmów
RTC_WAKEUP
(które wybudzają urządzenie), gdy jest to konieczne. - Ogranicz używanie alarmów i unikaj wykonywania długotrwałych zadań w metodzie
onReceive()
.
Dźwięk i multimedia
Interfejsy API multimediów mogą uzyskiwać blokady wybudzania podczas nagrywania lub odtwarzania dźwięku. Blokady wybudzania są przypisywane do aplikacji do połączeń.
Nazwy blokad wybudzania
Interfejsy API multimediów uzyskują blokady uśpienia o różnych nazwach, które zaczynają się od Audio
:
AudioBitPerfect
: służy do odtwarzania dźwięku przez USB bez utraty jakości.AudioDirectOut
: służy do odtwarzania dźwięku bez utraty jakości na telewizorze lub specjalnym urządzeniu.AudioDup
: używane do odtwarzania powiadomień podczas połączenia przez Bluetooth lub USB.AudioIn
: używany do nagrywania dźwięku w trybie kamery, gdy mikrofon jest aktywny.AudioMix
: służy do odtwarzania dźwięku na wspólnym urządzeniu.AudioOffload
: używany do długotrwałego odtwarzania tylko muzyki w aplikacjach, które obsługują ten tryb.AudioSpatial
: służy do odtwarzania wielokanałowego dźwięku z filmu lub muzyki na urządzeniach obsługujących dźwięk przestrzenny.AudioUnknown
: używane, gdy inne sytuacje nie mają zastosowania.MmapCapture
: służy do rejestrowania dźwięku z małym opóźnieniem.MmapPlayback
: używany do odtwarzania z niskim opóźnieniem, np. w przypadku gier lub profesjonalnych aplikacji audio.
Rekomendacja
Zalecamy stosowanie tych sprawdzonych metod:
- Nie używaj nazw blokad wybudzania, które zaczynają się od
Audio
. - Jeśli korzystasz z interfejsów API do obsługi multimediów, nie musisz bezpośrednio uzyskiwać blokad wybudzania. Możesz polegać na tym, że interfejsy API uzyskają niezbędne blokady wybudzania.
- Gdy korzystasz z interfejsów API multimediów, zakończ sesję multimedialną, gdy nie jest już potrzebna.
Komunikacja w chmurze Firebase (FCM)
GCM uzyskuje blokadę wybudzania podczas dostarczania do aplikacji transmisji Komunikacji w chmurze Firebase (FCM). Blokada wybudzania jest zwalniana po zakończeniu wykonywania metody transmisji FCMonMessageReceived()
.
Nazwy blokad wybudzania
GCM uzyskuje blokadę wybudzania o nazwie GOOGLE_C2DM
.
Rekomendacja
Aby zoptymalizować działanie FCM, zalecamy stosowanie tych praktyk:
- Optymalizuj częstotliwość dostarczania wiadomości FCM.
- Nie używaj FCM o wysokim priorytecie, chyba że wiadomość rzeczywiście musi zostać dostarczona natychmiast.
- Jak najszybciej wykonaj
onMessageReceived()
. Więcej informacji znajdziesz w wytycznych dotyczących Firebase.
JobScheduler
Zadania JobScheduler uzyskują blokady uśpienia podczas wykonywania zadań w tle. Blokady wybudzania są przypisywane do aplikacji, która utworzyła procesy.
Nazwy blokad wybudzania
Nazwy blokad wybudzania uzyskanych przez JobScheduler zależą od wersji systemu Android, na której są uruchamiane, oraz od celu zadania.
Elementy w nawiasach trójkątnych to zmienne. Na przykład „<package_name>” to nazwa pakietu aplikacji, a nie tekst <package name>
. Jednak *job*
to ciąg znaków
*job*
z gwiazdkami, które nie są używane jako symbole wieloznaczne.
Android 15 i starsze
Zadania zainicjowane przez użytkownika tworzą blokady wybudzania o nazwach zgodnych z tym wzorcem:
*job*u/@<name_space>@/<package_name>/<classname>
Inne zadania korzystające z tego wzorca:
*job*/@<name_space>@/<package_name>/<classname>
Android 16 lub nowszy
Zadania zainicjowane przez użytkownika tworzą blokady wybudzania o nazwach zgodnych z tym wzorcem:
*job*u/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
Zadania priorytetowe mają ten wzorzec:
*job*e/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
Zwykłe zadania korzystają z tego wzorca:
*job*r/@<name_space>@/#<trace_tag>#/<package_name>/<classname>
Przykład
Załóżmy, że istnieje przyspieszone zadanie z przestrzenią nazw backup
i tagiem śledzenia started
. Nazwa pakietu to com.example.app
, a klasa, która utworzyła zadanie, to com.backup.BackupFileService
.
Na urządzeniach z Androidem 15 lub starszym blokada wybudzania będzie się nazywać:
*job*/@backup@/com.example.app/com.backup.BackupFileService
Na urządzeniach z Androidem 16 lub nowszym blokada wybudzania będzie nosić nazwę:
*job*e/@backup@/#started#/com.example.app/com.backup.BackupFileService
Rekomendacja
Sprawdź, jak korzystasz z zadań JobScheduler. W szczególności postępuj zgodnie z naszymi wskazówkami dotyczącymi optymalizacji wykorzystania baterii w przypadku interfejsów API do planowania zadań.
Lokalizacja
LocationManager
i FusedLocationProviderClient
używają blokad wybudzania, aby uzyskiwać i przekazywać lokalizację urządzenia. Blokady wybudzania są przypisywane do aplikacji, która wywołała te interfejsy API.
Nazwy blokad wybudzania
Usługi lokalizacyjne mają te nazwy:
CollectionLib-SigCollector
NetworkLocationLocator
NetworkLocationScanner
NlpCollectorWakeLock
NlpWakeLock
*location*
Rekomendacja
Optymalizacja korzystania z lokalizacji Możesz na przykład ustawić limity czasu, grupować żądania lokalizacji lub korzystać z pasywnych aktualizacji lokalizacji.
WorkManager
Instancje robocze WorkManager uzyskują blokady uśpienia podczas wykonywania zadań w tle. Blokady wybudzania są przypisywane do aplikacji, która utworzyła procesy.
Nazwy blokad wybudzania
Nazwy blokad uśpienia uzyskanych przez WorkManager zależą od wersji systemu Android, na której działają.
Android 15 i starsze
Zadania WorkManager tworzą blokady wybudzania o nazwach zgodnych z tym wzorcem:
*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Android 16 lub nowszy
Przyspieszone zadania tworzą blokady wybudzania o nazwach zgodnych z tym wzorcem:
*job*e/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Zwykłe zadania są zgodne z tym wzorcem:
*job*r/#<trace_tag>#/<package_name>/androidx.work.impl.background.systemjob.SystemJobService
Domyślnie nazwa instancji roboczej to <trace_tag>
.
Przykład
Załóżmy, że istnieje pracownik z usługą ekspresową o imieniu BackupFileWorker
. Nazwa pakietu to com.example.app
.
Na urządzeniach z Androidem 15 lub starszym blokada wybudzania będzie się nazywać:
*job*/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
Na urządzeniach z Androidem 16 lub nowszym blokada wybudzania będzie nosić nazwę:
*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
Rekomendacja
Sprawdź wykorzystanie procesów WorkManager. W szczególności postępuj zgodnie z naszymi wskazówkami dotyczącymi optymalizacji wykorzystania baterii w przypadku interfejsów API do planowania zadań.
_UNKNOWN
Jeśli narzędzia do debugowania uznają, że nazwa blokady wybudzania zawiera informacje umożliwiające identyfikację, nie wyświetlają jej. Zamiast tego oznaczają blokadę wybudzania jako _UNKNOWN
. Narzędzia mogą to robić, jeśli nazwa blokady wybudzania zawiera adres e-mail.
Rekomendacja
Stosuj sprawdzone metody nazewnictwa blokad wybudzania i unikaj używania w nazwie blokady wybudzania informacji umożliwiających identyfikację użytkowników. Jeśli znajdziesz blokadę wybudzania o nazwie _UNKNOWN
przypisaną do Twojej aplikacji, spróbuj zidentyfikować, która to blokada, i nadaj jej inną nazwę.