Снимки задач — это инфраструктура, представленная в Android 8.0, которая объединяет снимки экрана для миниатюр недавних приложений и сохранённых поверхностей из диспетчера окон. Миниатюры недавних приложений отображают последнее состояние задачи в представлении «Недавние».
Когда активность переходила в состояние остановки, диспетчер окон не уничтожал поверхности активности, пока эта активность находилась поверх задачи. Если эта активность требовалась для повторного отображения, диспетчер окон мог запустить анимацию, не дожидаясь завершения отрисовки первого кадра активности, поскольку он мог использовать эту сохранённую поверхность.
Архитектура
Две концепции — «Недавние миниатюры» и «Сохранённые поверхности» — объединены с функцией «Снимки задач». Когда задача переходит в фоновый режим, диспетчер окон помещает снимок экрана этой задачи в графический буфер (GraphicBuffer). Пока приложение, вызвавшее первую активность задачи, остаётся в памяти, этот графический буфер (GraphicBuffer) будет там храниться. Теперь, когда та же активность снова выводится на передний план, диспетчер окон создаст начальное окно (TaskSnapshotSurface) и прикрепит GraphicBuffer, не копируя память в очередь буфера начального окна. Как только активность отрисует свой первый кадр, начальное окно «Снимка задачи» плавно исчезнет, как обычные заставки.
Тот же GraphicBuffer также передаётся через Binder в SystemUI для отображения состояния предварительного просмотра задачи в представлении «Недавние». Поскольку это всего лишь ссылка на буфер, отправка через Binder потребляет мало ресурсов. Когда GraphicBuffer поступает в SystemUI, он преобразуется в аппаратный Bitmap и отображается на экране без какой-либо загрузки памяти в графическую память.
Преимущества
Эта новая архитектура имеет три основных преимущества:
- Если снимок задачи используется в качестве стартового окна, то между снимком и реальным содержимым происходит плавный переход.
- При отрисовке снимка задачи в 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/+/android16-release/services/core/java/com/android/server/wm/