มิดเดิลแวร์ภาษาที่ใช้นิยามอินเทอร์เฟซบริการยานพาหนะ (VSIDL) กำหนดชุดไลบรารี Rust ที่สร้างเลเยอร์การแยกส่วนเหนือสแต็กการสื่อสารของยานพาหนะที่กำหนดโดยซอฟต์แวร์ (SDV) เพื่อลดความซับซ้อนในการใช้งานระบบนิเวศ SDV มิดเดิลแวร์จะมอบวิธีมาตรฐานให้แก่บริการต่างๆ ในการสื่อสารและโต้ตอบกัน ทั้งโค้ดที่ VSIDLC สร้างขึ้นและโค้ดที่กำหนดเองจะใช้ไลบรารีเหล่านี้
คอมไพเลอร์ภาษาคำจำกัดความของอินเทอร์เฟซบริการยานพาหนะ (VSIDLC) จะตรวจสอบความถูกต้องของคำจำกัดความ
สร้างไฟล์บิลด์ (Android.bp) ที่มีเป้าหมาย genrule
เพื่อสร้างโค้ดมิดเดิลแวร์ Rust ในระหว่างกระบวนการบิลด์ และสร้างการกำหนดค่าการติดตั้งใช้งาน
จากไฟล์ VSIDL และ protobuf ในแคตตาล็อก รูปที่ 1 แสดงอินพุตไปยัง VSIDLC และเอาต์พุตที่สร้างโดย VSIDLC ดังนี้
รูปที่ 1 อินพุตและเอาต์พุต VSIDLC
คำอธิบายแผนภาพมีดังนี้
คุณต้องระบุไฟล์ต่อไปนี้เป็นอินพุต โดยจัดระเบียบไว้ในไดเรกทอรีที่เรียกว่าแคตตาล็อก
- ไฟล์ Proto (นามสกุล
.proto) มีโครงสร้างข้อมูลที่ แลกเปลี่ยนระหว่างหน่วยบริการที่กำหนดโดย VSIDL - ไฟล์ VSIDL (ที่มีส่วนขยาย
.vsidl) จะกำหนดแพ็กเกจบริการ หน่วยบริการ และการเป็นเจ้าของประเภทหน่วย - ไฟล์
Android.bpในไดเรกทอรีแคตตาล็อกแต่ละรายการจะกำหนดrust_protobufเป้าหมายการสร้างสำหรับไฟล์ Proto ทั้งหมดภายในแคตตาล็อก VSIDLC ใช้crate_nameที่ระบุในเป้าหมายเหล่านี้เพื่ออ้างอิงประเภทข้อความ Protobuf ที่สร้างขึ้นใน Rust
- ไฟล์ Proto (นามสกุล
คุณเรียกใช้ VSIDLC เพื่อส่งออกไฟล์ต่อไปนี้
ระบบจะสร้างไฟล์
Android.bpในโฟลเดอร์ของแต่ละแพ็กเกจบริการ หากคุณตั้งค่า--genruleเป้าหมายเหล่านี้จะสร้างไฟล์ Rust ที่เป็นข้อมูลล่าสุดในระหว่าง กระบวนการบิลด์ และรวมทรัพยากร Dependencyrust_protobufไลบรารี ที่จำเป็นระบบจะสร้างไฟล์
service_bundle.rsสำหรับแต่ละแพ็กเกจบริการและมีstructหลักและฟังก์ชันสำหรับการโต้ตอบกับคอมโพเนนต์มิดเดิลแวร์ระบบจะสร้างไฟล์
lib.rsสำหรับบริการ RPC แต่ละรายการที่เป็นของแพ็กเกจและจะ วางไว้ในโฟลเดอร์ย่อยที่มีชื่อตามบริการ RPC ไฟล์ที่ Apple สำรองข้อมูล ได้แก่Interfaceลักษณะจะใช้ตรรกะฝั่งเซิร์ฟเวอร์Clientstruct จะทำการเรียกไปยังบริการ RPCระบบจะสร้างไฟล์
diagnostics.rsหากมีdiagnostics_declarationในไฟล์ VSIDL ซึ่งจะให้การเชื่อมโยงที่จำเป็นสำหรับการวินิจฉัยที่อิงตาม UDSระบบจะสร้างการกำหนดค่าการติดตั้งใช้งานและความปลอดภัยเมื่อใช้แฟล็ก
--apexไฟล์เหล่านี้จะอยู่ในไดเรกทอรีapex/และconfigs/รวมถึง ไฟล์การจัดการเป็นกลุ่ม.textprotoและนโยบายความปลอดภัย (สิทธิ์) ที่จำเป็นสำหรับการสื่อสารระหว่างบริการระบบจะสร้างบอยเลอร์เพลตของบริการเมื่อใช้แฟล็ก
--servicesซึ่งจะอยู่ในไดเรกทอรีservices/และมีโครงร่างแอปพลิเคชัน Rust รวมถึงไฟล์main.rsเพื่อช่วยให้คุณเริ่มต้นใช้งานได้ทันที
เรียกใช้ VSIDLC
วิธีเรียกใช้ VSIDLC
หากยังไม่ได้ตั้งค่าสภาพแวดล้อม ให้เรียกใช้
source build/envsetup.shเรียกใช้คำสั่งต่อไปนี้เพื่อสร้าง VSIDLC
m vsidlcตรวจสอบว่าไดเรกทอรีแคตตาล็อก VSIDL มีไฟล์บิลด์ Protobuf และ VSIDL ที่จำเป็น
เรียกใช้คำสั่ง
vsidlcvsidlc -c path_to_catalog -o output_directory -pสถานที่:
-c path_to_catalogระบุเส้นทางไปยังไดเรกทอรีแคตตาล็อกหลัก-o output_directoryระบุไดเรกทอรีหลัก ที่สร้างไดเรกทอรีเอาต์พุตgenerated_rs- (ไม่บังคับ)
--apexสร้างอาร์ติแฟกต์การกำหนดค่าการจัดการเป็นกลุ่มและการรักษาความปลอดภัย - (ไม่บังคับ)
--servicesสร้างโครงร่างแอปพลิเคชัน Rust ที่พร้อมใช้งาน - (ไม่บังคับ)
-pจะลบไดเรกทอรีที่สร้างไว้แล้ว (เช่นgenerated_rs, และหากมีapex,configsหรือservices) ก่อนสร้างไฟล์ใหม่ - (ไม่บังคับ)
--genruleจะสร้างAndroid.bpgenrules แทนโค้ด Rust genrules จะสร้างโค้ด Rust ที่จำเป็นในทันทีเมื่อเรียกใช้mเพื่อ หลีกเลี่ยงการวางอาร์ติแฟกต์ที่สร้างขึ้นภายใต้การควบคุมเวอร์ชัน
ระบบจะสร้างไดเรกทอรี
generated_rsที่มีAndroid.bpและไฟล์มิดเดิลแวร์ที่สร้างขึ้น ไดเรกทอรีนี้จะจัดระเบียบภายในไดเรกทอรีย่อย ที่สอดคล้องกับชื่อแบบสมบูรณ์ในตัวเองของแพ็กเกจบริการที่คุณกำหนด
จัดการทรัพยากร Dependency
โดยค่าเริ่มต้น VSIDLC จะสร้างโค้ดสำหรับแคตตาล็อกหลักเท่านั้น ไม่ใช่แคตตาล็อก
การอ้างอิง หากแคตตาล็อกใช้ประเภทหรือหน่วยบริการที่กำหนดไว้ในแคตตาล็อกอื่นๆ
ให้ระบุเส้นทางไปยังแคตตาล็อกการอ้างอิงแต่ละรายการโดยใช้แฟล็ก -d ดังนี้
vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...
คุณต้องระบุเส้นทางสำหรับกราฟทรัพยากร Dependency ทั้งหมด รวมถึงทรัพยากร Dependency แบบทรานซิทีฟ (ทรัพยากร Dependency ของทรัพยากร Dependency) ตัวอย่างเช่น สมมติว่าคุณมีแผนผังทรัพยากร Dependency ของแคตตาล็อกต่อไปนี้
รูปที่ 2 ตัวอย่างแผนผังการขึ้นต่อกันของ VSIDLC
หากต้องการสร้างมิดเดิลแวร์สำหรับแคตตาล็อกแต่ละรายการในโครงสร้าง คุณต้องเรียกใช้คำสั่งต่อไปนี้
| แคตตาล็อกเป้าหมาย | ความสัมพันธ์ | คำสั่ง |
|---|---|---|
| แคตตาล็อก SDV Core | ไม่มี | vsidlc -o ./generated -c ./path/to/sdv_core_catalog |
| แคตตาล็อกการวินิจฉัย | แคตตาล็อก SDV Core | vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| แคตตาล็อก SOMEIP | แคตตาล็อกการวินิจฉัย แคตตาล็อก SDV Core | vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| แคตตาล็อก OEM | แคตตาล็อกการวินิจฉัย แคตตาล็อก SOMEIP (แคตตาล็อก SDV Core โดยอ้อม) | vsidlc -o ./generated -c ./path/to/oem_catalog -d ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
จัดรูปแบบเอาต์พุต Rust
โดยค่าเริ่มต้น VSIDL จะใช้ rustfmt เพื่อจัดรูปแบบเอาต์พุต Rust หากต้องการให้ค่าเริ่มต้นทำงานอย่างถูกต้อง ให้ตั้งค่าตัวแปรสภาพแวดล้อม $ANDROID_BUILD_TOP หรือตัวแปรสภาพแวดล้อม RUSTFMT_PATH และ RUSTFMT_TOML_PATH หากต้องการเปลี่ยนรูปแบบเริ่มต้นที่ Rust แสดงผล ให้ใช้ตัวเลือก --rust-formatter กับ pretty-please หรือ none
หากต้องการเปลี่ยนรูปแบบเอาต์พุตเป็น Crate
prettypleaseให้ใช้ค่าpretty-pleasevsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-pleaseหากต้องการเปลี่ยนรูปแบบเอาต์พุตเป็นไม่มี ให้ใช้ค่า
nonevsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
ขั้นตอนถัดไป
หลังจากสร้างมิดเดิลแวร์แล้ว ให้ดูใช้ตรรกะทางธุรกิจ