สร้างมิดเดิลแวร์

มิดเดิลแวร์ภาษาที่ใช้นิยามอินเทอร์เฟซบริการยานพาหนะ (VSIDL) กำหนดชุดไลบรารี Rust ที่สร้างเลเยอร์การแยกส่วนเหนือสแต็กการสื่อสารของยานพาหนะที่กำหนดโดยซอฟต์แวร์ (SDV) เพื่อลดความซับซ้อนในการใช้งานระบบนิเวศ SDV มิดเดิลแวร์จะมอบวิธีมาตรฐานให้แก่บริการต่างๆ ในการสื่อสารและโต้ตอบกัน ทั้งโค้ดที่ VSIDLC สร้างขึ้นและโค้ดที่กำหนดเองจะใช้ไลบรารีเหล่านี้

คอมไพเลอร์ภาษาคำจำกัดความของอินเทอร์เฟซบริการยานพาหนะ (VSIDLC) จะตรวจสอบความถูกต้องของคำจำกัดความ สร้างไฟล์บิลด์ (Android.bp) ที่มีเป้าหมาย genrule เพื่อสร้างโค้ดมิดเดิลแวร์ Rust ในระหว่างกระบวนการบิลด์ และสร้างการกำหนดค่าการติดตั้งใช้งาน จากไฟล์ VSIDL และ protobuf ในแคตตาล็อก รูปที่ 1 แสดงอินพุตไปยัง VSIDLC และเอาต์พุตที่สร้างโดย VSIDLC ดังนี้

อินพุตและเอาต์พุต VSIDLC

รูปที่ 1 อินพุตและเอาต์พุต VSIDLC

คำอธิบายแผนภาพมีดังนี้

  1. คุณต้องระบุไฟล์ต่อไปนี้เป็นอินพุต โดยจัดระเบียบไว้ในไดเรกทอรีที่เรียกว่าแคตตาล็อก

    • ไฟล์ Proto (นามสกุล .proto) มีโครงสร้างข้อมูลที่ แลกเปลี่ยนระหว่างหน่วยบริการที่กำหนดโดย VSIDL
    • ไฟล์ VSIDL (ที่มีส่วนขยาย .vsidl) จะกำหนดแพ็กเกจบริการ หน่วยบริการ และการเป็นเจ้าของประเภทหน่วย
    • ไฟล์ Android.bp ในไดเรกทอรีแคตตาล็อกแต่ละรายการจะกำหนดrust_protobuf เป้าหมายการสร้างสำหรับไฟล์ Proto ทั้งหมดภายในแคตตาล็อก VSIDLC ใช้ crate_name ที่ระบุในเป้าหมายเหล่านี้เพื่ออ้างอิงประเภทข้อความ Protobuf ที่สร้างขึ้นใน Rust
  2. คุณเรียกใช้ VSIDLC เพื่อส่งออกไฟล์ต่อไปนี้

    • ระบบจะสร้างไฟล์ Android.bp ในโฟลเดอร์ของแต่ละแพ็กเกจบริการ หากคุณตั้งค่า --genrule เป้าหมายเหล่านี้จะสร้างไฟล์ Rust ที่เป็นข้อมูลล่าสุดในระหว่าง กระบวนการบิลด์ และรวมทรัพยากร Dependency rust_protobufไลบรารี ที่จำเป็น

    • ระบบจะสร้างไฟล์ service_bundle.rs สำหรับแต่ละแพ็กเกจบริการและมีstruct หลักและฟังก์ชันสำหรับการโต้ตอบกับคอมโพเนนต์มิดเดิลแวร์

    • ระบบจะสร้างไฟล์ lib.rs สำหรับบริการ RPC แต่ละรายการที่เป็นของแพ็กเกจและจะ วางไว้ในโฟลเดอร์ย่อยที่มีชื่อตามบริการ RPC ไฟล์ที่ Apple สำรองข้อมูล ได้แก่

    • Interface ลักษณะจะใช้ตรรกะฝั่งเซิร์ฟเวอร์

    • Client struct จะทำการเรียกไปยังบริการ RPC

    • ระบบจะสร้างไฟล์ diagnostics.rs หากมี diagnostics_declaration ในไฟล์ VSIDL ซึ่งจะให้การเชื่อมโยงที่จำเป็นสำหรับการวินิจฉัยที่อิงตาม UDS

    • ระบบจะสร้างการกำหนดค่าการติดตั้งใช้งานและความปลอดภัยเมื่อใช้แฟล็ก --apex ไฟล์เหล่านี้จะอยู่ในไดเรกทอรี apex/ และ configs/ รวมถึง ไฟล์การจัดการเป็นกลุ่ม .textproto และนโยบายความปลอดภัย (สิทธิ์) ที่จำเป็นสำหรับการสื่อสารระหว่างบริการ

    • ระบบจะสร้างบอยเลอร์เพลตของบริการเมื่อใช้แฟล็ก --services ซึ่งจะอยู่ในไดเรกทอรี services/ และมีโครงร่างแอปพลิเคชัน Rust รวมถึงไฟล์ main.rs เพื่อช่วยให้คุณเริ่มต้นใช้งานได้ทันที

เรียกใช้ VSIDLC

วิธีเรียกใช้ VSIDLC

  1. หากยังไม่ได้ตั้งค่าสภาพแวดล้อม ให้เรียกใช้ source build/envsetup.sh

  2. เรียกใช้คำสั่งต่อไปนี้เพื่อสร้าง VSIDLC

    m vsidlc
    
  3. ตรวจสอบว่าไดเรกทอรีแคตตาล็อก VSIDL มีไฟล์บิลด์ Protobuf และ VSIDL ที่จำเป็น

  4. เรียกใช้คำสั่ง vsidlc

    vsidlc -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.bp genrules แทนโค้ด 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 ของแคตตาล็อกต่อไปนี้

ตัวอย่างแผนผังการขึ้นต่อกันของ VSIDLC

รูปที่ 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-please

    vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-please
    
  • หากต้องการเปลี่ยนรูปแบบเอาต์พุตเป็นไม่มี ให้ใช้ค่า none

    vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
    

ขั้นตอนถัดไป

หลังจากสร้างมิดเดิลแวร์แล้ว ให้ดูใช้ตรรกะทางธุรกิจ