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