Décorations système

Sous Android 9 (et versions antérieures), SurfaceFlinger et DisplayManagerService supposaient l'existence d'au plus deux écrans physiques avec les ID 0 et 1 codés en dur. Comme décrit dans la section Identifiants d'écran statiques, SurfaceFlinger exploite désormais une API Hardware Composer (HWC) pour générer des ID d'écran stables, ce qui lui permet de gérer un nombre arbitraire d'écrans physiques.

Le framework peut rechercher le jeton IBinder pour un écran physique via SurfaceControl#getPhysicalDisplayToken après avoir obtenu l'ID d'écran 64 bits à partir de SurfaceControl#getPhysicalDisplayIds ou d'un événement hotplug DisplayEventReceiver.

Dans Android 10, l'écran interne principal est TYPE_BUILT_IN, et tous les écrans secondaires sont signalés comme TYPE_HDMI, quel que soit le type de connexion. Par conséquent, les écrans internes supplémentaires sont actuellement traités comme des écrans externes. Pour contourner ce problème, le code spécifique à l'appareil peut faire des suppositions sur DisplayAddress.Physical#getPort si le contrôleur matériel est connu et que la logique d'allocation de port est prévisible.

Implémentation

Auparavant, les écrans étaient identifiés par des ID 32 bits, où 0 correspond à l'écran interne, 1 à l'écran externe, [2, INT32_MAX] à des écrans virtuels HWC et -1 à un écran non valide ou à un écran virtuel non HWC. Pour que SurfaceFlinger et DisplayManagerService puissent suivre plus de deux écrans et reconnaître les écrans déjà vus, des ID stables et persistants doivent être attribués aux écrans.

Si le HWC est compatible avec IComposerClient.getDisplayIdentificationData et fournit des données d'identification de l'écran, SurfaceFlinger analyse la structure EDID et alloue des ID d'écran 64 bits stables pour les écrans physiques et virtuels du HWC. Les ID sont exprimés à l'aide d'un type d'option, où la valeur nulle représente un écran non valide ou un écran virtuel non HWC. Sans prise en charge de HWC, SurfaceFlinger revient à l'ancien comportement avec deux écrans physiques au maximum.