แพ็กเกจ

โดยมีข้อยกเว้นบางประการ แพ็กเกจอินเทอร์เฟซ 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 ซึ่งลูกค้าสามารถรวมไว้และ เซิร์ฟเวอร์ การใช้คอมไพเลอร์ hidl-gen กับ IFoo.hal เป็นอินพุต โหมด Binderized สร้างอัตโนมัติดังต่อไปนี้ ไฟล์:

ไฟล์
สร้างโดยคอมไพเลอร์

รูปที่ 1 ไฟล์ที่สร้างโดยคอมไพเลอร์

  • IFoo.h อธิบาย IFoo บริสุทธิ์ ในคลาส C++ จะมีวิธีการและประเภทที่ระบุไว้ใน อินเทอร์เฟซ IFoo ในไฟล์ IFoo.hal โดยแปลเป็นภาษา 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) มีเพียง ไฟล์ที่สร้างขึ้นโดยอัตโนมัติที่ไม่เกี่ยวข้องกับกลไก RPC ที่ HIDL ใช้นั้น IFoo.h; ไฟล์อื่นๆ ทั้งหมดจะเชื่อมโยงกับกลไก RPC ของ HwBinder ที่ใช้ โดย 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 จัดการการส่งการเรียกใช้ HIDL ผ่านกลไก RPC/IPC ต่างๆ Android 10 เลิกใช้งานไลบรารีนี้
libhwbinder สัญลักษณ์เฉพาะ Binder Android 10 เลิกใช้งานไลบรารีนี้
libfmq IPC สำหรับคิวข้อความแบบรวดเร็ว

เนมสเปซ

ฟังก์ชันและประเภท HIDL เช่น Return<T> และ มีการประกาศ Void() ในเนมสเปซ ::android::hardware เนมสเปซ C++ ของแพ็กเกจจะกำหนดโดยชื่อและเวอร์ชันของแพ็กเกจ ตัวอย่างเช่น แพ็กเกจ mypackage ที่มีเวอร์ชัน 1.2 ต่ำกว่า hardware/interfaces มีคุณสมบัติต่อไปนี้

  • เนมสเปซ C++ คือ ::android::hardware::mypackage::V1_2
  • ชื่อที่มีคุณสมบัติครบถ้วน ของ IMyInterface ในส่วนนั้น แพ็กเกจคือ ::android::hardware::mypackage::V1_2::IMyInterface (IMyInterface เป็นตัวระบุ ไม่ใช่ส่วนหนึ่งของเนมสเปซ)
  • ประเภท ที่กำหนดไว้ในไฟล์ types.hal ของแพ็กเกจ คือ ::android::hardware::mypackage::V1_2::MyPackageType