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 recentes representam o último estado de uma tarefa na visualização "Recentes".

Quando uma atividade entrava em estado interrompido, o Gerenciador de janelas não destruía as superfícies da atividade enquanto ela estava na parte de cima da tarefa. Se essa atividade precisasse ser mostrada novamente, o Gerenciador de janelas poderia iniciar a animação sem esperar que a atividade terminasse de desenhar o primeiro frame, já que era possível 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 Gerenciador de janelas 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 Activity é trazida para a frente novamente, o Gerenciador de janelas cria uma janela inicial (TaskSnapshotSurface) e anexa o GraphicBuffer sem copiar nenhuma memória para a fila do buffer da janela inicial. Assim que a atividade desenha o primeiro frame, a janela inicial do Resumo de tarefas desaparece suavemente, como telas de apresentação normais.

O mesmo GraphicBuffer também é enviado pelo Binder para a 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 pelo Binder gasta poucos recursos. Quando o GraphicBuffer chega à SystemUI, ele é encapsulado em um bitmap de hardware e desenhado na tela sem nenhum upload de memória para a memória gráfica.

Benefícios

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

  • Se o resumo de tarefas for usado como uma janela inicial, haverá um bom efeito de transição entre o snapshot e o conteúdo real.
  • Quando o resumo de tarefas é desenhado na SystemUI, ele pode ser feito sem nenhuma cópia. Anteriormente, o bitmap precisava ser copiado para o Ashmem e, em seguida, para a memória gráfica. Como esse método armazena o snapshot 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á ao reabrir o app. Ter o mesmo buffer aqui também economiza muita memória. É por isso que a tela "Recentes" agora pode mostrar essas imagens em resolução total. Anteriormente, ela 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 é compatível. No entanto, os fabricantes de dispositivos podem desativar o recurso Resumos de tarefas completamente.

Para desativar esse recurso, modifique esta função:

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215

Observação: se o recurso estiver desativado, a visualização "Recentes" não mostrará nenhuma miniatura.

Snapshots de alta e baixa resolução

Os resumos de tarefas são gravados no disco em duas escalas. Ao restaurar um resumo de tarefas do disco, os snapshots de baixa resolução são lidos primeiro e substituídos pela 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 snapshot 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, esses valores 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/+/android17-release/services/core/java/com/android/server/wm/