套餐

除少數例外,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 ,客戶端和伺服器可以包含該標頭。使用hidl-gen編譯器並將IFoo.hal介面檔案作為輸入,binderized 模式具有以下自動產生的檔案:

編譯器產生的文件

圖 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存根實作的類別。當客戶端呼叫介面方法時,代理程式會自動編組來自客戶端的參數並將事務傳送到綁定器內核驅動程序,該驅動程式將事務傳遞到另一端的存根(然後呼叫實際的伺服器實作)。

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