Gestione alimentazione

Android 9 (livello API 28) introduce nuove funzionalità per migliorare la gestione dell'alimentazione dei dispositivi. Queste modifiche, insieme alle funzionalità già presenti nelle versioni precedenti, contribuiscono a garantire che le risorse di sistema vengano assegnate alle app che ne hanno più bisogno.

Le funzionalità di gestione dell'alimentazione rientrano in due categorie:

Bucket app in standby
Il sistema limita l'accesso delle app alle risorse del dispositivo come la CPU o la batteria, in base ai modelli di utilizzo dell'utente. Questa è una nuova funzionalità per Android 9.
Miglioramenti al risparmio energetico
Quando la funzionalità di risparmio energetico è attiva, il sistema applica limitazioni a tutte le app. Si tratta di una funzionalità esistente migliorata con Android 9.

Bucket app standby

Android 9 introduce una nuova funzionalità di gestione della batteria, i bucket di standby delle app. I bucket di standby delle app consentono al sistema di dare priorità alle richieste di risorse delle app in base a quanto recentemente e alla frequenza di utilizzo delle app. In base ai modelli di utilizzo, ogni app viene inserita in uno dei cinque bucket di priorità. Il sistema limita le risorse del dispositivo disponibili per ogni app in base al bucket in cui si trova l'app.

I cinque bucket danno la priorità alle app in gruppi in base alle seguenti caratteristiche:

Attivo

Un'app è nel bucket attivo se l'utente la sta utilizzando, ad esempio:

  • L'app ha avviato un'attività
  • L'app esegue un servizio in primo piano
  • L'app ha un adattatore di sincronizzazione associato a un fornitore di contenuti utilizzato da un'app in primo piano
  • L'utente fa clic su una notifica dall'app

Se un'app si trova nel bucket attivo, il sistema non applica alcuna limitazione ai job, agli allarmi o ai messaggi FCM dell'app.

Set da lavoro

Un'app si trova nel bucket del set di lavoro se viene eseguita spesso, ma al momento non è attiva. Ad esempio, è probabile che un'app di social media che l'utente lancia la maggior parte dei giorni si trovi nel set operativo. Le app vengono anche promosse nel bucket del set di lavoro se usate indirettamente.

Se un'app è nel set operativo, il sistema impone lievi restrizioni alla sua capacità di eseguire job e attivare allarmi. Per maggiori dettagli, consulta Limitazioni della gestione dell'alimentazione.

Spesso

Un'app si trova nel bucket frequente se viene utilizzata regolarmente, ma non necessariamente ogni giorno. Ad esempio, un'app di monitoraggio dell'allenamento che l'utente corre in palestra potrebbe trovarsi nel bucket frequente.

Se un'app si trova nel bucket frequente, il sistema impone restrizioni più forti alla sua capacità di eseguire job e attivare allarmi, oltre a imporre un limite ai messaggi FCM ad alta priorità. Per maggiori dettagli, consulta Limitazioni della gestione dell'alimentazione.

Rara

Un'app si trova nel bucket raro se non viene utilizzata spesso. Ad esempio, un'app di hotel che l'utente esegue solo mentre si trova in quell'hotel potrebbe rientrare nella categoria rara.

Se un'app si trova nel bucket raro, il sistema impone restrizioni rigide sulla sua capacità di eseguire job, attivare allarmi e ricevere messaggi FCM ad alta priorità. Il sistema limita anche la capacità dell'app di connettersi a internet. Per maggiori dettagli, consulta Limitazioni della gestione dell'alimentazione.

Mai

Le app che sono state installate ma mai eseguite vengono assegnate al bucket "mai". Il sistema impone gravi restrizioni a queste app.

Il sistema assegna dinamicamente ogni app a un bucket di priorità e riassegna le app in base alle esigenze. Il sistema potrebbe basarsi su un'app precaricata che utilizza il machine learning per determinare la probabilità di utilizzo di ogni app e assegna le app ai bucket appropriati. Se l'app di sistema non è presente su un dispositivo, per impostazione predefinita il sistema ordina le app in base a quanto recentemente sono state utilizzate. Alle app più attive vengono assegnate una priorità maggiore alle app, il che rende disponibili per l'app più risorse di sistema. In particolare, il bucket determina la frequenza di esecuzione dei job dell'app, la frequenza con cui l'app può attivare sveglie e la frequenza con cui l'app può ricevere messaggi Firebase Cloud Messaggi (FCM) con priorità elevata. Queste limitazioni si applicano solo quando il dispositivo è alimentato a batteria; il sistema non impone queste limitazioni alle app mentre il dispositivo è in carica.

Ogni produttore può impostare i propri criteri per l'assegnazione delle app non attive ai bucket. Non cercare di influenzare il bucket a cui è assegnata la tua app. Cerca invece di assicurarti che l'app funzioni bene in qualsiasi bucket in cui si trovi. La tua app può scoprire in quale bucket si trova attualmente chiamando il nuovo metodo UsageStatsManager.getAppStandbyBucket().

best practice

