identyfikować blokady aktywacji utworzone przez inne interfejsy API;

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

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 zdefiniuj maxReportLatencyUs 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:

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

LocationManagerFusedLocationProviderClient 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

_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ę.