VHAL ของ AIDL มีการกำหนดไว้ใน
  android.hardware.automotive.vehicle namespace
  อินเทอร์เฟซ VHAL กำหนดไว้ที่ 
  IVehicle.aidl
  เว้นแต่จะระบุไว้เป็นอย่างอื่น วิธีการทั้งหมดต้องได้รับการติดตั้งใช้งานสำหรับ VHAL เวอร์ชันที่เฉพาะเจาะจง
เวอร์ชัน
| เวอร์ชัน Android | เวอร์ชัน VHAL ล่าสุด | เวอร์ชันล่าสุดของพร็อพเพอร์ตี้ VHAL | เวอร์ชัน VHAL ขั้นต่ำที่เข้ากันได้ | 
|---|---|---|---|
| Android 16 | V4 | V4 | V1 | 
| Android 15 | V3 | V3 | V1 | 
| Android 14 | V2 | V2 | V1 | 
| Android 13 | V1 | (ไม่ได้แยกอินเทอร์เฟซพร็อพเพอร์ตี้ VHAL) | V1 | 
เราขอแนะนำให้ใช้ VHAL เวอร์ชันล่าสุดสำหรับ Android เวอร์ชันที่เฉพาะเจาะจง
ฟังก์ชันและ Callback
ฟังก์ชัน VHAL มีคำจำกัดความอยู่ที่
  IVehicle.aidl
