Instantâneos de tarefas

Instantâneos de tarefas é uma 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 interrompido, o Window Manager não destruía as superfícies da atividade, desde que essa atividade estivesse no topo da tarefa. Se essa 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, pois podia usar 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 é 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 Instantâneo da Tarefa desaparecerá suavemente como telas iniciais comuns.

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 isso é apenas uma referência a um buffer, enviá-lo pelo fichário gasta poucos recursos. Quando o GraphicBuffer chega ao SystemUI, ele é encapsulado em um Bitmap de hardware e então desenhado na tela sem nenhum carregamento de memória para a memória gráfica.

Benefícios

Há três benefícios principais nessa nova arquitetura:

  • Se o instantâneo da tarefa for usado como uma 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 esse método armazena o instantâneo diretamente na memória gráfica, não é necessário copiar.
  • 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 pode mostrar essas imagens em resolução máxima. Anteriormente, a amostra era reduzida em 64% para economizar memória.

Implementação

Esse 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 Instantâneos de tarefas.

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, em seguida, substituídos por sua contraparte de alta resolução. Essa otimização melhora os tempos de carregamento da imagem. Caso contrário, pode haver um pequeno atraso ao ler o 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 dispositivo overlay 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 instantâneos de baixa resolução definindo config_lowResTaskSnapshotScale como 0.0.

Exemplos e fonte

Encontre o restante do código para esse recurso nos arquivos TaskSnapshot* em:

frameworks/base/+/master/services/core/java/com/android/server/wm/