בדף הזה מוסבר איך ליצור חבילת שירות של SDV, לארוז אותה בפורמט קובץ APEX ולהפעיל אותה במכשיר Cuttlefish וירטואלי. יחידות הקוד העיקריות שמופעלות במערכת ה-SDV הן חבילות השירות. חבילות שירות מספקות שיטות של מחזור חיים שהמערכת מבצעת כשמצב המערכת משתנה.
הגדרת סביבת ה-build
בספריית העבודה, מפעילים את הסקריפט
envsetup.shכדי להגדיר את סביבת ה-build, מגדירים את Cuttlefish כיעד ה-build ויוצרים את מחולל הקוד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 for Platform, ראו עריכת קובצי 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: מגדיר את תהליך ה-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: ["**/*"], }
מריצים את הפקודה הבאה כדי ליצור הטמעה בסיסית וקובצי תצורה:
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 של המוצר.
פותחים את קובץ ה-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 (או את המפתח שמשמש לחתימה עליו), אפשר גם ליצור ולפרוס שינויים איטרטיביים ישירות מסמל ה-gutter של
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) ואיך להגדיר חבילות שירות משלכם מאפס.