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 recentes representam o último estado de uma tarefa na visualização "Recentes".
Quando uma atividade entrava em um estado parado, o gerenciador de janelas não destruía as superfícies da atividade, desde que ela estivesse na parte de cima 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, porque ele poderia usar essa superfície salva.
Arquitetura
Os dois conceitos de Miniaturas recentes e Superfícies salvas são unificados com os Resumos de tarefas. Quando uma tarefa passa para o segundo plano, o Window Manager coloca uma captura de tela dela em um GraphicBuffer. Enquanto o app da atividade principal da tarefa permanecer na memória, esse GraphicBuffer será retido na memória. Agora, quando a mesma atividade é mostrada 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 renderizar o primeiro frame, a janela de inicialização do snapshot de tarefas vai desaparecer suavemente, como telas de apresentação normais.
O mesmo GraphicBuffer também é enviado pelo Binder para o SystemUI para ser usado para desenhar o estado de visualização de uma tarefa na visualização "Recentes". Como essa é apenas uma referência a um buffer, o envio por meio de um binder consome poucos recursos. Quando o GraphicBuffer chega ao SystemUI, ele é agrupado em um bitmap de hardware e exibido na tela sem nenhum upload de memória para a memória de gráficos.
Vantagens
Há três benefícios principais dessa nova arquitetura:
- Se o snapshot da tarefa for usado como uma janela inicial, haverá um bom crossfade entre o snapshot e o conteúdo real.
- Quando o snapshot da tarefa é exibido no SystemUI, isso pode ser feito sem 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 mostrado em "Recentes" sempre corresponde ao estado que você vai encontrar pela primeira vez ao reabrir o app. Ter o mesmo buffer aqui também economiza muita memória. Por isso, o Recentes agora pode mostrar essas imagens em resolução máxima. Anteriormente, a amostragem era reduzida em 64% para economizar memória.
Implementação
Esse recurso existe apenas na plataforma Android. Não é necessária integração, 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 nenhuma miniatura.
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 depois 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 na leitura do arquivo de snapshot do disco, e o usuário vai ver um card de tarefa em branco até que a imagem esteja disponível. É possível configurar as escalas no arquivo de configuração da 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 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/+/main/services/core/java/com/android/server/wm/