Halaman ini menunjukkan cara membuat paket layanan SDV, mengemasnya ke dalam format file APEX, dan menjalankannya di perangkat Cuttlefish virtual. Unit utama eksekusi kode pada sistem SDV adalah paket layanan. Paket layanan menyediakan metode siklus proses yang dijalankan sistem saat status sistem berubah.
Menyiapkan lingkungan build
Dari dalam direktori kerja, ambil skrip
envsetup.shuntuk menyiapkan lingkungan build, tetapkan Cuttlefish sebagai target build, dan bangun generator kodevsidlc:source build/envsetup.sh lunch sdv_core_cf-aosp_current-userdebug m vsidlcTentukan arsitektur Anda dengan membuat folder bernama
my_catalogdengan file berikut:tire.proto: Menentukan struktur data yang Anda kirim: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: Menentukan paket layanan dan komunikasinya (untuk penandaan sintaksis, validasi, dan pelengkapan otomatis di Android Studio for Platform, lihat Mengedit file 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: Menentukan proses build: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: ["**/*"], }
Buat implementasi skeleton dan file konfigurasi dengan menjalankan:
vsidlc -c /path/to/catalog -o /path/to/output --services --apexUntuk setiap paket layanan, temukan implementasi Rust di
/path/to/output/services/ServiceBundleName/src/main.rs.Secara default, implementasi yang dihasilkan membuat pesan dengan nilai default dan mengirimkannya antara penayang dan pelanggan atau klien dan server RPC. Untuk mengubah perilaku ini, cari komentar
TODOdimain.rsdan sesuaikan dengan preferensi Anda. Contoh:rust 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(); } }Untuk menyertakan paket Anda dalam image sistem, tambahkan nama modul APEX yang dihasilkan ke makefile produk Anda.
Buka makefile produk Anda (misalnya,
/device/google/sdv/sdv_core_base/sdv_samples_core_services.mk).Tambahkan modul ke
PRODUCT_PACKAGESdengan menambahkan:PRODUCT_PACKAGES += com.android.sdv.sample.quickstart PRODUCT_PACKAGES += com_android_sdv_sample_quickstart_orchestration_configurations
Buat gambar:
mSetelah image sistem menyertakan APEX (atau kunci yang digunakan untuk menandatanganinya), Anda juga dapat mem-build dan men-deploy perubahan iteratif langsung dari ikon gutter
apex/Android.bpdi Android Studio for Platform. Untuk mengetahui informasi selengkapnya, lihat Men-deploy paket layanan SDV.Jalankan dan verifikasi eksekusi paket layanan:
Mulai perangkat Cuttlefish virtual:
sdv-cf create --instance_name=instance1Jalankan paket layanan saat sistem di-booting:
Secara manual
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/instanceOrkestrator
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 rebootVerifikasi eksekusi paket layanan:
adb logcat *:F com_android_sdv_sample_quickstart_Manager_instance:* com_android_sdv_sample_quickstart_Monitor_instance:*Perintah ini menampilkan log yang menunjukkan paket layanan yang bertukar pesan:
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 } } }
Langkah berikutnya
Pelajari lebih lanjut Vehicle Services Interface Definition Language (VSIDL) dan cara menentukan paket layanan Anda sendiri dari awal.