Decorazioni di sistema

In Android 9 (e versioni precedenti), SurfaceFlinger e DisplayManagerService presupponevano l'esistenza di massimo due display fisici con ID hardcoded 0 e 1. Come descritto in Identificatori di display statici, ora SurfaceFlinger sfrutta un'API Hardware Composer (HWC) per generare ID display stabili, il che gli consente di gestire un numero arbitrario di display fisici.

Il framework può cercare il token IBinder per un display fisico tramite SurfaceControl#getPhysicalDisplayToken dopo aver ottenuto l'ID display a 64 bit da SurfaceControl#getPhysicalDisplayIds o da un evento DisplayEventReceiver hotplug.

In Android 10, il display interno principale è TYPE_BUILT_IN e tutti i display secondari sono contrassegnati come TYPE_HDMI, indipendentemente dal tipo di connessione. Pertanto, gli altri display interni vengono attualmente considerati esterni. Come soluzione alternativa, il codice specifico del dispositivo può fare supposizioni su DisplayAddress.Physical#getPort se l'HWC è noto e la logica di allocazione delle porte è prevedibile.

Implementazione

In precedenza, i display erano identificati da ID a 32 bit, dove 0 è il display interno, 1 è il display esterno, [2, INT32_MAX] sono display virtuali HWC e -1 rappresenta un display non valido o un display virtuale non HWC. Affinché SurfaceFlinger e DisplayManagerService monitorino più di due display e riconoscano quelli visti in precedenza, ai display devono essere assegnati ID stabili e permanenti.

Se l'HWC supporta IComposerClient.getDisplayIdentificationData e fornisce dati di identificazione del display, SurfaceFlinger analizza la struttura EDID e alloca ID display stabili a 64 bit per i display fisici e virtuali HWC. Gli ID vengono espressi utilizzando un tipo di opzione, in cui il valore null rappresenta un display non valido o un display virtuale non HWC. Senza il supporto HWC, SurfaceFlinger torna al comportamento precedente con al massimo due display fisici.