套件

除了少數例外,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 檔案會在 samples 套件:

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。說明純IFoo C++ 類別中的方法;這個註解包含 IFoo.hal 檔案中的 IFoo 介面,轉譯為 C++ 並視需要顯示。不包含與 用於實作此介面的 RPC 機制 (例如 HwBinder)。 類別為具有套件和版本的命名空間,例如 ::android::hardware::samples::IFoo::V1_0。用戶端和伺服器 包含此標頭: 可在其和伺服器上呼叫方法的用戶端 實作這些方法
  • IHwFoo.h。包含以下內容的標頭檔案 宣告的函式。 開發人員不得直接加入標題 (未包含 類別)。
  • BpHwFoo.h。繼承 IFoo 並說明 HwBinder Proxy (用戶端) 介面的實作。開發人員絕對不應參照此類別
  • BnHwFoo.h。包含 類別 參照 IFoo 實作並描述 HwBinder 介面的虛設常式 (伺服器端) 實作。 開發人員不應直接參照這個類別。
  • FooAll.cpp。類別,其中包含 HwBinder Proxy 和 HwBinder 虛設常式。當用戶端呼叫介面方法時,Proxy 自動拼湊用戶端的引數,並傳送交易 繫結至繫結器核心驅動程式,這個元件會將交易傳送至 另一端 (接著呼叫實際的伺服器實作)。

這些檔案的結構與 aidl-cpp (詳情請參閱「直通模式」 HIDL 總覽)。只有 自動產生的檔案 (與 HIDL 使用的遠端程序呼叫 (RPC) 機制無關) IFoo.h;所有其他檔案都繫結至於所用 HwBinder RPC 機制 也就是 HIDL。因此,用戶端和伺服器實作一律不應 直接參照 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,這也包含先前 「libhidltransport」和 libhwbinder
libhidltransport 處理透過不同 RPC/IPC 機制的 HIDL 呼叫傳輸。 Android 10 已淘汰這個程式庫。
libhwbinder 繫結機制專屬符號。Android 10 這個程式庫就會淘汰
libfmq 快速訊息佇列處理序間通訊 (IPC)。

命名空間

HIDL 函式和類型,例如 Return<T>Void() 已在命名空間「::android::hardware」中宣告。 套件的 C++ 命名空間取決於套件名稱和版本。 例如:1.2 以下版本的套件 mypackagehardware/interfaces 具有下列特質:

  • C++ 命名空間::android::hardware::mypackage::V1_2
  • 這裡有 IMyInterface完整名稱 套件為:::android::hardware::mypackage::V1_2::IMyInterface。 (IMyInterface 是 ID,不是命名空間的一部分)。
  • 套件的 types.hal 檔案中定義的類型 會識別為: ::android::hardware::mypackage::V1_2::MyPackageType