โดยมีข้อยกเว้นบางประการ แพ็กเกจอินเทอร์เฟซ 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