Snapshot attività

Snapshot delle attività è un'infrastruttura introdotta in Android 8.0 che combina screenshot per Miniature recenti e Piattaforme salvate da Window Manager. Le miniature recenti rappresentano l'ultimo stato di un'attività in la vista Recenti.

Quando un'attività passava allo stato interrotto, Window Manager non ha eliminato il superfici dell'attività, purché questa si trovi nella parte superiore dell'attività. Se doveva essere visualizzata di nuovo l'attività, Window Manager ha potuto avviare senza attendere che l'attività finisca di tracciare il primo frame, ha potuto utilizzare questa piattaforma salvata.

Architettura

I due concetti delle Miniature recenti e delle Piattaforme salvate sono unificati con l'Attività Snapshot. Quando un'attività passa in background, Window Manager inserisce uno screenshot di questa attività in un GraphicBuffer. Se l'app di primo livello l'attività dell'attività rimane in memoria, questo GraphicBuffer verrà conservato in la memoria. Ora, quando la stessa attività viene di nuovo mostrata in primo piano, Window Manager creerà una finestra iniziale (TaskSnapshotSurface) e collegherà GraphicBuffer senza copiare memoria nella coda del buffer dell'interfaccia finestra. Non appena l'attività ha disegnato il primo frame, l'istantanea attività finestra iniziale si dissolve in modo uniforme 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é questo è solo un riferimento a un buffer, il suo invio tramite binder comporta poche risorse. Quando GraphicBuffer arriva all'UI di sistema, viene aggregato in una bitmap hardware e quindi tracciati sullo schermo senza che venga caricata memoria grafica.

Vantaggi

I vantaggi principali di questa nuova architettura sono tre:

  • Se l'istantanea dell'attività viene usata come finestra iniziale, c'è una dissolvenza incrociata tra l'istantanea e i contenuti reali.
  • Quando lo snapshot dell'attività viene disegnato in SystemUI, puoi farlo senza copia. In precedenza, le bitmap dovevano essere copiate in Ashmem, poi in immagini la memoria. Dal momento che questo metodo archivia lo snapshot direttamente nella memoria grafica, necessaria la copia.
  • Lo stato visualizzato in Recenti corrisponde sempre a quello visualizzato per la prima volta alla riapertura dell'app. Avere lo stesso buffer in questo caso permette di risparmiare molta memoria. Ecco perché Recenti è ora in grado di mostrare queste immagini alla massima risoluzione. In precedenza, il campionamento era ridotto del 64% per risparmiare memoria.

Implementazione

Questa funzionalità è disponibile interamente sulla piattaforma Android. Nessuna integrazione è e la personalizzazione non è supportata. Tuttavia, i produttori di dispositivi possono disattivare completamente la funzionalità Snapshot attività.

Per disabilitare questa funzionalità, modificala:

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

Tieni presente che se la funzione è disattivata, la visualizzazione Recenti non mostrerà alcuna miniature di qualunque tipo.

Istantanee ad alta e bassa risoluzione

Gli snapshot delle attività vengono scritti sul disco su due scale. Durante il ripristino di un'attività snapshot dal disco, gli snapshot a bassa risoluzione vengono prima letti e poi sostituiti la loro controparte ad alta risoluzione. Questa ottimizzazione riduce i tempi di caricamento delle immagini. In caso contrario, si potrebbe verificare un leggero ritardo durante la lettura del file snapshot dall' disco e l'utente vedrà una scheda attività vuota fino a quando l'immagine non era disponibile. Puoi configurare le bilance nel file di configurazione dell'overlay del dispositivo overlay/frameworks/base/core/res/res/values/config.xml tramite l'impostazione config_highResTaskSnapshotScale e config_lowResTaskSnapshotScale. Il valore predefinito è 1, 0. e 0,5 rispettivamente. Disattiva gli snapshot a bassa risoluzione impostando da config_lowResTaskSnapshotScale a 0,0.

Esempi e fonte

Trova il resto del codice per questa funzionalità all'interno dei file TaskSnapshot* in:

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