패키지

HIDL 인터페이스 패키지는 몇 가지 예외를 제외하고는 hardware/interfaces 또는 vendor/ 디렉터리에 있습니다. hardware/interfaces 최상위 수준은 android.hardware 패키지 네임스페이스에 직접 매핑됩니다. 버전은 인터페이스가 아닌 패키지 네임스페이스 아래의 하위 디렉터리입니다.

hidl-gen 컴파일러는 .hal 파일을 .h.cpp 파일로 컴파일합니다. 자동 생성된 파일에서 클라이언트/서버 구현이 연결되는 공유 라이브러리가 빌드됩니다. 이 공유 라이브러리를 빌드하는 Android.bp 파일은 hardware/interfaces/update-makefiles.sh 스크립트에 의해 자동 생성됩니다. 새 패키지를 hardware/interfaces에 추가하거나 .hal 파일을 기존 패키지에 추가하거나 삭제할 때마다 스크립트를 다시 실행하여 생성된 공유 라이브러리가 최신 상태인지 확인해야 합니다.

예를 들어 IFoo.hal 샘플 파일은 hardware/interfaces/samples/1.0에 있습니다. 샘플 IFoo.hal 파일은 샘플 패키지에 IFoo 인터페이스를 만듭니다.

package android.hardware.samples@1.0;
interface IFoo {
    struct Foo {
       int64_t someValue;
       handle  myHandle;
    };

    someMethod() generates (vec<uint32_t>);
    anotherMethod(Foo foo) generates (int32_t ret);
};

생성된 파일

HIDL 패키지의 자동 생성된 파일은 패키지와 동일한 이름을 가진 단일 공유 라이브러리(예: android.hardware.samples@1.0)에 연결됩니다. 또한 공유 라이브러리는 클라이언트와 서버가 포함할 수 있는 단일 헤더 IFoo.h를 내보냅니다. IFoo.hal 인터페이스 파일이 있는 hidl-gen 컴파일러를 입력으로 사용하면 바인더화 모드에는 다음과 같이 자동 생성된 파일이 있습니다.

컴파일러에서 생성한 파일

그림 1. 컴파일러에서 생성한 파일
  • IFoo.h. C++ 클래스의 순수 IFoo 인터페이스를 설명합니다. 이 파일에는 IFoo.hal 파일의 IFoo 인터페이스에 정의된 메서드와 유형이 포함되며 필요한 경우 C++ 유형으로 변환되어 있습니다. 이 인터페이스를 구현하는 데 사용된 RPC 메커니즘에 관련된 세부정보를 포함하지 않습니다. RPC 메커니즘의 예는 HwBinder입니다. 클래스는 패키지와 버전으로 네임스페이스가 지정됩니다(예: ::android::hardware::samples::IFoo::V1_0). 클라이언트와 서버 모두 클라이언트와 메서드를 구현하기 위한 서버의 헤더를 포함합니다.
  • IHwFoo.h. 인터페이스에 사용된 데이터 유형을 직렬화하는 함수에 관한 선언을 포함하는 헤더 파일입니다. 개발자는 헤더를 직접 포함해서는 안 되며 클래스를 포함하지 않습니다.
  • BpHwFoo.h. IFoo에서 상속된 클래스이며 인터페이스의 HwBinder 프록시(클라이언트 측) 구현을 설명합니다. 개발자는 이 클래스를 직접 참조하면 안 됩니다.
  • BnHwFoo.h. IFoo 구현에 관한 참조를 보유하고 인터페이스의 HwBinder 스터브(서버 측) 구현을 설명하는 클래스입니다. 개발자는 이 클래스를 직접 참조하면 안 됩니다.
  • FooAll.cpp. HwBinder 프록시 및 HwBinder 스터브에 관한 구현을 모두 포함하는 클래스입니다. 클라이언트가 인터페이스 메서드를 호출하면 프록시는 클라이언트의 인수를 자동으로 마샬링하여 트랜잭션을 바인더 커널 드라이버로 전송하고 바인더 커널 드라이버는 상대편의 스터브에 트랜잭션을 전달합니다. 이때 스터브는 실제 서버 구현을 호출합니다.

파일은 aidl-cpp에서 생성한 파일과 유사하게 구조화됩니다(자세한 내용은 HIDL 개요의 '패스스루 모드' 참조). HIDL에서 사용하는 RPC 메커니즘과 독립적으로 자동 생성된 파일은 IFoo.h입니다. 다른 모든 파일은 HIDL에서 사용하는 HwBinder RPC 메커니즘에 연결됩니다. 따라서 클라이언트와 서버 구현은 IFoo가 아닌 다른 것을 직접적으로 참조해서는 안 됩니다. 이를 위해 IFoo.h만 포함하고 생성된 공유 라이브러리에 연결합니다.

패키지의 인터페이스를 사용하는 클라이언트 또는 서버는 다음 위치 중 하나(1)에 해당 패키지의 공유 라이브러리를 포함해야 합니다.

  • Android.mk:
    LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
    
  • Android.bp:
    shared_libs: [
        /* ... */
        "android.hardware.samples@1.0",
    ],
    

다음과 같은 추가 라이브러리를 포함해야 합니다.

libhidlbase 표준 HIDL 데이터 유형이 포함됩니다. Android 10부터 여기에는 이전에 libhidltransportlibhwbinder에 있던 모든 기호도 포함됩니다.
libhidltransport 다른 RPC/IPC 메커니즘을 통한 HIDL 호출의 전송을 처리합니다. Android 10에서는 이 라이브러리가 지원 중단됩니다.
libhwbinder 바인더별 기호입니다. Android 10에서는 이 라이브러리가 지원 중단됩니다.
libfmq 빠른 메시지 대기열 IPC입니다.

네임스페이스

HIDL 함수 및 유형(예: Return<T>Void())은 네임스페이스 ::android::hardware에 선언되어 있습니다. 패키지의 C++ 네임스페이스는 패키지 이름 및 버전에 따라 결정됩니다. 예를 들어 hardware/interfaces 아래의 1.2 버전 패키지 mypackage에는 다음과 같은 특징이 있습니다.

  • C++ 네임스페이스::android::hardware::mypackage::V1_2입니다.
  • 패키지에 있는 IMyInterface정규화된 이름::android::hardware::mypackage::V1_2::IMyInterface입니다. (IMyInterface는 식별자이며 네임스페이스의 일부가 아닙니다.)
  • 패키지의 types.hal 파일에 정의된 유형::android::hardware::mypackage::V1_2::MyPackageType으로 식별됩니다.