این صفحه به شما نشان میدهد که چگونه یک بسته سرویس SDV ایجاد کنید، آن را در قالب فایل APEX بستهبندی کنید و آن را روی یک دستگاه مجازی Cuttlefish اجرا کنید. واحدهای اصلی اجرای کد در سیستم SDV، بستههای سرویس هستند. بستههای سرویس، متدهای چرخه عمر را ارائه میدهند که سیستم هنگام تغییر وضعیت سیستم اجرا میکند.
محیط ساخت خود را تنظیم کنید
از داخل دایرکتوری کاری خود، اسکریپت
envsetup.shرا برای تنظیم محیط ساخت خود سورس کنید، Cuttlefish را به عنوان هدف ساخت تنظیم کنید و مولد کدvsidlcرا بسازید:source build/envsetup.sh lunch sdv_core_cf-trunk_staging-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: بستههای سرویس و ارتباط آنها را تعریف میکند:
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: ["**/*"], }
با اجرای دستور زیر، یک پیادهسازی اسکلتی و فایلهای پیکربندی ایجاد کنید:
vsidlc -c /path/to/catalog -o /path/to/output --services --apexبرای هر بسته سرویس، پیادهسازی Rust را در
/path/to/output /services/ ServiceBundleName /src/main.rsپیدا کنید.به طور پیشفرض، پیادهسازی تولید شده پیامهایی با مقادیر پیشفرض ایجاد میکند و آنها را بین ناشران و مشترکین یا کلاینتها و سرورهای RPC ارسال میکند. برای تغییر این رفتار، به دنبال نظرات
TODOدرmain.rsبگردید و آنها را مطابق با تنظیمات خود تنظیم کنید. به عنوان مثال:async fn handle_tire_pressure_front_left_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#FRONT_LEFT"); publisher.publish(&message).unwrap(); } }برای افزودن بسته نرمافزاری خود به تصویر سیستم، نام ماژول APEX تولید شده را به فایل ساخت محصول خود اضافه کنید.
فایل ساخت محصول خود را باز کنید (برای مثال،
/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اجرای بسته سرویس را اجرا و تأیید کنید:
یک دستگاه مجازی 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) و نحوه تعریف بستههای خدمات خود از ابتدا بیشتر بدانید.