Istantanee delle attività

Istantanee delle attività è l'infrastruttura introdotta in Android 8.0 che combina gli screenshot per le Miniature recenti e le Aree salvate di Window Manager. Le miniature recenti rappresentano l'ultimo stato di un'attività nella visualizzazione Recenti.

Quando un'attività entrava in uno stato di arresto, il gestore delle finestre non distruggeva le sue superfici finché l'attività era nella parte superiore dell'attività. Se questa attività doveva essere mostrata di nuovo, il gestore delle finestre poteva avviare l'animazione senza attendere che l'attività finisse di disegnare il primo frame, poiché poteva utilizzare questa superficie salvata.

Architettura

I due concetti di miniature recenti e aree salvate sono unificati con gli istantanei delle attività. Quando un'attività passa in background, Window Manager inserisce uno screenshot di questa attività in un GraphicBuffer. Finché l'app dell'attività principale dell'attività rimane in memoria, questo GraphicBuffer verrà mantenuto in memoria. Ora, quando la stessa attività viene nuovamente messa in primo piano, WindowManager crea una finestra iniziale (TaskSnapshotSurface) e collega il GraphicBuffer senza copiare alcuna memoria nella coda del buffer della finestra iniziale. Non appena l'attività ha disegnato il primo frame, la finestra di avvio dell'istantanea attività scompare gradualmente come le normali schermate iniziali.

Lo stesso GraphicBuffer viene inviato anche tramite Binder a SystemUI per essere utilizzato per disegnare lo stato di anteprima di un'attività nella visualizzazione Recenti. Poiché si tratta solo di un riferimento a un buffer, l'invio tramite Binder richiede poche risorse. Quando il GraphicBuffer arriva in SystemUI, viene inserito in un bitmap hardware e poi disegnato sullo schermo senza alcun caricamento di memoria nella memoria grafica.

Vantaggi

Questa nuova architettura offre tre vantaggi principali:

  • Se lo snapshot dell'attività viene utilizzato come finestra di partenza, viene visualizzato un'elegante transizione tra lo snapshot e i contenuti reali.
  • Quando lo snapshot dell'attività viene disegnato in SystemUI, può essere fatto senza alcuna copia. In precedenza, il bitmap doveva essere copiato in Ashmem e poi nella memoria grafica. Poiché questo metodo memorizza lo snapshot direttamente nella memoria grafica, non è necessaria alcuna copia.
  • Lo stato visualizzato in Recenti corrisponde sempre a quello che vedrai per la prima volta quando riapri l'app. Avere lo stesso buffer consente inoltre di risparmiare molta memoria. Ecco perché la sezione Recenti ora è in grado di mostrare queste immagini a piena risoluzione. In precedenza, il campionamento veniva ridotto del 64% per risparmiare memoria.

Implementazione

Questa funzionalità esiste interamente nella piattaforma Android. Non è necessaria alcuna integrazione e la personalizzazione non è supportata. Tuttavia, i produttori di dispositivi possono disattivare completamente la funzionalità Istantanee delle attività.

Per disattivare questa funzionalità, modifica questa funzione:

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215

Tieni presente che se la funzionalità è disattivata, la visualizzazione Recenti non mostrerà alcuna miniatura.

Istantanee ad alta e bassa risoluzione

Gli snapshot delle attività vengono scritti sul disco a due scale. Quando viene ripristinato uno snapshot della task dal disco, vengono letti prima gli snapshot a bassa risoluzione, che vengono poi sostituiti dalla relativa controparte ad alta risoluzione. Questa ottimizzazione migliora i tempi di caricamento delle immagini. In caso contrario, potrebbe verificarsi un leggero ritardo durante la lettura del file dell'istantanea dal disco e l'utente vedrà una scheda attività vuota finché l'immagine non sarà disponibile. Puoi configurare le scale nel file di configurazione dell'overlay del dispositivo overlay/frameworks/base/core/res/res/values/config.xml impostando config_highResTaskSnapshotScale e config_lowResTaskSnapshotScale. Per impostazione predefinita, sono impostati rispettivamente su 1,0 e 0,5. Disattiva gli snapshot a bassa risoluzione impostando config_lowResTaskSnapshotScale su 0,0.

Esempi e origine

Trova il resto del codice per questa funzionalità nei file TaskSnapshot* in:

frameworks/base/+/main/services/core/java/com/android/server/wm/