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 fornite 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. Si tratta di una nuova funzionalità per Android 9.
Miglioramenti al risparmio energetico
Quando il risparmio energetico è attivo, il sistema applica limitazioni a tutte le app. Questa è una funzionalità esistente migliorata con Android 9.

Bucket app in standby

Android 9 introduce una nuova funzionalità di gestione della batteria: i bucket in standby delle app. I bucket di app standby 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 pattern di utilizzo, ogni app viene inserita in uno dei cinque bucket di priorità. Il sistema limita le risorse del dispositivo disponibili per ciascuna 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 si trova 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 restrizioni ai processi, agli allarmi o ai messaggi FCM dell'app.

Insieme di 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 inoltre promosse nel bucket del set di lavoro se usate indirettamente.

Se un'app è nel set di lavoro, il sistema impone lievi limitazioni alla sua capacità di eseguire job e attivare allarmi. Per maggiori dettagli, consulta Limitazioni relative alla 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 esegue in palestra potrebbe trovarsi nel bucket frequente.

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

Rara

Un'app si trova nel bucket raro se non viene utilizzata spesso. Ad esempio, un'app per hotel che l'utente esegue solo mentre soggiorna presso l'hotel potrebbe essere nel bucket raro.

Se un'app si trova nel bucket raro, il sistema impone restrizioni rigide alla 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 relative alla gestione dell'alimentazione.

Mai

Le app che sono state installate ma mai eseguite vengono assegnate al bucket Never. Il sistema impone gravi limitazioni 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 affidarsi a un'app precaricata che utilizza il machine learning per determinare la probabilità di utilizzo di ciascuna 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 sono state utilizzate di recente. Le app più attive vengono assegnate ai bucket che danno alle app una priorità maggiore, 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 le sveglie e la frequenza con cui l'app può ricevere messaggi Firebase Cloud Messaggi (FCM) ad alta priorità. Queste limitazioni vengono applicate soltanto 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 ai bucket delle app non attive. Non provare a influenzare il bucket a cui è assegnata la tua app. Cerca invece di assicurarti che l'app si comporti 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 prima funzionavano bene ora possono causare problemi.

  • Non provare a manipolare il sistema per inserire la tua app in un bucket o in un altro. I metodi di bucket di bucket 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 in modo appropriato, 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 in modo che abbia un'attività di questo tipo.
  • Se non è possibile intervenire sulle notifiche dell'app, gli utenti non potranno attivare la promozione dell'app nel bucket attivo interagendo con le notifiche. In questo caso, potrebbe essere opportuno riprogettare alcune notifiche appropriate in modo che consentano una risposta da parte dell'utente. Per alcune linee guida, consulta la sezione Motivi 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. Di fatto, l'unico utilizzo previsto per i messaggi FCM con priorità elevata è inviare una notifica all'utente, quindi questa situazione non dovrebbe mai verificarsi. Se contrassegni in modo inappropriato un messaggio FCM con priorità elevata quando non attiva l'interazione dell'utente, potrebbero verificarsi altre conseguenze negative. Ad esempio, l'app potrebbe esaurire la propria quota, facendo sì che i messaggi FCM davvero urgenti vengano trattati come priorità normale.

    Nota: se l'utente ignora più volte una notifica, il sistema offre all'utente la possibilità di bloccarla in futuro. Non inviare notifiche indesiderate all'utente 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, quindi, avere livelli di accesso diversi. Devi assicurarti di testare queste app con i pacchetti assegnati a 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 determina le restrizioni precise imposte. Ad esempio, sulle build AOSP, il sistema applica le seguenti limitazioni:

  • Il sistema attiva la modalità standby delle app in modo più rigoroso, 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 informazioni dettagliate, consulta la pagina che descrive le limitazioni relative alla gestione dell'alimentazione.

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

Test e risoluzione dei problemi

Le nuove funzionalità di gestione dell'alimentazione interessano tutte le app eseguite su dispositivi Android 9, indipendentemente dal fatto che abbiano o meno come target Android 9. È importante assicurarsi 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 di Android Debug Bridge per attivare e disattivare alcune funzionalità.

Comandi Android Debug Bridge

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

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

Bucket app in standby

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

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

Puoi utilizzare questo 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 trovare il proprio bucket in fase di runtime chiamando il nuovo metodo UsageStatsManager.getAppStandbyBucket().

Risparmio energetico

Esistono diversi comandi per testare il comportamento della tua app in condizioni di consumo ridotto.

.

Per simulare lo scollegamento del dispositivo, utilizza il comando

$ adb shell dumpsys battery unplug

Per verificare 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