In Android 9 (and lower), SurfaceFlinger and
assumed the existence of at most two physical displays with hard-coded IDs 0
and 1. As described in
Display Identifiers, SurfaceFlinger now leverages
a Hardware Composer (HWC) API to generate stable display IDs, which enables it
to manage an arbitrary number of physical displays.
The framework can look up the
IBinder token for a physical
SurfaceControl#getPhysicalDisplayToken after obtaining
the 64-bit display ID from
DisplayEventReceiver hotplug event.
In Android 10, primary internal display is
TYPE_BUILT_IN, and all secondary displays are flagged as
TYPE_HDMI regardless of connection type. Therefore, additional
internal displays are currently treated as external. As a workaround,
device-specific code can make assumptions about
DisplayAddress.Physical#getPort if the HWC is known and the port
allocation logic is predictable.
Previously, displays were identified by 32-bit IDs, where 0 is the internal
display, 1 is the external display, [2, INT32_MAX] are HWC virtual displays, and
-1 represents an invalid display or a non-HWC virtual display. For
DisplayManagerService to track more than two
displays and recognize previously seen displays, displays should be given stable
and persistent IDs.
If the HWC supports
and provides display identification data, SurfaceFlinger parses the EDID
structure and allocates stable 64-bit display IDs for physical and HWC virtual
displays. The IDs are expressed using an option type, where the null value
represents an invalid display or non-HWC virtual display. Without HWC support,
SurfaceFlinger falls back to legacy behavior with at most two physical