套件

除了少數例外狀況,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 套件中建立 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,可供用戶端和伺服器納入。使用 hidl-gen 編譯器,並以 IFoo.hal 介面檔案做為輸入內容,繫結器模式會產生下列自動產生的檔案:

編譯器產生的檔案

圖 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 輔助程式的實作項目的類別。當用戶端呼叫介面方法時,Proxy 會自動對齊用戶端的引數,並將交易傳送至 Binder 核心驅動程式,後者會將交易傳送至另一端的 Stub (接著呼叫實際的伺服器實作項目)。

這些檔案的結構與 aidl-cpp 產生的檔案類似 (詳情請參閱 HIDL 簡介中的「傳送模式」)。IFoo.h 是唯一與 HIDL 使用的 RPC 機制無關的自動產生檔案;所有其他檔案都與 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 Binder 專屬符號。Android 10 已淘汰此程式庫。
libfmq 快速訊息佇列 IPC。

命名空間

Return<T>Void() 等 HIDL 函式和類型會在命名空間 ::android::hardware 中宣告。套件的 C++ 命名空間取決於套件名稱和版本。舉例來說,在 hardware/interfaces 下,版本為 1.2 的套件 mypackage 具有下列品質:

  • C++ 命名空間::android::hardware::mypackage::V1_2
  • 該套件中 IMyInterface完整名稱 為:::android::hardware::mypackage::V1_2::IMyInterface。(IMyInterface 是 ID,並非命名空間的一部分)。
  • 套件 types.hal 檔案中定義的類型會標示為:::android::hardware::mypackage::V1_2::MyPackageType