Снимки задач

Task Snapshots — это инфраструктура, представленная в Android 8.0, которая объединяет снимки экрана для Recents Thumbnails , а также Saved Surfaces из Window Manager. Recents Thumbnails представляют последнее состояние задачи в представлении Recents.

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

Архитектура

Две концепции Recent Thumbnails и Saved Surfaces объединены с Task Snapshots. Когда задача переходит в фоновый режим, Window Manager помещает снимок экрана этой задачи в GraphicBuffer. Пока приложение верхней активности задачи остается в памяти, этот GraphicBuffer будет сохраняться в памяти. Теперь, когда та же активность снова выводится на передний план, Window Manager создаст начальное окно (TaskSnapshotSurface) и прикрепит GraphicBuffer без копирования памяти в очередь буфера начального окна. Как только активность нарисует свой первый кадр, начальное окно Task Snapshot плавно исчезнет, ​​как обычные заставки.

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

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

Эта новая архитектура имеет три основных преимущества:

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

Выполнение

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

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

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/+/android16-release/services/core/java/com/android/server/wm/