Ibernazione dell'app

Un utente Android medio installa più di 50 app sui propri dispositivi (il numero aumenta con l'aumentare del livello di RAM dei dispositivi). Tuttavia, un numero significativo di queste app rimane inutilizzato dall'utente per un lungo periodo di tempo.

La modalità di sospensione delle app mette in sospensione le app che l'utente non utilizza per alcuni mesi, in modo simile alla revoca automatica delle autorizzazioni. L'app viene interrotta forzatamente e messa in uno stato in cui viene eseguita l'ottimizzazione per lo spazio di archiviazione anziché per il rendimento. Anche la revoca automatica delle autorizzazioni è inclusa in questo stato e condivide la stessa impostazione di esenzione in Impostazioni. Un'app interrotta forzatamente non esegue job o avvisi in background e non è in grado di inviare notifiche push. Quando l'utente utilizza nuovamente l'app, questa esce dalla modalità di ibernazione e job/avvisi/notifiche vengono nuovamente eseguite come al solito. Tutti i job/avvisi/notifiche che sono stati pianificati prima che l'app andasse in modalità di ibernazione devono essere riprogrammati.

Gli OEM che modificano la piattaforma potrebbero essere in conflitto con l'implementazione della sospensione delle app. Ad esempio

  • La modifica della definizione di utilizzo dell'app o l'introduzione di metodi per riattivare un'app che non sono presenti in AOSP potrebbe interrompere l'accuratezza della sospensione dell'app
  • Il meccanismo di limitazione proprietario di un OEM, simile alla ibernazione delle app, potrebbe avere uno scopo simile. Sebbene possano esistere entrambi, potrebbe esserci una sovrapposizione.

Il CDD definisce un nuovo insieme di requisiti per le modifiche basate sull'utilizzo dell'app, simile al requisito 3.5.1 esistente. L'ibernazione delle app segue questi requisiti.

Il codice del framework si trova in:

La logica del criterio si trova in:

  • repository: platform/packages/modules/Permission
  • directory: PermissionController/src/com/android/permissioncontroller/hibernation

Architettura di alto livello

Il servizio di sistema di ibernazione delle app ottimizza le app usate di rado di un utente per l'archiviazione e ne impedisce l'esecuzione in background. Per ottenere questi risultati, quando mettiamo in sospensione un'app, in particolare:

  • Revoca automaticamente le autorizzazioni
  • Forza l'interruzione dell'app
  • Elimina i file ODEX e VDEX
  • Svuotare la cache dell'app

Il nostro obiettivo è implementare la modalità di ibernazione come azione reversibile, in modo che l'app sia ancora disponibile per l'utente tramite Avvio app e altre piattaforme con dati dell'app intatti. Al momento dell'avvio dell'app, la ripristineremo dallo stato di interruzione forzata e continueremo con la creazione dei file ODEX e VDEX come di consueto.

Il design pianificato si basa su due parti principali:

  • Determinare quando un pacchetto deve andare in ibernazione
  • Ottimizzazione del pacchetto in ibernazione

Un nuovo servizio di sistema, AppHibernationService e un servizio job, AppHibernationJobService, inPermissionController, sono il collante che controlla la logica e il processo decisionale complessivi.

La determinazione del momento in cui un pacchetto deve andare in ibernazione è incentrata principalmente su UsageStatsService e gestita da AppHibernationJobServicein PermissionController. Questa logica di criteri si trova in PermissionControllerper consentirci di aggiornarci dinamicamente tramite Mainline. Inoltre, prevediamo di aggiungere un nuovo indicatore, l'utilizzo dei componenti, per acquisire l'utilizzo dei componenti del pacchetto (ad esempio servizi, fornitori di contenuti) come nuova metrica in UsageStatsService.

L'ottimizzazione di un pacchetto è il momento in cui si verificano tutti i risparmi e le ottimizzazioni effettivi. AppHibernationService comunica con varie parti del sistema per interrompere il pacchetto, eliminare i dati della cache, eliminare gli elementi ART e così via. La revoca dell'autorizzazione viene avviata direttamente da AppHibernationJobService per mantenere la funzionalità di revoca automatica sui dispositivi con Android 11 e versioni precedenti.

Esperienza utente

L'utente riceve informazioni e controlli sulle app che possono essere messe in sospensione.

Come per la revoca automatica, l'utente riceve una notifica sulle app messe in ibernazione e ha la possibilità di andare alle Impostazioni direttamente dalla notifica per aprire l'app e riattivarla o eliminare l'app inutilizzata, se necessario.

Continueremo a supportare l'intenzione dello sviluppatore di chiedere all'utente un'esenzione dalla modalità di sospensione con l'intenzione di esenzione dalla revoca automatica delle autorizzazioni esistente.

Compatibilità con le versioni precedenti

Le funzionalità specifiche per la sospensione sono disponibili a partire da Android 12. Questa funzionalità non poteva funzionare nelle versioni precedenti perché i componenti della piattaforma (ad esempio il nuovo servizio di sistema) non sono presenti. La revoca automatica continua a funzionare come implementata per le versioni precedenti del sistema operativo.

A partire da Android 12, per garantire la compatibilità con le versioni precedenti, viene aggiunto un pulsante di attivazione/disattivazione della modalità di sospensione nella pagina dell'app in App e notifiche in Impostazioni, mantenendo al contempo il pulsante di attivazione/disattivazione dell'annullamento automatico originale nel sottomenu Autorizzazioni. Questo pulsante di attivazione/disattivazione controlla l'esenzione complessiva del sistema di ibernazione dell'app per l'app.

Personalizzazione

Parte dell'implementazione fa parte del componente del sistema modulare, pertanto ai partner viene sconsigliato di modificare la funzionalità. I partner possono invece implementare funzionalità o funzionalità simili, purché rispettino i requisiti del CDD.

La sospensione delle app deve essere attivata per impostazione predefinita per tutte le app destinate ad Android 11 o versioni successive. Equivale alla revoca automatica delle autorizzazioni. Anche se l'impostazione stessa può essere attivata, l'implementazione della sospensione dell'app può variare da un'app all'altra in base al target Android 11 o Android 12. Nello specifico, la modalità di ibernazione delle app funziona solo per le app destinate ad Android 11, mentre si tratta essenzialmente della revoca automatica delle app destinate ad Android 12.

Inoltre, gli OEM potrebbero implementare una funzionalità simile. Tuttavia, queste funzionalità sono destinate a un periodo di tempo molto più breve per le ottimizzazioni della batteria, che possono essere specifiche per l'OEM. Eventuali funzionalità di limitazione delle app simili sviluppate dagli OEM possono coesistere con il sistema di ibernazione delle app, a condizione che soddisfino i criteri esistenti definiti nel CDD.

Test

La modalità di sospensione dell'app dispone di test CTS e di unità per garantire il corretto funzionamento.