В Android 9 (и ниже) SurfaceFlinger и DisplayManagerService
предполагали наличие не более двух физических дисплеев с жестко запрограммированными идентификаторами 0 и 1. Как описано в разделе Статические идентификаторы дисплеев , SurfaceFlinger теперь использует API Hardware Composer (HWC) для генерации стабильных идентификаторов дисплеев, что позволяет ему управлять произвольным количеством физических дисплеев.
Фреймворк может искать токен IBinder
для физического дисплея через SurfaceControl#getPhysicalDisplayToken
после получения 64-битного идентификатора дисплея из SurfaceControl#getPhysicalDisplayIds
или из события горячего подключения DisplayEventReceiver
.
В Android 10 первичный внутренний дисплей — TYPE_BUILT_IN
, а все вторичные дисплеи помечаются как TYPE_HDMI
независимо от типа подключения. Поэтому дополнительные внутренние дисплеи в настоящее время рассматриваются как внешние. В качестве обходного пути код, специфичный для устройства, может делать предположения о DisplayAddress.Physical#getPort
если известен HWC и логика распределения портов предсказуема.
Выполнение
Ранее дисплеи идентифицировались 32-битными идентификаторами, где 0 — внутренний дисплей, 1 — внешний дисплей, [2, INT32_MAX] — виртуальные дисплеи HWC, а -1 представляет недопустимый дисплей или виртуальный дисплей, отличный от HWC. Чтобы SurfaceFlinger и DisplayManagerService
могли отслеживать более двух дисплеев и распознавать ранее просмотренные дисплеи, дисплеям должны быть назначены стабильные и постоянные идентификаторы.
Если HWC поддерживает IComposerClient.getDisplayIdentificationData
и предоставляет данные идентификации дисплея, SurfaceFlinger анализирует структуру EDID и выделяет стабильные 64-битные идентификаторы дисплея для физических и виртуальных дисплеев HWC. Идентификаторы выражаются с использованием типа параметра, где значение null представляет недопустимый дисплей или виртуальный дисплей, отличный от HWC. Без поддержки HWC SurfaceFlinger возвращается к устаревшему поведению с максимум двумя физическими дисплеями.