Task Snapshots é uma infraestrutura introduzida no Android 8.0 que combina capturas de tela para miniaturas recentes , bem como superfícies salvas do Gerenciador de janelas. Recentes As miniaturas 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, desde que essa atividade estivesse no topo da tarefa. Caso esta atividade tivesse que ser mostrada novamente, o Window Manager poderia iniciar a animação sem esperar que a atividade terminasse de desenhar seu primeiro quadro, já que era possível utilizar esta Superfície Salva.
Arquitetura
Os dois conceitos de Miniaturas Recentes e Superfícies Salvas são unificados com Instantâneos de Tarefas. Quando uma tarefa entra em segundo plano, o Window Manager coloca uma captura de tela dessa tarefa em um GraphicBuffer. Enquanto a aplicação da atividade principal da tarefa permanecer na memória, este GraphicBuffer será retido na memória. Agora, quando a mesma atividade for trazida para a frente novamente, o Window Manager criará uma janela inicial (TaskSnapshotSurface) e anexará o GraphicBuffer sem copiar nenhuma memória para a fila de buffer da janela inicial. Assim que a atividade tiver desenhado seu primeiro quadro, a janela inicial do Task Snapshot desaparecerá suavemente como as telas iniciais normais.
O mesmo GraphicBuffer também é enviado pelo Binder para SystemUI para ser usado para desenhar o estado de visualização de uma tarefa na visualização Recentes. Como esta é apenas uma referência a um buffer, enviá-lo pelo fichário gasta poucos recursos. Quando o GraphicBuffer chega ao SystemUI, ele é agrupado em um bitmap de hardware e então desenhado na tela sem qualquer upload de memória para a memória gráfica.
Benefícios
Existem três benefícios principais nesta nova arquitetura:
- Se o instantâneo da tarefa for usado como janela inicial, haverá um bom crossfade entre o instantâneo e o conteúdo real.
- Quando o instantâneo da tarefa é desenhado no SystemUI, isso pode ser feito sem qualquer cópia. Anteriormente, o bitmap tinha que ser copiado para o Ashmem e depois para a memória gráfica. Como este método armazena o instantâneo diretamente na memória gráfica, nenhuma cópia é necessária.
- O estado que você vê em Recentes sempre corresponde ao estado que você verá pela primeira vez ao reabrir o aplicativo. Ter o mesmo buffer aqui também economiza muita memória. É por isso que o Recents agora é capaz de mostrar essas imagens em resolução máxima. Anteriormente, a amostragem era reduzida em 64% para economizar memória.
Implementação
Este recurso existe inteiramente na plataforma Android. Nenhuma integração é necessária e a personalização não é suportada. Os fabricantes de dispositivos podem, no entanto, desativar totalmente o recurso Task Snapshots.
Para desabilitar este recurso, modifique esta função:
frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215
Observe que se o recurso estiver desativado, a visualização Recentes não mostrará nenhuma miniatura.
Instantâneos de alta e baixa resolução
Os instantâneos de tarefas são gravados no disco em duas escalas. Ao restaurar um instantâneo de tarefa do disco, os instantâneos de baixa resolução são lidos primeiro e depois substituídos por seus equivalentes de alta resolução. Essa otimização melhora o tempo de carregamento da imagem. Caso contrário, poderia haver um pequeno atraso na leitura do arquivo de instantâneo do disco e o usuário veria um cartão de tarefa em branco até que a imagem estivesse disponível. Você pode configurar as escalas no arquivo de configuração de sobreposição de 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 snapshots de baixa resolução definindo config_lowResTaskSnapshotScale
como 0,0.Exemplos e fonte
Encontre o restante do código desse recurso nos arquivos TaskSnapshot* em:
frameworks/base/+/main/services/core/java/com/android/server/wm/