Платформа Android предлагает различные API для отрисовки 2D- и 3D-графики, которые взаимодействуют с реализациями графических драйверов от производителей. Поэтому важно понимать, как эти API работают на более высоком уровне. На этой странице рассказывается об уровне абстракции графического оборудования (HAL), на котором основаны эти драйверы. Прежде чем продолжить, ознакомьтесь со следующими терминами:
Canvas (элемент API)Surface. Класс Canvas содержит методы для стандартного компьютерного рисования битовых карт, линий, кругов, прямоугольников, текста и т. д. и привязан к битовой карте или поверхности. Холст – это самый простой способ рисовать на экране двухмерные объекты. Базовый класс: Canvas.
android.graphics.drawable.
Подробнее о графических объектах и других ресурсах рассказывается в статье Обзор ресурсов приложения.
android.opengl и javax.microedition.khronos.opengles предоставляют доступ к функциям OpenGL ES.Surface (элемент API)Surface. Используйте класс SurfaceView вместо класса Surface.
SurfaceView (элемент API)View, который содержит объект Surface для рисования и предоставляет методы для динамического указания его размера и формата. Представление SurfaceView позволяет рисовать независимо от потока UI для ресурсоемких операций, таких как игры или предварительный просмотр камеры, но при этом используется дополнительная память. Представление поверхности поддерживает графику, созданную с помощью Canvas и OpenGL ES. Базовый класс для объекта SurfaceView – SurfaceView.
R.style и начинающихся с Theme_.View (элемент API)View – это базовый класс для большинства компонентов макета экрана действий или диалогового окна, например текстовых полей и окон. Объект View получает от родительского объекта (см. ViewGroup) вызовы для отрисовки и сообщает родительскому объекту о своем предпочтительном размере и местоположении, которые родительский объект может не учитывать. Подробнее View…
ViewGroup (элемент API)android.widget, но расширяют класс ViewGroup.
android.widget. Window (элемент API)Window, который определяет элементы общего окна, такие как внешний вид, текст строки заголовка, а также расположение и содержимое меню. В диалоговых окнах и действиях для отрисовки объекта Window используется реализация класса Window. Вам не нужно реализовывать класс Window или использовать окна в приложении.Разработчики приложений могут выводить изображения на экран тремя способами: с помощью Canvas, OpenGL ES или Vulkan.
Графические компоненты Android
Независимо от того, какой API рендеринга используют разработчики, все отрисовывается на поверхности. Поверхность представляет собой сторону производителя очереди буферов, которая часто используется SurfaceFlinger. Каждое окно, созданное на платформе Android, поддерживается поверхностью. Все видимые поверхности, которые были отрисованы, объединяются на экране с помощью SurfaceFlinger.
На приведенной ниже диаграмме показано, как взаимодействуют основные компоненты.

Рисунок 1. Как отрисовываются поверхности.
Основные компоненты описаны в следующих разделах.
Производители потоков изображений
Производителем потока изображений может быть любой объект, создающий графические буферы для использования. Примеры: OpenGL ES, Canvas 2D и видеодекодеры mediaserver.
Потребители потока изображений
Чаще всего потоки изображений использует SurfaceFlinger – системный сервис, который получает данные о видимых в данный момент поверхностях и объединяет их на экране, используя информацию от менеджера окон. SurfaceFlinger – единственный сервис, который может изменять контент на экране. SurfaceFlinger использует OpenGL и Hardware Composer (HWC) для создания группы поверхностей.
Другие приложения OpenGL ES также могут использовать потоки изображений, например приложение камеры может использовать поток изображений предварительного просмотра. Потребителями могут быть и приложения, не использующие OpenGL, например класс ImageReader.
Аппаратный композитор
Аппаратная абстракция для подсистемы дисплея. SurfaceFlinger может делегировать некоторые задачи по композиции HWC, чтобы разгрузить OpenGL и графический процессор. SurfaceFlinger действует как обычный клиент OpenGL ES. Поэтому, когда SurfaceFlinger активно объединяет один или два буфера в третий, он использует OpenGL ES. Это позволяет снизить энергопотребление по сравнению с ситуацией, когда все вычисления выполняет графический процессор.
HAL композитора выполняет вторую половину работы и является центральной точкой для всех операций отрисовки графики в Android. HWC должен поддерживать события, одним из которых является VSync (другое – горячее подключение для поддержки HDMI с автоматической настройкой).
Gralloc
Распределитель памяти графики (Gralloc) нужен для выделения памяти, запрошенной производителями изображений. Подробнее о BufferQueue и Gralloc…
Поток данных
На схеме ниже показан графический конвейер Android.

Рисунок 2. Графический поток данных в Android.
Объекты слева – это отрисовщики, создающие графические буферы, например главный экран, строку состояния и системный интерфейс. SurfaceFlinger – это компоновщик, а HWC – композитор.
BufferQueue
BufferQueues обеспечивают связь между графическими компонентами Android. Это пара очередей, которые обеспечивают постоянный цикл буферов от производителя к потребителю. После того как производители передадут свои буферы, SurfaceFlinger отвечает за композицию всего на дисплее.
На приведенной ниже схеме показан процесс обмена данными с помощью BufferQueue.

Рисунок 3. Процесс обмена данными с BufferQueue.
BufferQueue содержит логику, которая связывает производителей и потребителей потока изображений. Примерами производителей изображений могут быть предварительные просмотры камеры, созданные HAL камеры, или игры OpenGL ES. Примеры потребителей изображений: SurfaceFlinger или другое приложение, которое показывает поток OpenGL ES, например приложение камеры, отображающее видоискатель камеры.
BufferQueue – это структура данных, которая объединяет пул буферов с очередью и использует межпроцессное взаимодействие Binder (IPC) для передачи буферов между процессами. Интерфейс производителя, или то, что вы передаете пользователю, который хочет создать графические буферы, – это IGraphicBufferProducer (часть SurfaceTexture). BufferQueue часто используется для отрисовки на Surface и потребления с помощью GLConsumer, а также для других задач.
BufferQueue может работать в трех режимах:
Для выполнения большинства этих задач SurfaceFlinger действует как обычный клиент OpenGL ES. Так, когда SurfaceFlinger активно компонует один или два буфера в третий, он использует OpenGL ES.
Остальную работу выполняет HAL композитора оборудования. Этот HAL является центральной точкой для всей графики, отрисовываемой в Android.