Istantanee delle attività

Task Snapshots è un'infrastruttura introdotta in Android 8.0 che combina screenshot per miniature recenti e superfici salvate da Window Manager. Recenti Le miniature rappresentano l'ultimo stato di un'attività nella vista Recenti.

Quando un'attività entrava in uno stato interrotto, Window Manager non distruggeva le superfici dell'attività finché quell'attività era in cima all'attività. Se questa attività doveva essere mostrata di nuovo, Window Manager era in grado di avviare l'animazione senza attendere che l'attività finisse di disegnare il suo primo fotogramma, poiché era in grado di utilizzare questa superficie salvata.

Architettura

I due concetti di miniature recenti e superfici salvate sono unificati con le istantanee delle attività. Quando un'attività passa in background, Window Manager inserisce uno screenshot di questa attività in un GraphicBuffer. Finché l'applicazione dell'attività principale dell'attività rimane in memoria, questo GraphicBuffer verrà mantenuto in memoria. Ora, quando la stessa attività viene nuovamente portata in primo piano, Window Manager creerà una finestra iniziale (TaskSnapshotSurface) e collegherà GraphicBuffer senza copiare alcuna memoria nella coda del buffer della finestra iniziale. Non appena l'attività ha disegnato il suo primo fotogramma, la finestra iniziale dell'Istantanea dell'attività svanirà 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 vista Recenti. Poiché si tratta solo di un riferimento a un buffer, inviarlo tramite il raccoglitore consuma poche risorse. Quando il GraphicBuffer arriva a SystemUI, viene racchiuso in una bitmap hardware e quindi disegnato sullo schermo senza alcun caricamento di memoria nella memoria grafica.

Benefici

I vantaggi principali di questa nuova architettura sono tre:

  • Se l'istantanea dell'attività viene utilizzata come finestra iniziale, si verifica una piacevole dissolvenza incrociata tra l'istantanea e il contenuto reale.
  • Quando l'istantanea dell'attività viene disegnata in SystemUI, può essere eseguita senza alcuna copia. In precedenza la bitmap doveva essere copiata in Ashmem, quindi nella memoria grafica. Poiché questo metodo memorizza l'istantanea direttamente nella memoria grafica, non è necessaria alcuna copia.
  • Lo stato che vedi in Recenti corrisponde sempre allo stato che vedrai per primo alla riapertura dell'app. Avere lo stesso buffer qui consente inoltre di risparmiare molta memoria. Ecco perché Recents è ora in grado di mostrare queste immagini alla massima risoluzione. In precedenza veniva effettuato un downsampling del 64% per risparmiare memoria.

Implementazione

Questa funzionalità esiste interamente nella piattaforma Android. Non è richiesta alcuna integrazione e la personalizzazione non è supportata. I produttori di dispositivi potrebbero, tuttavia, disabilitare completamente la funzionalità Istantanee delle attività.

Per disabilitare questa funzione, modificare questa funzione:

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

Tieni presente che se la funzione è disabilitata, la vista Recenti non mostrerà alcuna miniatura.

Istantanee ad alta e bassa risoluzione

Gli snapshot delle attività vengono scritti sul disco su due scale. Quando si ripristina uno snapshot di attività dal disco, gli snapshot a bassa risoluzione vengono letti per primi e poi sostituiti dalla loro 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 di istantanea dal disco e l'utente vedrebbe una scheda attività vuota finché l'immagine non fosse disponibile. È possibile configurare le scale nel file di configurazione della sovrapposizione del dispositivo overlay/frameworks/base/core/res/res/values/config.xml impostando config_highResTaskSnapshotScale e config_lowResTaskSnapshotScale . Per impostazione predefinita, questi sono impostati rispettivamente su 1,0 e 0,5. Disabilita gli snapshot a bassa risoluzione impostando config_lowResTaskSnapshotScale su 0.0.

Esempi e fonte

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

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