| วิธีการ | |
|---|---|
| VehiclePropConfigs getAllPropConfigs() | |
| VehiclePropConfigs getPropConfigs(in int[] props) | |
| void getValues(IVehicleCallback callback, in GetValueRequests requests)GetValueRequestแบบไม่พร้อมกัน ระบบจะส่งผลลัพธ์ผ่านonGetValuesของการเรียกกลับ | |
| void setValues(IVehicleCallback callback, in SetValueRequests requests)SetValueRequestแบบไม่พร้อมกัน ระบบจะส่งผลลัพธ์ผ่านonSetValuesของการเรียกกลับ | |
| void subscribe(in IVehicleCallback callback, in SubscribeOptions[] options, int maxSharedMemoryFileCount)maxSharedMemoryFileCount | |
| void unsubscribe(in IVehicleCallback callback, in int[] propIds) | |
| returnSharedMemory(in IVehicleCallback callback, long sharedMemoryId) | |
| (ใหม่ใน Android 16) SupportedValuesListResults getSupportedValuesLists(in List | |
| (ใหม่ใน Android 16) MinMaxSupportedValueResults getMinMaxSupportedValue(in List | |
| void registerSupportedValueChangeCallback(in IVehicleCallback callback, in List | |
| void unregisterSupportedValueChangeCallback(in IVehicleCallback callback, in List | |
โดยจะกำหนดการเรียกกลับที่
  IVehicleCallback.aidl
  และมีเมธอดต่อไปนี้
| วิธีการ | |
|---|---|
| oneway void onGetValues(in GetValueResults responses)getValuesเพื่อแสดงผลลัพธ์ของฟังก์ชัน get value เรียกใช้
        เมื่อค่าบางค่าที่จะดึงข้อมูลพร้อมใช้งาน | |
| oneway void onSetValues(in SetValueResults responses)setValuesfunction to deliver set value results. เรียกใช้เมื่อ
        VHAL จัดการคำขอตั้งค่าพร็อพเพอร์ตี้บางรายการเสร็จแล้ว | |
| oneway void onPropertyEvent(in VehiclePropValues propValues, int sharedMemoryFileCount)CONTINUOUSเหตุการณ์พร็อพเพอร์ตี้จะเกิดขึ้นตามอัตราการสุ่มตัวอย่างการติดตาม
        ใน Hz หรือความถี่ของข้อความบัสของยานพาหนะ นอกจากนี้ เหตุการณ์พร็อพเพอร์ตี้อาจเกิดขึ้นหากสถานะของพร็อพเพอร์ตี้มีการเปลี่ยนแปลง
        ด้วย เช่น จากไม่พร้อมใช้งานเป็นพร้อมใช้งานON_CHANGEเหตุการณ์พร็อพเพอร์ตี้จะเกิดขึ้นเมื่อค่าของพร็อพเพอร์ตี้
        หรือสถานะของพร็อพเพอร์ตี้เปลี่ยนแปลงVehiclePropValueที่มีสถานะไม่พร้อมใช้งานหรือข้อผิดพลาด
        และค่าว่างSharedMemoryFileCountจะเป็น0เสมอ | |
| oneway void onPropertySetError(in VehiclePropErrors errors)onSetValuesที่มีผลลัพธ์ข้อผิดพลาดแทน | |
| oneway void onSupportedValueChange(in ListgetMinMaxSupportedValueหรือgetSupportedValuesListsเพื่อรับค่าที่อัปเดต | |
VHAL VTS จะตรวจสอบความถูกต้องของการใช้งาน VHAL ที่
  VtsHalAutomotiveVehicle_TargetTest.cpp
การทดสอบจะยืนยันว่าได้ใช้เมธอดพื้นฐานอย่างถูกต้องและการกำหนดค่าพร็อพเพอร์ตี้ที่รองรับถูกต้อง การทดสอบจะทำงานกับอินสแตนซ์ VHAL ทั้งหมดในอุปกรณ์ แต่ AAOS จะใช้อินสแตนซ์เริ่มต้น (android.hardware.automotive.vehicle.IVehicle/default) เท่านั้น
มูลค่าพร็อพเพอร์ตี้ยานพาหนะ
ใช้โครงสร้าง
  VehiclePropValue
  เพื่ออธิบายค่าของแต่ละพร็อพเพอร์ตี้ ซึ่งมีช่องต่อไปนี้
| ช่อง | คำอธิบาย | 
|---|---|
| timestamp | การประทับเวลาที่แสดงเวลาที่เกิดเหตุการณ์และซิงค์กับ SystemClock.elapsedRealtimeNano()นาฬิกา | 
| prop | รหัสพร็อพเพอร์ตี้สำหรับค่านี้ | 
| areaid | รหัสพื้นที่สำหรับค่านี้ พื้นที่ต้องเป็นหนึ่งในพื้นที่ที่รองรับซึ่งระบุไว้ในการกำหนดค่ารหัสพื้นที่ หรือ 0สำหรับพร็อพเพอร์ตี้ทั่วโลก | 
| value | โครงสร้างข้อมูลที่มีค่าพร็อพเพอร์ตี้จริง ระบบจะใช้ฟิลด์อย่างน้อย 1 รายการภายในฟิลด์นี้เพื่อจัดเก็บค่าจริงตามประเภทพร็อพเพอร์ตี้ เช่น องค์ประกอบแรกใน value.int32Valuesใช้สำหรับพร็อพเพอร์ตี้ประเภท Int32 โปรดดูรายละเอียดที่
      การกำหนดค่า
        พร็อพเพอร์ตี้ | 
| status | สถานะของพร็อพเพอร์ตี้สำหรับการอ่าน สำหรับพร็อพเพอร์ตี้แบบอ่าน/เขียน อาจใช้ได้กับการเขียนด้วย แต่ไม่รับประกัน เช่น พร็อพเพอร์ตี้อาจพร้อมใช้งานสำหรับการอ่าน แต่ไม่พร้อมใช้งานสำหรับการเขียน ในกรณีดังกล่าว สถานะจะเป็น AVAILABLEและช่องค่าจะมีข้อมูลที่ถูกต้อง
    
    
    ดูสถานะที่เป็นไปได้ได้ที่VehiclePropertyStatus | 
getValues และ setValues แบบอะซิงโครนัส
การดำเนินการ getValues และ setValues จะดำเนินการแบบไม่พร้อมกัน
  ซึ่งหมายความว่าฟังก์ชันอาจแสดงผลก่อนที่การดำเนินการรับหรือตั้งค่าจริงจะเสร็จสมบูรณ์
  ผลลัพธ์ของการดำเนินการ (เช่น มูลค่าพร็อพเพอร์ตี้สำหรับ getValues และสถานะสำเร็จหรือข้อผิดพลาดสำหรับ setValues) จะแสดงผ่านการเรียกกลับที่ส่งเป็นอาร์กิวเมนต์ 
การติดตั้งใช้งานต้องไม่บล็อกผลลัพธ์ในเธรด Binder ที่จัดการคำขอ แต่เราขอแนะนำให้คุณจัดเก็บคำขอในคิวคำขอและใช้เธรดตัวแฮนเดิลแยกต่างหาก เพื่อจัดการคำขอแบบอะซิงโครนัส ดูรายละเอียดได้ที่ การติดตั้งใช้งานอ้างอิง
รูปที่ 1 กระบวนการแบบอะซิงโครนัส
ไฟล์พาร์เซลขนาดใหญ่
โครงสร้างทั้งหมดที่ชื่อ XXXs เช่น VehiclePropConfigs, SetValueRequests และ VehiclePropValues เรียกว่า LargeParcelable (หรือ StableLargeParcelable) แต่ละโครงสร้างแสดงรายการค่าที่ใช้ในการส่งข้อมูลขนาดใหญ่ซึ่งอาจเกินขีดจำกัดของ Binder (4 KB ในการติดตั้งใช้งานไลบรารี LargeParcelable) ข้ามขอบเขตของ Binder แต่ละรายการมีคำจำกัดความโครงสร้างที่คล้ายกัน
  ซึ่งมีฟิลด์ต่อไปนี้
| คำแนะนำ | คำอธิบาย | 
|---|---|
| payloads | รายการค่าเมื่อขนาดค่าอยู่ในขีดจำกัดหน่วยความจำของ Binder หรือรายการว่าง | 
| sharedMemoryFd | ตัวอธิบายไฟล์ที่อนุญาตให้เป็น Null ซึ่งชี้ไปยังไฟล์หน่วยความจำที่แชร์ซึ่งจัดเก็บเพย์โหลดที่ซีเรียลไลซ์แล้ว หากรายการค่ามีขนาดใหญ่เกินไป | 
เช่น VehiclePropConfigs จะกำหนดเป็น
parcelable VehiclePropConfigs { // The list of vehicle property configs if they fit the binder memory // limitation. VehiclePropConfig[] payloads; // Shared memory file to store configs if they exceed binder memory // limitation. Created by VHAL, readable only at client. Client could keep // the fd opened or keep the FD mapped to access configs. @nullable ParcelFileDescriptor sharedMemoryFd; }
VehiclePropConfigs มีทั้งเพย์โหลดที่ไม่ว่างเปล่าหรือ sharedMemoryFd ที่ไม่ใช่ค่าว่าง
- หาก payloadsไม่ว่างเปล่า ระบบจะจัดเก็บรายการข้อมูลจริง ซึ่งก็คือ การกำหนดค่าพร็อพเพอร์ตี้
- หาก sharedMemoryFdไม่ใช่ค่าว่าง แสดงว่ามีไฟล์หน่วยความจำที่ใช้ร่วมกันซึ่งจัดเก็บโครงสร้างที่ซีเรียลไลซ์ของVehiclePropConfigsโครงสร้างใช้ฟังก์ชันwriteToParcelเพื่อจัดลำดับออบเจ็กต์ Parcel
ในฐานะไคลเอ็นต์ Java สำหรับ VHAL บริการรถยนต์จะจัดการการซีเรียลไลซ์และการดีซีเรียลไลซ์สำหรับ
  LargeParcelable สำหรับการติดตั้งใช้งาน VHAL และไคลเอ็นต์ดั้งเดิม คุณควรซีเรียลไลซ์และดีซีเรียลไลซ์ 
  LargeParcelable ด้วยไลบรารี 
  LargeParcelable
  หรือคลาส Wrapper ที่มีประโยชน์สำหรับไลบรารีใน 
  ParcelableUtils.h
ตัวอย่างเช่น ไคลเอ็นต์เนทีฟที่แยกวิเคราะห์คำขอสำหรับ getValues ที่ได้รับจาก Binder
  มีดังนี้
// 'requests' are from the binder. GetValueRequests requests; expected<LargeParcelableBase::BorrowedOwnedObject, ScopedAStatus> deserializedResults = fromStableLargeParcelable(requests); if (deserializedResults.ok()) { const std::vector & getValueRequests = deserializedResults.value().getObject()->payloads; // Use the getValueRequests. } else { // handle error. } 
ตัวอย่างการติดตั้งใช้งาน VHAL ที่ส่งผลลัพธ์สำหรับ getValues ผ่าน Binder จะแสดงอยู่ด้านล่าง
std::vectorresults = getResults(); GetValueResults parcelableResults; ScopedAStatus status = vectorToStableLargeParcelable(std::move(results), &parcelableResults); if (status.isOk()) { // Send parcelableResults through callback. } else { // Handle error. } 
