Identificare i blocchi di riattivazione creati da altre API

Diverse librerie e API di sistema possono acquisire blocchi di attivazione attribuibili alla tua app. Ciò può rendere difficile identificare un blocco di attivazione nell'app che potrebbe causare un problema. Se utilizzi impropriamente un'API, la tua app potrebbe mantenere un blocco di attivazione per troppo tempo, anche se non chiami direttamente le API di blocco di attivazione.

Questo documento elenca alcuni nomi comuni di blocco attivazione che potresti visualizzare quando utilizzi gli strumenti di debug dei blocchi attivazione. Potresti anche vedere questi nomi in un report di Android vitals. In alcuni casi, il blocco di attivazione potrebbe essere stato creato da una libreria o da un'API di sistema. In altri casi, c'è un motivo per cui lo strumento offusca il nome del blocco di attivazione che utilizzi nell'app. Puoi utilizzare gli strumenti di debug per identificare i blocchi di attivazione che non funzionano correttamente, quindi cercare il nome del blocco di attivazione in questo documento per identificare l'API che potrebbe causare il problema e come risolverlo.

Questo documento illustra i seguenti nomi di blocco risveglio. In ogni caso, anche se il blocco di attivazione potrebbe essere creato da un'altra libreria o API, il blocco viene attribuito all'app che ha chiamato l'API.

*alarm*

Questo blocco di attivazione viene acquisito da AlarmManager e attribuito all'app chiamante. AlarmManager acquisisce il blocco di attivazione quando la sveglia suona e lo rilascia al termine dell'esecuzione del metodo onReceive() di trasmissione della sveglia.

Consiglio

Per ottimizzare il comportamento delle sveglie, ti consigliamo di seguire le seguenti best practice:

  • Usa AlarmManager per ottimizzare la frequenza di programmazione della sveglia.
  • Utilizza le sveglie RTC_WAKEUP (che riattivano il dispositivo) solo se necessario.
  • Riduci al minimo l'uso degli avvisi ed evita di svolgere operazioni lunghe nel metodo onReceive().

AudioIn, AudioMix e così via.

Vari blocchi di attivazione i cui nomi iniziano con Audio vengono acquisiti dalle API multimediali durante la registrazione o la riproduzione dell'audio. I blocchi di attivazione vengono attribuiti all'app di chiamata.

AudioIn viene acquisito durante l'acquisizione di AudioRecord in modalità videocamera, mentre il microfono è attivo. AudioMix viene acquisito durante la riproduzione di AudioTrack sul dispositivo. Altre API multimediali potrebbero acquisire blocchi di attivazione con altri nomi che iniziano con Audio.

Consiglio

Ti consigliamo le seguenti pratiche:

  • Non utilizzare nomi di blocco risveglio che iniziano con Audio.
  • Se utilizzi le API multimediali, non dovresti dover acquisire direttamente i blocchi di attivazione. Puoi fare affidamento sulle API per acquisire i blocchi di attivazione necessari per te.
  • Quando utilizzi le API multimediali, termina la sessione multimediale quando non ti serve più.

GOOGLE_C2DM

Questo blocco di attivazione viene acquisito da GCM durante l'invio di una trasmissione Firebase Cloud Messaging (FCM) all'app. Il blocco di attivazione viene rilasciato al termine dell'esecuzione del metodo di trasmissione FCM onMessageReceived().

Consiglio

Per ottimizzare il comportamento di FCM, ti consigliamo le seguenti best practice:

  • Ottimizza la frequenza di invio di FCM.
  • Non utilizzare FCM ad alta priorità, a meno che il messaggio non debba essere effettivamente recapitato immediatamente.
  • Completa il metodo onMessageReceived() il più rapidamente possibile. Per ulteriori informazioni, consulta le linee guida di Firebase.

*job*/<package_name>/<package_and_job_name>

Questi blocchi di riattivazione vengono utilizzati dai job JobScheduler durante l'esecuzione di attività in background. I blocchi di attivazione vengono attribuiti all'app che ha creato i worker.

"<package_name>" è il nome del pacchetto dell'app, non il testo letterale <package name>. Allo stesso modo, "<package_and_job_name>" è il nome del pacchetto seguito dal nome del job. *job* è la sequenza di caratteri *job*, con asterischi; gli asterischi non vengono utilizzati come caratteri jolly. Ecco un esempio di nome di blocco di attivazione:

*job*/com.example.app/com.example.app.example.path.ExampleJobService

Consiglio

Controlla l'utilizzo delle attività di JobScheduler. In particolare, segui le nostre indicazioni per ottimizzare l'utilizzo della batteria per le API di pianificazione delle attività.

*job*/<package_name>/androidx.work.impl.background.systemjob.SystemJobService

Questi wakelock vengono utilizzati dai worker di WorkManager durante l'esecuzione di attività in background. I blocchi di attivazione vengono attribuiti all'app che ha creato i worker.

"<package_name>" è il nome del pacchetto dell'app, non il testo letterale <package name>. *job* è la sequenza di caratteri *job*, con asterischi; gli asterischi non vengono utilizzati come caratteri jolly.

Consiglio

Controlla l'utilizzo dei worker di WorkManager. In particolare, segui le nostre indicazioni per ottimizzare l'utilizzo della batteria per le API di pianificazione delle attività.

NetworkLocationLocator, FusedLocation e *location*

Questi nomi di blocco risveglio vengono utilizzati da LocationManager e FusedLocationProviderClient per acquisire e fornire la posizione del dispositivo. I blocchi di riattivazione vengono attribuiti all'app che ha chiamato queste API.

Consiglio

Ottimizza l'utilizzo della posizione. Ad esempio, imposta timeout, richieste di posizione collettive o utilizza aggiornamenti della posizione passivi.

_UNKNOWN

Se gli strumenti di debug ritengono che il nome di un blocco di attivazione contenga informazioni che consentono l'identificazione personale (PII), non mostrano il nome effettivo del blocco di attivazione. ma contrassegnano il blocco sveglia come _UNKNOWN. Ad esempio, gli strumenti potrebbero farlo se il nome della serratura di riattivazione contiene un indirizzo email.

Consiglio

Segui le best practice per la denominazione dei wakelock ed evita di utilizzare PII nel nome del wakelock. Se trovi un blocco di attivazione denominato _UNKNOWN attribuito alla tua app, prova a identificare di quale blocco di attivazione si tratta e assegnagli un nome diverso.