Снимки задач

Снимки задач — это инфраструктура, представленная в Android 8.0, которая объединяет снимки экрана для недавних миниатюр , а также сохраненных поверхностей из диспетчера окон. Недавние миниатюры отображают последнее состояние задачи в представлении «Недавние».

Когда действие переходило в остановленное состояние, диспетчер окон не уничтожал поверхности действия, пока это действие находилось в верхней части задачи. Если это действие нужно было отобразить снова, Window Manager мог запустить анимацию, не дожидаясь, пока действие завершит отрисовку своего первого кадра, поскольку он мог использовать эту сохраненную поверхность.

Архитектура

Два понятия «Недавние миниатюры» и «Сохраненные поверхности» объединены со снимками задач. Когда задача переходит в фоновый режим, диспетчер окон помещает снимок экрана этой задачи в GraphicBuffer. Пока приложение верхней активности задачи остается в памяти, этот GraphicBuffer будет сохраняться в памяти. Теперь, когда та же активность снова выводится на передний план, Window Manager создаст начальное окно (TaskSnapshotSurface) и прикрепит GraphicBuffer, не копируя какую-либо память в очередь буферов начального окна. Как только активность нарисует свой первый кадр, начальное окно «Снимок задачи» плавно исчезнет, ​​как обычные экраны-заставки.

Тот же GraphicBuffer также отправляется через Binder в SystemUI для использования для отображения состояния предварительного просмотра задачи в представлении «Недавние». Поскольку это всего лишь ссылка на буфер, его отправка по связующему требует немного ресурсов. Когда GraphicBuffer поступает в SystemUI, он заворачивается в аппаратный битмап, а затем рисуется на экране без какой-либо загрузки памяти в графическую память.

Преимущества

У этой новой архитектуры есть три основных преимущества:

  • Если снимок задачи используется в качестве начального окна, между снимком и реальным содержимым появляется хороший переход.
  • Когда снимок задачи рисуется в SystemUI, это можно сделать без какого-либо копирования. Раньше растровое изображение нужно было копировать в Ashmem, а затем в графическую память. Поскольку этот метод сохраняет моментальный снимок непосредственно в графической памяти, копирование не требуется.
  • Состояние, которое вы видите в разделе «Последние», всегда совпадает с состоянием, которое вы впервые увидите при повторном открытии приложения. Наличие здесь того же буфера также экономит много памяти. Вот почему «Недавние» теперь могут показывать эти изображения в полном разрешении. Ранее он был уменьшен на 64% для экономии памяти.

Реализация

Эта функция полностью существует на платформе Android. Интеграция не требуется, и настройка не поддерживается. Однако производители устройств могут полностью отключить функцию моментальных снимков задач.

Чтобы отключить эту функцию, измените эту функцию:

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

Обратите внимание, что если эта функция отключена, в представлении «Последние» не будут отображаться миниатюры.

Снимки в высоком и низком разрешении

Снимки задач записываются на диск в двух масштабах. При восстановлении снимка задачи с диска сначала считываются снимки с низким разрешением, а затем заменяются их аналогом с высоким разрешением. Эта оптимизация сокращает время загрузки изображений. В противном случае возможна небольшая задержка при чтении файла моментального снимка с диска, и пользователь будет видеть пустую карточку задачи до тех пор, пока образ не будет доступен. Вы можете настроить масштабы в файле конфигурации наложения устройства overlay/frameworks/base/core/res/res/values/config.xml , установив config_highResTaskSnapshotScale и config_lowResTaskSnapshotScale . По умолчанию они установлены на 1,0 и 0,5 соответственно. Отключите моментальные снимки с низким разрешением, установив для config_lowResTaskSnapshotScale значение 0.0.

Примеры и источник

Найдите остальную часть кода для этой функции в файлах TaskSnapshot* в:

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