ด้วยข้อยกเว้นบางประการ แพคเกจอินเทอร์เฟซ 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 จะมีไฟล์ที่สร้างขึ้นโดยอัตโนมัติดังต่อไปนี้:
-
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
และ StubHwBinder
เมื่อไคลเอนต์เรียกใช้วิธีอินเทอร์เฟซ พร็อกซีจะรวบรวมอาร์กิวเมนต์จากไคลเอนต์โดยอัตโนมัติ และส่งธุรกรรมไปยังไดรเวอร์เคอร์เนล 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