Se la tua app segue già le best practice per Sospensione e standby app, la gestione delle nuove funzionalità di gestione dell'alimentazione non dovrebbe essere difficile. Tuttavia, alcuni comportamenti delle app che in precedenza funzionavano bene ora potrebbero causare problemi.

  • Non provare a manipolare il sistema per inserire la tua app in un bucket o in un altro. I metodi di bucketing del sistema possono cambiare e ogni produttore di dispositivi può scegliere di scrivere la propria app di bucket con il proprio algoritmo. Assicurati invece che l'app si comporti correttamente, indipendentemente dal bucket in cui si trova.
  • Se un'app non ha un'attività di avvio applicazioni, potrebbe non essere mai promossa al bucket attivo. Potresti voler riprogettare la tua app per avere un'attività di questo tipo.
  • Se non è possibile agire sulle notifiche dell'app, gli utenti non potranno attivare la promozione dell'app nel bucket attivo interagendo con le notifiche. In questo caso, potresti voler riprogettare alcune notifiche appropriate in modo che consentano una risposta da parte dell'utente. Per alcune linee guida, consulta la sezione Modelli di progettazione delle notifiche di Material Design.
  • Analogamente, se l'app non mostra una notifica alla ricezione di un messaggio FCM con priorità elevata, non darà all'utente la possibilità di interagire con l'app e quindi di promuoverla nel bucket attivo. Infatti, l'unico utilizzo previsto per i messaggi FCM con priorità elevata è quello di inviare una notifica all'utente, quindi questa situazione non dovrebbe mai verificarsi. Se contrassegni in modo inappropriato un messaggio FCM come priorità elevata quando non attiva l'interazione dell'utente, possono verificarsi altre conseguenze negative; ad esempio, la tua app può esaurire la propria quota e comportare il trattamento dei messaggi FCM realmente urgenti come priorità normale.

    Nota: se l'utente ignora ripetutamente una notifica, il sistema offre all'utente la possibilità di bloccarla in futuro. Non inviare spam all'utente con notifiche solo per cercare di mantenere l'app nel bucket attivo.

  • Se le app sono suddivise in più pacchetti, questi potrebbero trovarsi in bucket diversi e, di conseguenza, avere livelli di accesso diversi. Devi assicurarti di testare queste app con i pacchetti assegnati ai vari bucket per assicurarti che funzionino correttamente.

Miglioramenti al risparmio energetico

Android 9 apporta una serie di miglioramenti alla modalità di risparmio energetico. Il produttore del dispositivo stabilisce le restrizioni precise imposte. Ad esempio, alle build AOSP il sistema applica le seguenti limitazioni:

  • Il sistema imposta le app in modalità standby delle app in modo più aggressivo, invece di attendere che le app siano inattive.
  • I limiti di esecuzione in background si applicano a tutte le app, indipendentemente dal livello API target.
  • I servizi di geolocalizzazione potrebbero essere disattivati quando lo schermo non è attivo.
  • Le app in background non hanno accesso alla rete.

Inoltre, ci sono altre ottimizzazioni dell'alimentazione specifiche per i dispositivi. Per i dettagli completi, consulta la pagina che descrive le limitazioni relative alla gestione dell'alimentazione.

Come sempre, ti consigliamo di testare l'app quando il risparmio energetico è attivo. Puoi attivare il risparmio energetico manualmente dalla schermata Impostazioni > Risparmio batteria del dispositivo.

Test e risoluzione dei problemi

Le nuove funzionalità di gestione dell'alimentazione interessano tutte le app eseguite sui dispositivi Android 9, indipendentemente dal fatto che abbiano o meno Android 9. È importante verificare che l'app funzioni correttamente su questi dispositivi.

Assicurati di testare i casi d'uso principali della tua app in diverse condizioni, per vedere come le funzionalità di gestione dell'alimentazione interagiscono tra loro. Puoi utilizzare i comandi Android Debug Bridge per attivare e disattivare alcune delle funzionalità.

Comandi Android Debug Bridge

Puoi utilizzare i comandi della shell Android Debug Bridge per testare diverse funzionalità di gestione dell'alimentazione.

Per informazioni sull'utilizzo di ADB per attivare la modalità Sospensione del dispositivo, consulta Test con sospensione e standby delle app.

Bucket app standby

Puoi utilizzare ADB per assegnare manualmente l'app a un bucket standby per app. Per modificare il bucket di un'app, utilizza il seguente comando:

$ adb shell am set-standby-bucket packagename active|working_set|frequent|rare

Puoi utilizzare lo stesso comando anche per impostare più pacchetti contemporaneamente:

$ adb shell am set-standby-bucket package1 bucket1 package2 bucket2...

Per verificare in quale bucket si trova un'app, esegui

$ adb shell am get-standby-bucket [packagename]

Se non passi un parametro packagename, il comando elenca i bucket per tutte le app. Un'app può anche individuare il proprio bucket in fase di runtime chiamando il nuovo metodo UsageStatsManager.getAppStandbyBucket().

Risparmio energetico

Esistono diversi comandi per testare il comportamento dell'app in condizioni di basso consumo.

Per simulare lo scollegamento del dispositivo, utilizza il comando

$ adb shell dumpsys battery unplug

Per testare il comportamento del dispositivo in condizioni di bassa potenza, utilizza questo comando:

$ adb shell settings put global low_power 1

Una volta terminato il test, puoi annullare le impostazioni manuali del dispositivo con questo comando:

$ adb shell dumpsys battery reset