En Android 9 (y versiones anteriores), SurfaceFlinger y DisplayManagerService
asumían la existencia de, como máximo, dos pantallas físicas con los IDs 0 y 1 codificados. Como se describe en Identificadores de pantallas estáticas, SurfaceFlinger ahora aprovecha una API de Hardware Composer (HWC) para generar IDs de pantalla estables, lo que le permite administrar una cantidad arbitraria de pantallas físicas.
El framework puede buscar el token IBinder
para una pantalla física a través de SurfaceControl#getPhysicalDisplayToken
después de obtener el ID de pantalla de 64 bits de SurfaceControl#getPhysicalDisplayIds
o de un evento de hotplug DisplayEventReceiver
.
En Android 10, la pantalla interna principal es TYPE_BUILT_IN
y todas las pantallas secundarias se marcan como TYPE_HDMI
, independientemente del tipo de conexión. Por lo tanto, las pantallas internas adicionales se consideran externas. Como solución alternativa,
el código específico del dispositivo puede hacer suposiciones sobre
DisplayAddress.Physical#getPort
si se conoce el HWC y la lógica de asignación de puertos
es predecible.
Implementación
Anteriormente, las pantallas se identificaban con IDs de 32 bits, en los que 0 es la pantalla interna, 1 es la pantalla externa, [2, INT32_MAX] son pantallas virtuales de HWC y -1 representa una pantalla no válida o una pantalla virtual que no es de HWC. Para que SurfaceFlinger y DisplayManagerService
hagan un seguimiento de más de dos pantallas y reconozcan pantallas vistas anteriormente, se deben asignar IDs estables y persistentes a las pantallas.
Si el HWC admite IComposerClient.getDisplayIdentificationData
y proporciona datos de identificación de la pantalla, SurfaceFlinger analiza la estructura EDID y asigna IDs de pantalla estables de 64 bits para pantallas físicas y virtuales de HWC. Los IDs se expresan con un tipo de opción, en el que el valor nulo representa una pantalla no válida o una pantalla virtual que no es HWC. Sin compatibilidad con HWC, SurfaceFlinger recurre al comportamiento heredado con un máximo de dos pantallas físicas.