핫플러그 처리

Android TV 셋톱 박스(STB), 오버더톱(OTT) 기기와 같이 HDMI나 디스플레이포트를 통해 외부에 연결된 디스플레이가 있는 기기에서 디스플레이 기능(표시 모드, 지원되는 HDR 유형 등)을 동적으로 변경할 수 있습니다. 이러한 변경은 사용자가 한 디스플레이에서 다른 디스플레이로 전환하거나 연결된 디스플레이 없이 기기를 부팅할 때 등 HDMI 핫플러그 신호로 인해 발생할 수 있습니다. Android 12 이상에는 핫플러그 및 동적 디스플레이 기능을 처리하기 위한 프레임워크 변경사항이 포함되어 있습니다.

이 페이지에서는 디스플레이 핫플러그 처리 및 컴포저 HAL 구현의 디스플레이 기능 변경사항을 설명합니다. 또한, 연결된 프레임 버퍼를 관리하고 이러한 상황에서 경합 상태를 방지하는 방법도 설명합니다.

디스플레이 기능 업데이트

이 섹션에서는 Android 프레임워크가 컴포저 HAL에서 시작된 디스플레이 기능 변경사항을 처리하는 방법을 설명합니다.

Android에서 디스플레이 기능 변경사항을 제대로 처리하려면 먼저 OEM이 onHotplug(display, connection=CONNECTED)를 사용하여 디스플레이 기능의 변경사항을 프레임워크에 알리도록 컴포저 HAL을 구현해야 합니다. 구현 후에는 Android에서 디스플레이 기능 변경사항을 다음과 같이 처리합니다.

  1. 디스플레이 기능의 변경사항을 감지하면 프레임워크는 onHotplug(display, connection=CONNECTED) 알림을 수신합니다.
  2. 알림을 수신하면 프레임워크는 디스플레이 상태를 삭제하고 getActiveConfig, getDisplayConfigs, getDisplayAttribute, getColorModes, getHdrCapabilities, getDisplayCapabilities 메서드를 사용하여 HAL의 새 기능으로 디스플레이 상태를 다시 만듭니다.
  3. 프레임워크가 새 디스플레이 상태를 다시 만들고 나면 이러한 이벤트를 수신 대기하는 앱에 onDisplayChanged 콜백을 전송합니다.

프레임워크는 후속 onHotplug(display, connection=CONNECTED) 이벤트에서 프레임 버퍼를 재할당합니다. 새 프레임 버퍼를 할당하는 동안 장애가 발생하지 않도록 프레임 버퍼 메모리를 올바르게 관리하는 방법에 관한 자세한 내용은 클라이언트 프레임 버퍼 관리를 참고하세요.

일반적인 연결 시나리오 처리

이 섹션에서는 기본 디스플레이가 연결되고 연결 해제될 때 구현에서 다양한 연결 시나리오를 올바르게 처리하는 방법을 설명합니다.

휴대기기용으로 빌드된 Android 프레임워크는 연결 해제된 기본 디스플레이를 기본적으로 지원하지 않습니다. 대신 HAL은 기본 디스플레이가 실제로 연결 해제된 경우 프레임워크와 상호작용하면서 기본 디스플레이를 자리표시자 디스플레이로 바꿔야 합니다.

다음 시나리오는 연결이 해제될 수 있는 외부 연결 디스플레이가 있는 STB 및 TV 동글에서 발생할 수 있습니다. 이러한 시나리오 지원을 구현하려면 아래 표의 정보를 사용하세요.

시나리오 처리
부팅 시 연결된 디스플레이 없음
  • 컴포저 HAL에서 프레임워크로 onHotplug(display, connection=CONNECTED) 신호를 전송합니다.
  • 컴포저 HAL 내의 실제 디스플레이 상태를 자리표시자 디스플레이 상태로 바꿉니다.
기본 디스플레이가 실제로 연결되어 있음
  • 컴포저 HAL에서 프레임워크로 다른 onHotplug(display, connection=CONNECTED) 이벤트를 전송합니다.

    그러면 프레임워크가 디스플레이 기능을 모두 새로고침합니다.

기본 디스플레이가 실제로 연결 해제됨
  • 컴포저 HAL에서 프레임워크로 다른 onHotplug(display, connection=CONNECTED) 이벤트를 전송합니다.
  • 컴포저 HAL 내의 실제 디스플레이 상태를 자리표시자 디스플레이 상태로 바꿉니다. 자리표시자 디스플레이에는 단일 디스플레이 모드가 있어야 프레임워크가 onDisplayChanged 콜백을 앱에 전송할 수 있습니다(지원되는 모드 집합이 변경되었기 때문). 이 단일 디스플레이 모드는 연결이 해제되기 전에 실제 디스플레이의 마지막 활성 모드와 일치해야 앱이 구성 변경 이벤트를 수신하지 않습니다.

