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