Resumos de tarefas

Resumos de tarefas é a infraestrutura introduzida no Android 8.0, que combina capturas de tela para Miniaturas recentes e Plataformas salvas no Gerenciador de Janelas. As miniaturas recentes representam o último estado de uma tarefa a visualização "Recentes".

Quando uma atividade entrava em estado interrompido, o Window Manager não destruía a superfícies da atividade, desde que ela estivesse na parte superior da tarefa. Se esta atividade precisou ser mostrada novamente, o Gerenciador de janelas pôde iniciar a sem esperar que a atividade termine de desenhar seu primeiro frame, conforme ele foi capaz de usar esta superfície salva.

Arquitetura

Os dois conceitos de "Miniaturas recentes" e "Plataformas salvas" são unificados com o "Task" Snapshots. Quando uma tarefa fica em segundo plano, o Windows Manager faz uma captura de tela desta tarefa em um GraphicBuffer. Contanto que o app principal atividade da tarefa permanece na memória, esse GraphicBuffer será retido memória. Agora, quando a mesma atividade é trazida para a frente novamente, Janela O Manager cria uma janela inicial (TaskSnapshotSurface) e anexa a GraphicBuffer sem copiar nenhuma memória para a fila do buffer do ponto inicial janela. Assim que a atividade tiver desenhado seu primeiro frame, o Resumo da tarefa a janela inicial desaparecerá suavemente, como nas telas de apresentação normais.

O mesmo GraphicBuffer também é enviado pelo Binder ao SystemUI para ser usado para desenhar o estado de visualização de uma tarefa na visualização Recentes. Como isso é apenas uma referência, para um buffer, o envio dele por um binder gasta poucos recursos. Quando o O GraphicBuffer chega ao SystemUI, é unido a um bitmap de hardware e desenhado na tela sem upload de memória para a memória gráfica.

Vantagens

Há três principais benefícios para essa 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 na SystemUI, isso pode ser feito sem copiar. Antes, o bitmap tinha que ser copiado para o Ashmem, e depois para os gráficos memória. Como esse método armazena o snapshot diretamente na memória gráfica, nenhuma é necessário copiar.
  • O estado exibido na seção "Recentes" sempre corresponde ao que você verá primeiro de reabrir o app. Ter o mesmo buffer aqui também economiza muita memória. É por isso que a seção "Recentes" agora pode mostrar essas imagens em resolução máxima. Antes, havia uma redução de 64% na amostragem para economizar memória.

Implementação

Esse recurso existe inteiramente na Plataforma Android. Nenhuma integração é obrigatórios, e não há suporte para personalização. No entanto, os fabricantes de dispositivos podem desativar completamente o recurso Instantâneos de tarefas.

Para desativar esse recurso, modifique-a:

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

Se o recurso estiver desativado, a visualização "Recentes" não mostrará miniaturas.

Snapshots de alta e baixa resolução

Os snapshots de tarefas são gravados no disco em duas escalas. Ao restaurar uma tarefa do disco, os snapshots de baixa resolução são lidos primeiro e, em seguida, substituídos por sua contraparte de alta resolução. Essa otimização melhora o tempo de carregamento das imagens. Caso contrário, pode haver um pequeno atraso durante a leitura do arquivo de instantâneo na disco, e o usuário veria um cartão de tarefa em branco até que a imagem ficasse disponível. Você pode configurar as balanças no arquivo de configuração de sobreposição do dispositivo overlay/frameworks/base/core/res/res/values/config.xml por configuração config_highResTaskSnapshotScale e config_lowResTaskSnapshotScale Por padrão, esses valores são definidos como 1,0 e 0,5, respectivamente. Desativar snapshots de baixa resolução definindo config_lowResTaskSnapshotScale a 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/