Istantanee delle attività è un'infrastruttura introdotta in Android 8.0 che combina gli screenshot per le miniature delle app recenti e le superfici salvate di Window Manager. Le miniature dei Recenti rappresentano l'ultimo stato di un'attività nella visualizzazione Recenti.
Quando un'attività entrava in uno stato di interruzione, Window Manager non distruggeva le superfici dell'attività finché questa si trovava in primo piano. Se questa attività doveva essere mostrata di nuovo, Window Manager è stato in grado di avviare l'animazione senza attendere che l'attività finisse di disegnare il primo frame, in quanto è stato 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à viene eseguita 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à conservato in memoria. Ora, quando la stessa attività viene riportata in primo piano, Window Manager crea una finestra iniziale (TaskSnapshotSurface) e collega GraphicBuffer senza copiare la memoria nella coda del buffer della finestra iniziale. Non appena l'attività ha disegnato il primo frame, la finestra iniziale di Istantanea dell'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 GraphicBuffer arriva a SystemUI, viene inserito in una bitmap hardware e poi disegnato sullo schermo senza caricare memoria nella memoria grafica.
Vantaggi
Questa nuova architettura offre tre vantaggi principali:
- Se lo snapshot dell'attività viene utilizzato come finestra iniziale, si verifica una dissolvenza incrociata tra lo snapshot e i contenuti reali.
- Quando lo snapshot dell'attività viene disegnato in SystemUI, può essere fatto senza alcuna copia. In precedenza, la bitmap doveva essere copiata in Ashmem, poi nella memoria grafica. Poiché questo metodo archivia lo snapshot direttamente nella memoria grafica, non è necessaria alcuna copia.
- Lo stato visualizzato in Recenti corrisponde sempre a quello che vedrai per primo quando riapri l'app. Avere lo stesso buffer qui consente anche di risparmiare molta memoria. Per questo motivo, ora Recenti è in grado di mostrare queste immagini alla massima risoluzione. In precedenza, il campionamento era stato ridotto del 64% per risparmiare memoria.
Implementazione
Questa funzionalità esiste interamente nella piattaforma Android. Non è richiesta alcuna integrazione e la personalizzazione non è supportata. Tuttavia, i produttori di dispositivi possono disattivare completamente la funzionalità Istantanee delle app.
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.
Snapshot ad alta e bassa risoluzione
Gli snapshot delle attività vengono scritti sul disco a due scale. Quando ripristini uno snapshot dell'attività dal disco, vengono letti prima gli snapshot a bassa risoluzione, che vengono 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 nella lettura del file dell'istantanea dal disco e l'utente vedrebbe una scheda dell'attività vuota finché l'immagine non è disponibile. Puoi configurare le scale nel file di configurazione dell'overlay del dispositivooverlay/frameworks/base/core/res/res/values/config.xml
impostando
config_highResTaskSnapshotScale
e
config_lowResTaskSnapshotScale
. Per impostazione predefinita, questi valori 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à all'interno dei file TaskSnapshot* in:
frameworks/base/+/android16-release/services/core/java/com/android/server/wm/