میان افزار تولید کنید

میان‌افزار زبان تعریف رابط خدمات خودرو (VSIDL) مجموعه‌ای از کتابخانه‌های Rust را تعریف می‌کند که یک لایه انتزاعی روی پشته ارتباطی وسیله نقلیه تعریف‌شده توسط نرم‌افزار (SDV) ایجاد می‌کند تا استفاده از اکوسیستم SDV را ساده کند. این میان‌افزار روشی استاندارد برای ارتباط و تعامل سرویس‌ها با یکدیگر فراهم می‌کند. هم کد تولید شده توسط VSIDLC و هم کد سفارشی شما از این کتابخانه‌ها استفاده می‌کنند.

کامپایلر زبان تعریف رابط خدمات خودرو (VSIDLC) تعاریف را اعتبارسنجی می‌کند، فایل‌های ساخت ( Android.bp ) حاوی اهداف genrule را برای تولید کد میان‌افزار Rust در طول فرآیند ساخت تولید می‌کند و پیکربندی‌های استقرار را از فایل‌های VSIDL و protobuf در یک کاتالوگ ایجاد می‌کند. شکل 1 ورودی به VSIDLC و خروجی تولید شده توسط VSIDLC را نشان می‌دهد:

ورودی‌ها و خروجی‌های VSIDLC

شکل 1. ورودی‌ها و خروجی‌های VSIDLC.

در ادامه توضیحی در مورد نمودار ارائه شده است:

  1. به عنوان ورودی، فایل‌های زیر را که در دایرکتوری‌هایی به نام کاتالوگ سازماندهی شده‌اند، ارائه می‌دهید:

    • فایل‌های پروتو (با پسوند .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 trait) منطق سمت سرور را پیاده‌سازی می‌کند.

    • یک ساختار 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 شما فایل‌های build، 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 به جای کد Rust، genrules Android.bp را تولید می‌کند. genrules هنگام اجرای m کد Rust لازم را درجا تولید می‌کند تا از قرار گرفتن مصنوعات تولید شده تحت کنترل نسخه جلوگیری شود.

    یک دایرکتوری generated_rs ایجاد می‌شود که شامل فایل Android.bp و فایل‌های میان‌افزار تولید شده است. این دایرکتوری در زیردایرکتوری‌های مربوط به نام‌های کامل بسته‌های سرویس تعریف شده شما سازماندهی شده است.

مدیریت وابستگی‌ها

به طور پیش‌فرض، VSIDLC فقط برای کاتالوگ اصلی کد تولید می‌کند، نه برای کاتالوگ‌های وابستگی. اگر کاتالوگ شما از انواع یا واحدهای سرویس تعریف شده در کاتالوگ‌های دیگر استفاده می‌کند، مسیر هر کاتالوگ وابستگی را با استفاده از پرچم -d مشخص کنید:

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

شما باید مسیرهایی را برای کل گراف وابستگی، از جمله وابستگی‌های انتقالی (وابستگی‌های وابستگی‌ها) ارائه دهید. برای مثال، فرض کنید درخت وابستگی کاتالوگ زیر را دارید:

مثال درخت وابستگی VSIDLC

شکل ۲. مثالی از درخت وابستگی VSIDLC.

برای تولید میان‌افزار برای هر کاتالوگ در درخت، باید دستورات زیر را اجرا کنید:

کاتالوگ هدف وابستگی‌ها فرمان
کاتالوگ اصلی SDV ناموجود vsidlc -o ./generated -c ./path/to/sdv_core_catalog
کاتالوگ تشخیصی کاتالوگ اصلی SDV vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog
کاتالوگ SOMEIP کاتالوگ تشخیصی، کاتالوگ اصلی SDV vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog
کاتالوگ OEM کاتالوگ تشخیصی، کاتالوگ SOMEIP، (به صورت گذرا) کاتالوگ اصلی SDV 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، از مقدار none استفاده کنید:

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

قدم بعدی چیست؟

پس از تولید میان‌افزار، به بخش «پیاده‌سازی منطق کسب‌وکار» مراجعه کنید.