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

شکل 1. ورودیها و خروجیهای VSIDLC.
در ادامه توضیحی در مورد نمودار ارائه شده است:
به عنوان ورودی، فایلهای زیر را که در دایرکتوریهایی به نام کاتالوگ سازماندهی شدهاند، ارائه میدهید:
- فایلهای پروتو (با پسوند
.proto) حاوی ساختارهای دادهای هستند که بین واحدهای سرویس تعریفشده توسط VSIDL رد و بدل میشوند. - فایلهای VSIDL (با پسوند
.vsidl) بستههای سرویس، واحدهای سرویس و مالکیت نوع واحد را تعریف میکنند. - فایلهای
Android.bpدر هر دایرکتوری کاتالوگ، اهداف ساختrust_protobufرا برای همه فایلهای proto درون کاتالوگ تعریف میکنند. VSIDLC ازcrate_nameمشخص شده در این اهداف برای ارجاع به انواع پیامهای protobuf تولید شده در Rust استفاده میکند.
- فایلهای پروتو (با پسوند
شما VSIDLC را برای خروجی گرفتن از فایلهای زیر اجرا میکنید:
فایلهای
Android.bpدر پوشهی هر بستهی سرویس تولید میشوند. اگر شما--genruleرا تنظیم کنید، این اهداف در طول فرآیند ساخت، فایلهای Rust بهروز تولید میکنند و وابستگیهای لازم کتابخانهیrust_protobufرا نیز شامل میشوند.فایلهای
service_bundle.rsبرای هر بسته سرویس ایجاد میشوند و شاملstructاصلی و توابع لازم برای تعامل با اجزای میانافزار هستند.فایلهای
lib.rsبرای هر سرویس RPC متعلق به یک بسته نرمافزاری تولید میشوند و در زیرپوشهای به نام سرویس RPC قرار میگیرند. این فایلها شامل موارد زیر هستند:یک ویژگی
Interfacetrait) منطق سمت سرور را پیادهسازی میکند.یک ساختار
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 شما فایلهای build، protobuf و VSIDL لازم را دارد.
دستور
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، genrulesAndroid.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.
برای تولید میانافزار برای هر کاتالوگ در درخت، باید دستورات زیر را اجرا کنید:
| کاتالوگ هدف | وابستگیها | فرمان |
|---|---|---|
| کاتالوگ اصلی 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
قدم بعدی چیست؟
پس از تولید میانافزار، به بخش «پیادهسازی منطق کسبوکار» مراجعه کنید.