Wiele bibliotek i interfejsów API systemu może uzyskiwać blokady wybudzania, które można przypisać do Twojej aplikacji. Może to utrudniać identyfikację blokady wybudzania w aplikacji, 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 sytuacjach, w których blokada wybudzania jest uzyskiwana przez inne interfejsy API, unikaj ręcznego uzyskiwania 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 z danych. W niektórych przypadkach blokada może być utworzona przez bibliotekę lub interfejs API systemu. W innych przypadkach narzędzie może 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ć ich nazwy 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
- Bluetooth
- Czujniki urządzenia
- 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()
w ramach transmisji alarmu zakończy działanie.
Nazwy blokad wybudzania
AlarmManager
tworzy blokady wybudzania o nazwie *alarm*
. (Gwiazdki są częścią nazwy blokady wybudzania, nie są symbolami wieloznacznymi).
Rekomendacja
Aby zoptymalizować działanie alarmu, zalecamy stosowanie tych sprawdzonych metod:
- Użyj
AlarmManager
, aby zoptymalizować częstotliwość planowania alarmów. - Używaj alarmów typu
RTC_WAKEUP
(które wybudzają urządzenie) tylko wtedy, 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
: służy 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żywany, gdy inne sytuacje nie mają zastosowania.MmapCapture
: służy do rejestrowania dźwięku z niskimi opóźnieniami.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.
Bluetooth
Interfejsy API Bluetooth platformy nie mają żadnych blokad wybudzania przypisanych do aplikacji podczas wykonywania działań Bluetooth. Aby sprawdzić, czy przesyłanie danych przez Bluetooth odbywa się w tle, zaplanuj zadanie za pomocą WorkManagera.
Rekomendacja
- Używaj parowania urządzenia towarzyszącego, aby sparować urządzenia Bluetooth i uniknąć ręcznego blokowania wybudzania podczas parowania Bluetooth.
- Zapoznaj się z wskazówkami dotyczącymi komunikacji w tle, aby dowiedzieć się, jak prowadzić komunikację Bluetooth w tle.
- Jeśli ręczne blokowanie wybudzenia jest konieczne, blokuj wybudzenie tylko na czas działania Bluetootha.
Czujniki urządzenia
Dane z czujników urządzenia, takie jak liczba kroków, dane z akcelerometru lub żyroskopu, można śledzić na kilka sposobów.
W Wear OS używaj Usług zdrowotnych Wear, aby pobierać dane z urządzenia, takie jak wysokość, tętno i przebyta odległość.
Jeśli dane są zbierane przez inne aplikacje, możesz użyć Health Connect w połączeniu z WorkManagerem, aby je pobrać.
W przypadku scenariuszy takich jak śledzenie różnicy w liczbie kroków lub przebytej odległości możesz użyć interfejsu Recording API na urządzeniu mobilnym w połączeniu z WorkManagerem, aby pobrać dane.
W niektórych sytuacjach może być potrzebne śledzenie danych z czujników urządzenia za pomocą funkcji SensorManager
. SensorManager
nie uzyskuje blokad wybudzania w imieniu aplikacji, chyba że czujnik jest czujnikiem wybudzania, który można zidentyfikować za pomocą interfejsu isWakeUpSensor
API.
Rekomendacja
Korzystanie z czujników do rejestrowania danych z wysoką częstotliwością próbkowania może znacznie wyczerpywać baterię. Oto rekomendacje, które pomogą zmniejszyć zużycie baterii i użycie blokad uśpienia:
- Jeśli śledzisz liczbę kroków lub przebyty dystans, użyj interfejsu Recording API, aby rejestrować dane w sposób oszczędzający baterię.
- W przypadku pasywnego śledzenia danych z czujników na Wear OS używaj Usług zdrowotnych Wear, aby zoptymalizować zużycie baterii.
- Zmniejsz częstotliwość czujnika do wartości poniżej 200 Hz.
- Podczas rejestrowania czujnika w
SensorManager
zdefiniujmaxReportLatencyUs
dłuższy niż 30 sekund, aby używać logiki przetwarzania wsadowego czujników i zmniejszyć liczbę przerwań odbieranych przez aplikację. - Unikaj długotrwałego blokowania wybudzania przez cały czas śledzenia danych z czujników. Zamiast tego planuj alarmy za pomocą interfejsu AlarmManager, aby odpytywać czujniki co najmniej co 30 sekund.
Komunikacja w chmurze Firebase (FCM)
Blokada wybudzania jest uzyskiwana podczas dostarczania do aplikacji komunikatu z Komunikacji w chmurze Firebase (FCM). Blokada wybudzania jest zwalniana po zakończeniu wykonywania metody onMessageReceived()
komunikatu FCM.
Nazwy blokad wybudzania
Blokada wybudzania jest uzyskiwana pod nazwą 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ść musi zostać dostarczona natychmiast.
- Jak najszybciej przeprowadź
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 wykorzystania lokalizacji Możesz na przykład ustawić limity czasu, grupować żądania lokalizacji lub korzystać z pasywnych aktualizacji lokalizacji.
- Jeśli używasz interfejsów API lokalizacji, nie musisz bezpośrednio uzyskiwać blokad wybudzania. Możesz polegać na interfejsach API, które uzyskają niezbędne blokady wybudzania.
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ła.
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 o przyspieszonym trybie pracy 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, które korzystają z WorkManager 2.10.0+
, blokada wybudzania będzie miała nazwę:
*job*e/#BackupFileWorker#/com.example.app/androidx.work.impl.background.systemjob.SystemJobService
Rekomendacja
- Uaktualnij wersję WorkManagera, aby tagi blokady wybudzania były bardziej szczegółowe na Androidzie 16 lub nowszym.
- 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ę.