套餐

除了少數例外,HIDL 接口包位於hardware/interfacesvendor/目錄中。 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 機制(例如HwBinder )相關的詳細信息。該類以包和版本命名,例如::android::hardware::samples::IFoo::V1_0 。客戶端和服務器都包含此標頭:用於調用其上的方法的客戶端和用於實現這些方法的服務器。
  • IHwFoo.h 。包含對接口中使用的數據類型進行序列化的函數的聲明的頭文件。開發人員不應該直接包含他的標題(它不包含任何類)。
  • BpHwFoo.h 。從IFoo繼承並描述接口的HwBinder代理(客戶端)實現的類。開發人員不應該直接引用這個類。
  • BnHwFoo.h 。一個包含對IFoo實現的引用並描述接口的HwBinder存根(服務器端)實現的類。開發人員不應該直接引用這個類。
  • FooAll.cpp 。包含HwBinder代理和HwBinder存根的實現的類。當客戶端調用接口方法時,代理會自動編組來自客戶端的參數並將事務發送到 binder 內核驅動程序,後者將事務傳遞到另一端的存根(然後調用實際的服務器實現)。

這些文件的結構與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