Android 9 이하에서 SurfaceFlinger 및 DisplayManagerService
는 하드코딩 ID인 0 및 1을 포함하는 최대 2개의 실제 디스플레이가 존재한다고 가정했습니다. 정적 디스플레이 식별자에 설명된 것처럼 이제 SurfaceFlinger는 Hardware Composer(HWC) API를 사용하여 안정적인 ID를 생성하여 실제 디스플레이의 임의 개수를 관리할 수 있습니다.
프레임워크는 SurfaceControl#getPhysicalDisplayIds
또는 DisplayEventReceiver
핫플러그 이벤트에서 64비트 디스플레이 ID를 획득한 후 SurfaceControl#getPhysicalDisplayToken
을 통해 실제 디스플레이의 IBinder
토큰을 조회할 수 있습니다.
Android 10에서는 기본 내부 디스플레이가 TYPE_BUILT_IN
이며, 모든 보조 디스플레이는 연결 유형과 상관없이 TYPE_HDMI
로 신고됩니다. 따라서 현재는 추가적인 내부 디스플레이가 외부 디스플레이로 취급됩니다. 해결 방법으로 기기별 코드는 HWC가 알려졌고 포트 할당 논리가 예측 가능한 경우 DisplayAddress.Physical#getPort
에 관해 가정합니다.
구현
전에는 디스플레이가 32비트 ID로 식별되었습니다. 여기서 0은 내부 디스플레이, 1은 외부 디스플레이, [2, INT32_MAX]는 HWC 가상 디스플레이이고 -1은 잘못된 디스플레이 또는 비 HWC 가상 디스플레이를 나타냅니다. SurfaceFlinger 및 DisplayManagerService
서비스가 2개 이상의 디스플레이를 추적하고 이전에 본 디스플레이를 인지하기 위해서는 디스플레이에 안정적이고 영구적인 ID가 주어져야 합니다.
HWC가 IComposerClient.getDisplayIdentificationData
를 지원하고 디스플레이 식별 데이터를 제공하는 경우 SurfaceFlinger는 EDID 구조를 파싱하고 실제 및 HWC 가상 디스플레이를 위한 안정적인 64비트 디스플레이 ID를 할당합니다. ID는 옵션 유형을 사용하여 표현되며, 여기서 null 값은 잘못된 디스플레이나 비 HWC 가상 디스플레이를 나타냅니다. HWC가 지원되지 않으면 SurfaceFlinger는 실제 디스플레이 수가 2개로 제한되는 기존 동작으로 대체됩니다.