hardware/libhardware/include/hardware
의 헤더를 변환하여 기존 HAL 모듈을 HIDL HAL 모듈로 업데이트할 수 있습니다.
c2hal 사용
c2hal
도구가 대부분의 변환 작업을 처리하므로 필요한 수동 변경 횟수가 줄어듭니다. 예를 들어 NFC HAL의 HIDL .hal
파일을 생성하려면 다음과 같이 작성합니다.
make c2hal
c2hal -r android.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport -p android.hardware.nfc@1.0 hardware/libhardware/include/hardware/nfc.h
이러한 명령어는 hardware/interfaces/nfc/1.0/
에 파일을 추가합니다. $ANDROID_BUILD_TOP 디렉터리에서 hardware/interfaces/update-makefiles.sh
를 실행하면 필요한 makefile도 HAL에 추가됩니다. 이를 직접 변경하여 HAL을 완전히 변환할 수도 있습니다.
c2hal 작업
c2hal
을 실행하는 경우 헤더 파일의 모든 내용이 .hal
파일로 전송됩니다.
c2hal
은 제공된 헤더 파일의 함수 포인터가 있는 구조체를 식별하고, 각 구조체를 별도의 인터페이스 파일로 변환합니다.
예를 들어 alloc_device_t
는 IAllocDevice
HAL 모듈로 변환됩니다(IAllocDevice.hal
파일 내).
다른 모든 데이터 유형은 types.hal
파일로 복사됩니다.
파운드 정의는 Enum으로 이동하고 HIDL에 속하지 않거나 변환할 수 없는 항목(예: 정적 함수 선언)은 텍스트로 'NOTE
'라고 표시된 댓글로 복사됩니다.
수동 작업
c2hal
도구는 특정 구조체에 해야 할 작업을 알지 못합니다. 예를 들어 HIDL에는 원시 포인터 개념이 없으므로 c2hal
은 헤더 파일의 포인터를 배열로 해석해야 하는지, 다른 객체의 참조로 해석해야 하는지 알 수 없습니다. Void 포인터도 마찬가지로 불명확합니다.
int reserved[7]
와 같은 필드는 HIDL로 변환하는 동안 수동으로 제거해야 합니다. 반환 값의 이름과 같은 항목은 더 명확한 의미를 담도록 업데이트해야 합니다. 예를 들면 NFC에서 write
와 같은 메서드의 반환 매개변수를 자동 생성된 int32_t write_ret
에서 Status status
(Status
는 가능한 NFC 상태를 포함하는 새로운 Enum임)로 변환하는 것입니다.
HAL 구현
.hal
파일을 생성하여 HAL을 제공한 후에는 C++ 및 자바에서 언어 지원을 생성하는 makefile(Make 또는 Soong)을 생성해야 합니다(HAL이 자바에서 지원하지 않는 기능을 사용하지 않는 경우). ./hardware/interfaces/update-makefiles.sh
스크립트는 hardware/interfaces
디렉터리에 있는 HAL의 makefile을 자동으로 생성할 수 있습니다. 다른 위치에 있는 HAL의 경우 스크립트만 업데이트하면 됩니다.
makefile이 최신 상태이면 헤더 파일을 생성하고 메서드를 구현할 준비가 된 것입니다. 생성된 인터페이스 구현에 관한 자세한 내용은 HIDL C++(C++로 구현하는 경우) 또는 HIDL 자바(자바로 구현하는 경우)를 참조하세요.