إنشاء برامج وسيطة

تحدّد البرمجيات الوسيطة للغة تعريف واجهة خدمات المركبات (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 حديثة أثناء عملية التصميم وتتضمّن تبعيات مكتبة rust_protobuf اللازمة.

    • يتم إنشاء ملفات service_bundle.rs لكل حزمة خدمات، وتحتوي على struct الرئيسية ووظائف التفاعل مع مكونات البرامج الوسيطة.

    • يتم إنشاء ملفات lib.rs لكل خدمة RPC يملكها حزمة، ويتم وضعها في مجلد فرعي يحمل اسم خدمة RPC. وتشمل هذه الملفات ما يلي:

    • تنفِّذ سمة Interface قواعد المنطق من جهة الخادم.

    • تُجري بنية Client عمليات استدعاء لخدمة 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 وملفات البرامج الوسيطة التي تم إنشاؤها. يتم تنظيم هذا الدليل ضمن أدلة فرعية تتوافق مع الأسماء المؤهَّلة بالكامل لحِزم الخدمات المحدَّدة.

التعامل مع التبعيات

تنشئ أداة VSIDLC تلقائيًا رمزًا برمجيًا للكتالوج الرئيسي فقط، وليس لكتالوجات التبعية. إذا كان الكتالوج يستخدم أنواعًا أو وحدات خدمة محدّدة في كتالوجات أخرى، حدِّد مسار كل كتالوج تابع باستخدام العلامة -d:

vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...

يجب توفير مسارات للرسم البياني الكامل للاعتمادية، بما في ذلك الاعتماديات المتعدية (الاعتماديات التابعة للاعتماديات). على سبيل المثال، لنفترض أنّ لديك شجرة تبعية الفهرس التالية:

مثال على شجرة الاعتمادية 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
قائمة المصنّعين الأصليين قائمة بيانات التشخيص وقائمة 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:

  • لتغيير تنسيق الإخراج إلى حزمة 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
    

الخطوات التالية

بعد إنشاء البرامج الوسيطة، اطّلِع على تنفيذ منطق نشاطك التجاري.