इस पेज पर, एसडीवी सर्विस बंडल बनाने का तरीका बताया गया है. साथ ही, इसे APEX फ़ाइल फ़ॉर्मैट में पैक करने और वर्चुअल Cuttlefish डिवाइस पर एक्ज़ीक्यूट करने का तरीका बताया गया है. एसडीवी सिस्टम पर कोड एक्ज़ीक्यूट करने की मुख्य इकाइयां, सर्विस बंडल होती हैं. सर्विस बंडल, लाइफ़साइकल के ऐसे तरीके उपलब्ध कराते हैं जिन्हें सिस्टम, सिस्टम की स्थिति बदलने पर एक्ज़ीक्यूट करता है.
बिल्ड एनवायरमेंट सेट अप करना
अपनी वर्किंग डायरेक्ट्री में जाकर,
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: ["**/*"], }.protoफ़ाइल, कैटलॉग में मौजूद सिर्फ़ एक लाइब्रेरी टारगेट से जुड़ी हो, ताकि कोई भ्रम न हो.
इस कमांड को चलाकर, स्केलेटन इंप्लीमेंटेशन और कॉन्फ़िगरेशन फ़ाइलें जनरेट करें:
vsidlc -c /path/to/catalog -o /path/to/output --services --apexहर सेवा बंडल के लिए,
/path/to/output/services/ServiceBundleName/src/main.rsमें Rust को लागू करने का तरीका देखें.डिफ़ॉल्ट रूप से, जनरेट किया गया कोड, डिफ़ॉल्ट वैल्यू वाले मैसेज बनाता है. साथ ही, उन्हें पब्लिशर और सदस्य या आरपीसी क्लाइंट और सर्वर के बीच भेजता है. इस व्यवहार में बदलाव करने के लिए,
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 } } }
अगला कदम क्या है
Vehicle Services Interface Definition Language (VSIDL) के बारे में ज़्यादा जानें. साथ ही, यह भी जानें कि अपने सर्विस बंडल को शुरू से कैसे तय किया जाता है.