แพ็กเกจ

ด้วยข้อยกเว้นบางประการ แพคเกจอินเทอร์เฟซ HIDL จะอยู่ใน hardware/interfaces หรือ vendor/ ไดเร็กทอรี hardware/interfaces ซแมประดับบนสุดโดยตรงกับเนมสเปซแพ็คเกจ android.hardware เวอร์ชันนี้เป็นไดเร็กทอรีย่อยภายใต้เนมสเปซแพ็คเกจ (ไม่ใช่อินเทอร์เฟซ)

คอมไพเลอร์ hidl-gen คอมไพล์ไฟล์ .hal ให้เป็นชุดของไฟล์ .h 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 stub (ฝั่งเซิร์ฟเวอร์) ของอินเทอร์เฟซ นักพัฒนาไม่ควรอ้างถึงคลาสนี้โดยตรง
  • FooAll.cpp . คลาสที่มีการนำไปใช้งานสำหรับทั้งพร็อกซี HwBinder และ Stub HwBinder เมื่อไคลเอนต์เรียกใช้วิธีอินเทอร์เฟซ พร็อกซีจะรวบรวมอาร์กิวเมนต์จากไคลเอนต์โดยอัตโนมัติ และส่งธุรกรรมไปยังไดรเวอร์เคอร์เนล Binder ซึ่งส่งธุรกรรมไปยัง stub อีกด้านหนึ่ง (ซึ่งจากนั้นจะเรียกใช้การใช้งานเซิร์ฟเวอร์จริง)

ไฟล์มีโครงสร้างคล้ายกับไฟล์ที่สร้างโดย aidl-cpp (สำหรับรายละเอียด โปรดดู "โหมดส่งผ่าน" ใน ภาพรวม HIDL ) ไฟล์ที่สร้างขึ้นอัตโนมัติเพียงไฟล์เดียวที่ไม่ขึ้นอยู่กับกลไก RPC ที่ใช้โดย HIDL คือ 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 จัดการการถ่ายโอนการโทร HIDL ผ่านกลไก RPC/IPC ที่แตกต่างกัน Android 10 เลิกใช้ไลบรารีนี้
libhwbinder สัญลักษณ์เฉพาะของสารยึดเกาะ 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