Resumos de tarefas é a infraestrutura introduzida no Android 8.0, que combina capturas de tela para Miniaturas recentes e Superfícies salvas do Gerenciador de janelas. As miniaturas de "Recentes" representam o último estado de uma tarefa na visualização "Recentes".
Quando uma atividade entrava em estado interrompido, o Window Manager não destruía as superfícies da atividade enquanto ela estava na parte superior da tarefa. Se essa atividade precisasse ser mostrada novamente, o Window Manager poderia iniciar a animação sem esperar que a atividade terminasse de desenhar o primeiro frame, já que ele poderia usar essa superfície salva.
Arquitetura
Os dois conceitos de Miniaturas recentes e Superfícies salvas são unificados com Resumos de tarefas. Quando uma tarefa vai para o segundo plano, o Window Manager coloca uma captura de tela dessa tarefa em um GraphicBuffer. Enquanto o app da atividade principal da tarefa permanecer na memória, esse GraphicBuffer será mantido na memória. Agora, quando a mesma atividade é trazida para a frente novamente, o Window Manager cria uma janela inicial (TaskSnapshotSurface) e anexa o GraphicBuffer sem copiar nenhuma memória para a fila de buffer da janela inicial. Assim que a atividade desenhar o primeiro frame, a janela inicial da captura de tela da tarefa vai desaparecer suavemente, como as telas de apresentação normais.
O mesmo GraphicBuffer também é enviado pelo Binder para a SystemUI e usado para desenhar o estado de visualização de uma tarefa na visualização "Recentes". Como é apenas uma referência a um buffer, o envio pelo binder consome poucos recursos. Quando o GraphicBuffer chega ao SystemUI, ele é encapsulado em um bitmap de hardware e desenhado na tela sem upload de memória para a memória gráfica.
Vantagens
Essa nova arquitetura tem três benefícios principais:
- Se o snapshot da tarefa for usado como uma janela inicial, haverá um crossfade entre o snapshot e o conteúdo real.
- Quando o snapshot da tarefa é desenhado na SystemUI, isso pode ser feito sem nenhuma cópia. Antes, o bitmap precisava ser copiado para o Ashmem e, depois, para a memória gráfica. Como esse método armazena o snapshot diretamente na memória gráfica, não é necessário fazer cópias.
- O estado que você vê em "Recentes" sempre corresponde ao estado que aparece ao reabrir o app. Ter o mesmo buffer aqui também economiza muita memória. Por isso, a seção "Recentes" agora pode mostrar essas imagens em resolução máxima. Antes, ele era subamostrado em 64% para economizar memória.
Implementação
Esse recurso existe totalmente na plataforma Android. Nenhuma integração é necessária, e a personalização não é compatível. No entanto, os fabricantes de dispositivos podem desativar completamente o recurso de snapshots de tarefas.
Para desativar esse recurso, modifique esta função:
frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215
Se o recurso estiver desativado, a visualização "Recentes" não vai mostrar miniaturas.
Snapshots de alta e baixa resolução
Os snapshots de tarefas são gravados no disco em duas escalas. Ao restaurar um snapshot de tarefa do disco, os snapshots de baixa resolução são lidos primeiro e substituídos pela versão de alta resolução. Essa otimização melhora o tempo de carregamento das imagens. Caso contrário, pode haver um pequeno atraso ao ler o arquivo de instantâneo do disco, e o usuário verá um card de tarefa em branco até que a imagem esteja disponível. É possível configurar as escalas no arquivo de configuração de sobreposição do dispositivooverlay/frameworks/base/core/res/res/values/config.xml
definindo
config_highResTaskSnapshotScale
e
config_lowResTaskSnapshotScale
. Por padrão, eles são definidos como 1,0 e 0,5, respectivamente. Desative os snapshots de baixa resolução definindo
config_lowResTaskSnapshotScale
como 0,0.
Exemplos e origem
Encontre o restante do código desse recurso nos arquivos TaskSnapshot* em:
frameworks/base/+/android16-release/services/core/java/com/android/server/wm/