Системные украшения

В 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 возвращается к устаревшему поведению с максимум двумя физическими дисплеями.