순차 구성 ID를 사용하여 경합 상태 방지

경합 상태는 컴포저 HAL이 setActiveConfigsetActiveConfigWithConstraints를 호출하는 프레임워크와 지원되는 디스플레이 구성을 동시에 업데이트하면 발생할 수 있습니다. 해결책은 순차 ID를 사용하여 이 문제를 방지하도록 컴포저 HAL을 구현하는 것입니다.

이 섹션에서는 경합 상태가 발생할 수 있는 방식을 설명하고 순차 ID를 사용하여 이러한 경합 상태를 방지하도록 컴포저 HAL을 구현하는 방법을 자세히 설명합니다.

새로운 순차 ID가 새 디스플레이 구성에 할당되지 않아 경합 상태가 발생할 때 다음과 같은 이벤트 시퀀스를 고려해 보세요.

  1. 지원되는 디스플레이 구성 ID는 다음과 같습니다.

    • id=1, 1080x1920 60Hz
    • id=2, 1080x1920 50Hz
  2. 프레임워크는 setActiveConfig(display, config=1)을 호출합니다.

  3. 동시에 컴포저 HAL은 디스플레이 구성 변경사항을 처리하고 내부 상태를 다음과 같이 새로운 디스플레이 구성 집합으로 업데이트합니다.

    • id=1, 2160x3840 60Hz
    • id=2, 2160x3840 50Hz
    • id=3, 1080x1920 60Hz
    • id=4, 1080x1920 50Hz
  4. 컴포저 HAL은 onHotplug 이벤트를 프레임워크로 전송하여 지원되는 모드 집합이 변경되었다고 알립니다.

  5. 컴포저 HAL은 2단계에서 setActiveConfig(display, config=1)을 수신합니다.

  6. HAL은 프레임워크가 2160x3840 60Hz로의 구성 변경을 요청했다고 해석하지만, 실제로는 1080x1920 60Hz가 필요했습니다.

비 순차 ID 할당을 사용하는 프로세스는 원하는 구성 변경을 잘못 해석하여 여기에서 종료됩니다.

순차 ID를 사용하도록 컴포저 HAL 구성

이러한 경합 상태를 방지하려면 OEM은 컴포저 HAL을 다음과 같이 구현해야 합니다.

  • 컴포저 HAL은 지원되는 디스플레이 구성을 업데이트할 때 새로운 순차 ID를 새 디스플레이 구성에 할당합니다.
  • 프레임워크가 잘못된 구성 ID로 setActiveConfigsetActiveConfigWithConstraints를 호출하면 컴포저 HAL은 호출을 무시합니다.

이러한 단계는 다음 설명과 같이 경합 상태를 방지하는 역할을 합니다.

새로운 순차 ID가 새 디스플레이 구성에 할당될 때 다음과 같은 이벤트 시퀀스를 고려해 보세요.

  1. 지원되는 디스플레이 구성 ID는 다음과 같습니다.

    • id=1, 1080x1920 60Hz
    • id=2, 1080x1920 50Hz
  2. 프레임워크는 setActiveConfig(display, config=1)을 호출합니다.

  3. 디스플레이 구성 변경이 처리되면 다음 구성 ID 집합이 사용되지 않은 다음 정수부터 아래와 같이 할당됩니다.

    • id=3, 2160x3840 60Hz

    • id=4, 2160x3840 50Hz

    • id=5, 1080x1920 60Hz

    • id=6, 1080x1920 50Hz

  4. 컴포저 HAL은 onHotplug 이벤트를 프레임워크로 전송하여 지원되는 모드 집합이 변경되었다고 알립니다.

  5. 컴포저 HAL은 2단계에서 setActiveConfig(display, config=1)를 수신합니다.

  6. 컴포저 HAL은 ID가 더 이상 유효하지 않으므로 호출을 무시합니다.

  7. 프레임워크는 4단계에서 onHotplug 이벤트를 수신하여 처리합니다. getDisplayConfigsgetDisplayAttribute 함수를 사용하여 컴포저 HAL을 호출합니다. 이러한 함수를 통해 프레임워크는 원하는 해상도와 화면 재생 빈도가 1080x1920, 60Hz인 새 ID(5)를 식별합니다.

  8. 프레임워크는 업데이트된 ID 5로 또 다른 setActiveConfig 이벤트를 전송합니다.

  9. 컴포저 HAL은 5단계에서 setActiveConfig(display, config=5)를 수신합니다.

  10. HAL은 프레임워크가 1080x1920 60Hz로의 구성 변경을 요청했다고 올바르게 해석합니다.

위 예에서 알 수 있듯이 순차 ID 할당을 사용하는 프로세스를 통해 경합 상태가 방지되고 올바른 디스플레이 구성 변경이 업데이트됩니다.