Resumos de tarefas

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 dispositivo overlay/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/