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.