این صفحه به شما نشان میدهد که چگونه یک بسته سرویس SDV ایجاد کنید، آن را در قالب فایل APEX بستهبندی کنید، و آن را در یک دستگاه مجازی Cuttlefish اجرا کنید. واحدهای اصلی اجرای کد در سیستم «خودروی نرمافزارمحور» دستههای سرویس هستند. دستههای سرویس روشهای چرخه حیاتی را ارائه میدهند که سیستم هنگام تغییر وضعیت سیستم اجرا میکند.
راهاندازی محیط ساخت
از درون فهرست راهنمای کاریتان، اسکریپت
envsetup.shرا منبع قرار دهید تا محیط ساختتان را راهاندازی کنید، Cuttlefish را بهعنوان هدف ساخت تنظیم کنید، و تولیدکننده کدvsidlcرا بسازید:source build/envsetup.sh lunch sdv_core_cf-aosp_current-userdebug m vsidlcبا ایجاد پوشهای به نام
my_catalogبا این فایلها، معماریتان را تعریف کنید:tire.proto: ساختار دادهای را که ارسال میکنید تعریف میکند:syntax = "proto3"; package com.android.sdv.sample.quickstart; import "google/protobuf/empty.proto"; import "sdv/vsidl/v1/annotations.proto"; message TirePressure { uint32 pressure = 1; } message TireInfoResponse { string serial_number = 1; uint32 max_pressure = 2; } service TireService { rpc GetTireInfo(google.protobuf.Empty) returns (TireInfoResponse); }architecture.vsidl: دستههای سرویس و ارتباط آنها را تعریف میکند (برای برجستهسازی نحو، اعتبارسنجی، و تکمیل خودکار در Android Studio برای پلاتفرم، به ویرایش فایلهای VSIDL مراجعه کنید):package: "com.android.sdv.sample.quickstart" service_bundle { name: "Manager" publisher { message: "TirePressure" topic: "pressure" capacity: 8 } server { service: "TireService" channel: "tire-service" } } service_bundle { name: "Monitor" subscriber { message: "TirePressure" topic: "pressure" } client { service: "TireService" channel: "tire-service" } }Android.bp: فرایند ساخت را تعریف میکند: برای پرهیز از ابهام، تأیید کنید که هر فایلrust_protobuf { name: "libquickstart_sample_tire_proto", crate_name: "quickstart_sample_tire_proto", protos: [ "tire.proto", ], source_stem: "quickstart_sample_tire_proto_source", rustlibs: [ "libvsidl_v1_stdlib_proto_rs", ], proto_flags: [ "-I external/protobuf/src", ], vendor_available: true, product_available: true, apex_available: [ "//apex_available:platform", "//apex_available:anyapex", ], min_sdk_version: "35", } filegroup { name: "vsidl_quickstart_catalog", srcs: ["**/*"], }.protoفقط به یک هدف کتابخانه در کاتالوگ تعلق دارد.
با اجرای دستور زیر، فایلهای پیکربندی و پیادهسازی اسکلت را تولید کنید:
vsidlc -c /path/to/catalog -o /path/to/output --services --apexبرای هر بسته سرویس، پیادهسازی Rust را در
/path/to/output/services/ServiceBundleName/src/main.rsپیدا کنید.بهطور پیشفرض، پیادهسازی تولیدشده پیامهایی با مقادیر پیشفرض ایجاد میکند و آنها را بین ناشران و مشترکان یا کارخواهها و سرورهای RPC ارسال میکند. برای اصلاح این رفتار، نظرات
TODOرا درmain.rsجستجو کنید و آنها را مطابق با اولویتهایتان تنظیم کنید. برای مثال:rust async fn handle_tire_pressure_pressure_publisher(publisher: sdv::mw::Publisher<TirePressure>) { loop { // TODO: Modify the frequency of publishing messages here. sleep(Duration::from_secs(1)).await; // TODO: Modify the message content here. let message = TirePressure::default(); info!("Publishing on TirePressure#PRESSURE"); publisher.publish(&message).unwrap(); } }برای گنجاندن بستهتان در تصویر سیستم، نام واحد APEX تولیدشده را به فایل makefile محصولتان اضافه کنید.
فایل ساخت محصولتان را باز کنید (برای مثال،
device/google/sdv/sdv_core_base/sdv_samples_core_services.mk).با افزودن موارد زیر، واحد را به
PRODUCT_PACKAGESاضافه کنید:PRODUCT_PACKAGES += com.android.sdv.sample.quickstart PRODUCT_PACKAGES += com_android_sdv_sample_quickstart_orchestration_configurations
تصویر را بساز:
mپساز اینکه تصویر سیستم شامل APEX (یا کلید استفادهشده برای امضای آن) شد، میتوانید تغییرات تکراری را مستقیماً از نماد حاشیه
apex/Android.bpدر Android Studio for Platform بسازید و مستقر کنید. برای اطلاعات بیشتر، به استقرار بستههای سرویس SDV مراجعه کنید.اجرا و تأیید اجرای بسته سرویس:
دستگاه Cuttlefish مجازی را راهاندازی کنید:
sdv-cf create --instance_name=instance1اجرای بسته سرویس هنگام راهاندازی سیستم:
بهصورت دستی:
adb wait-for-device adb root adb shell sdv_service_bundle start local-vm:com.android.sdv.sample.quickstart.Manager/instance adb shell sdv_service_bundle start local-vm:com.android.sdv.sample.quickstart.Monitor/instanceاستفاده از هماهنگکننده:
adb wait-for-device adb root # Apply global orchestration configuration by setting system property adb shell setprop persist.sdv.orchestrator_config_path "etc/orch/vm_quickstart_orch_config.textproto" adb reboot
اجرای بسته سرویس را تأیید کنید:
adb logcat *:F com_android_sdv_sample_quickstart_Manager_instance:* com_android_sdv_sample_quickstart_Monitor_instance:*این فرمان گزارشهایی را نمایش میدهد که نشاندهنده تبادل پیام بین بستههای سرویس است:
03-30 13:41:31.505 967 976 I com_android_sdv_sample_quickstart_Manager_instance: sdv_lm_manager: Publishing on TirePressure#PRESSURE 03-30 13:41:31.505 983 991 I com_android_sdv_sample_quickstart_Monitor_instance: sdv_lm_monitor: Received message on TirePressure#PRESSURE: [TirePressure { pressure: 0, special_fields: SpecialFields { unknown_fields: UnknownFields { fields: None }, cached_size: CachedSize { size: 0 } } }] 03-30 13:41:31.626 983 991 I com_android_sdv_sample_quickstart_Monitor_instance: sdv_lm_monitor: Sending request on Monitor/TireService 03-30 13:41:31.627 967 976 I com_android_sdv_sample_quickstart_Manager_instance: sdv_lm_manager: Received request on Manager/TireService: Empty { special_fields: SpecialFields { unknown_fields: UnknownFields { fields: None }, cached_size: CachedSize { size: 0 } } } 03-30 13:41:31.627 983 991 I com_android_sdv_sample_quickstart_Monitor_instance: sdv_lm_monitor: Received response on Monitor/TireService: TireInfoResponse { serial_number: "", max_pressure: 0, special_fields: SpecialFields { unknown_fields: UnknownFields { fields: None }, cached_size: CachedSize { size: 0 } } }
قدم بعدی چیست
درباره زبان تعریف میانای خدمات خودرو (VSIDL) و نحوه تعریف کردن بستههای خدمات خودتان از ابتدا بیشتر بدانید.