USB HAL 구현

Android 8.0 버전에서는 더 나은 구성과 코드 안정성을 위해 USB 명령어 처리가 init 스크립트에서 네이티브 USB 데몬으로 이전되었습니다. 가젯 함수 구성과 관련해서는 기기별 가젯 연산을 실행하는 데 init 스크립트(속성 트리거)가 사용됩니다.

이전 버전에서는 이러한 기기별 구성이 기기별 init 스크립트를 통해(속성 트리거를 사용하여) 구현되었습니다. 하드웨어 추상화 계층(HAL) 설계로 이전하면 결과적으로 이러한 문제를 해결하는 좀 더 깔끔한 구현이 가능합니다.

  1. 커널 sysfs 노드에 쓰기와 같은 연산이 실패할 수 있지만 속성 트리거를 설정하는 프레임워크 코드로 다시 전파되지는 않습니다. 따라서 프레임워크는 연산이 자동으로 실패했더라도 연산이 성공했다고 잘못 가정합니다.
  2. init 스크립트에는 실행 가능한 연산 횟수가 제한되어 있습니다.

Android 12 버전에는 HAL 버전 번호와 USB 속도를 모두 반환하는 네트워크 제어 모델(NCM) 및 API 호출에 관한 USB 가젯 HAL 지원이 추가되었습니다. USB HAL을 통해 사용 가능한 API 호출에 관한 자세한 내용은 android.hardware.usb 패키지 요약을 참고하세요.

HAL 및 트레블

기기별 init 스크립트는 HAL 레이어에서 기기별 USB 작업을 실행하기 위한 대체 요소로 활용되었습니다. ADB를 통한 USB는 시스템 문제 디버깅을 위한 기본 인터페이스입니다. USB 구성을 실행하기 위한 네이티브 데몬이 있으면 프레임워크 코드의 종속 항목이 제거되므로 프레임워크가 비정상 종료될 때에도 USB가 실행되고 있어야 합니다.

또한 Android 8.0에 도입된 트레블 모델에서는 모든 HAL이 시스템 서비스와 분리되어 있으며 자체 네이티브 데몬에서 실행되어야 합니다. 이렇게 하면 HAL 레이어가 USB 데몬으로도 기능하게 되므로 독점적 USB 데몬 보유에 관한 요구사항이 사라집니다.

기본 HAL 구현은 모든 Android 8.0 이전 기기를 처리합니다. 따라서 Android 8.0 이전 기기와 관련된 기기별 작업이 발생하지 않습니다. Android 8.0은 HAL 인터페이스를 사용하여 USB 포트 상태를 쿼리하고 데이터 역할 및 전력 역할 전환을 처리합니다.

구현

새로운 USB HAL 인터페이스는 Android 8.0에서 실행되는 모든 기기에 구현되어야 합니다. 기본 구현은 Android 8.0 이전 기기를 처리해야 합니다. 기기가 dual_role_usb 클래스를 사용하여 타입 C 포트 상태를 보고하면 기본 구현으로 충분합니다. 타입 C 노드의 소유권을 시스템으로 이전하려면 기기별 USB 스크립트에서 사소한 변경이 필요할 수 있습니다.