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