תוכנת הביניים Vehicle Services Interface Definition Language (VSIDL) מגדירה קבוצה של ספריות Rust שיוצרות שכבת הפשטה מעל מחסנית התקשורת של הרכב מוגדר התוכנה (SDV), כדי לפשט את השימוש במערכת האקולוגית של ה-SDV. תוכנת הביניים מספקת דרך סטנדרטית לשירותים לתקשר ולקיים אינטראקציה זה עם זה. הספריות האלה משמשות גם את הקוד שנוצר על ידי VSIDLC וגם את הקוד המותאם אישית שלכם.
הקומפיילר Vehicle Services Interface Definition Language (VSIDLC) מאמת הגדרות, יוצר קובצי build (Android.bp) שמכילים יעדי genrule ליצירת קוד middleware של Rust במהלך תהליך ה-build, ויוצר הגדרות פריסה מקובצי ה-VSIDL ו-protobuf בקטלוג. באיור 1 מוצג קלט ל-VSIDLC ופלט שנוצר על ידי VSIDLC:
איור 1. קלטים ופלטים של VSIDLC.
הסבר על התרשים:
כקלט, אתם מספקים את הקבצים הבאים שמאורגנים בתוך ספריות שנקראות קטלוגים:
- קובצי Proto (עם הסיומת
.proto) מכילים מבני נתונים שמועברים בין יחידות השירות שהוגדרו על ידי VSIDL. - קבצים מסוג VSIDL (עם הסיומת
.vsidl) מגדירים חבילות שירות, יחידות שירות ובעלות על סוג יחידה. - קבצי
Android.bpבכל ספריית קטלוג מגדירים יעדי בנייה שלrust_protobufלכל קובצי ה-proto בקטלוג. VSIDLC משתמש ב-crate_nameשצוין ביעדים האלה כדי להפנות לסוגי הודעות ה-protobuf שנוצרו ב-Rust.
- קובצי Proto (עם הסיומת
מריצים את VSIDLC כדי ליצור את הקבצים הבאים:
Android.bpהקבצים נוצרים בתיקייה של כל חבילת שירותים. אם מגדירים את--genrule, היעדים האלה יוצרים קובצי Rust עדכניים במהלך תהליך ה-build וכוללים את יחסי התלות הנדרשים בספרייתrust_protobuf.קובצי
service_bundle.rsנוצרים לכל חבילת שירותים ומכילים אתstructוהפונקציות העיקריות לאינטראקציה עם רכיבי תוכנת הביניים.קובצי
lib.rsנוצרים לכל שירות RPC שנמצא בבעלות חבילה, והם ממוקמים בתיקיית משנה שנקראת על שם שירות ה-RPC. הקבצים האלה כוללים:מאפיין
Interfaceמטמיע את הלוגיקה בצד השרת.מבנה
Clientשולח קריאות לשירות RPC.קובצי
diagnostics.rsנוצרים אם ישdiagnostics_declarationבקובץ VSIDL, ומספקים את הקישורים הנדרשים לאבחון מבוסס UDS.הגדרות הפריסה והאבטחה נוצרות כשמשתמשים בדגל
--apex. הם ממוקמים בספריותapex/ו-configs/וכוללים קבצי תזמור.textprotoומדיניות אבטחה (הרשאות) שנדרשים לתקשורת בין שירותים.כשמשתמשים בדגל
--services, נוצרת תבנית של שירות. הקובץ הזה ממוקם בספרייהservices/ומכיל שלד של אפליקציית Rust, כולל קובץmain.rs, כדי להאיץ את ההטמעה.
הרצת VSIDLC
כדי להריץ את VSIDLC:
אם לא הגדרתם את הסביבה, מריצים את הפקודה
source build/envsetup.sh.מריצים את הפקודה הבאה כדי ליצור את VSIDLC:
m vsidlcמוודאים שבספריית הקטלוג של VSIDL יש את הקבצים הנדרשים של build, protobuf ו-VSIDL.
חשוב לוודא שכל קובץ פרוטו שייך רק ליעד ספרייה אחד בקטלוג.מריצים את הפקודה
vsidlc:vsidlc -c path_to_catalog -o output_directory -pכאשר:
-
-c path_to_catalogמציין את הנתיב לספריית הקטלוג הראשית. -
-o output_directoryהוא המזהה של ספריית ההורה שבה נוצרת ספריית הפלטgenerated_rs. - (אופציונלי)
--apexיוצרת ארטיפקטים של תזמור והגדרות אבטחה. - (אופציונלי)
--servicesיוצר שלד של אפליקציית Rust להפעלה מהירה. - (optional)
-pמוחק ספריות קיימות שנוצרו (כמוgenerated_rs, ואם רלוונטיapex,configsאוservices) לפני יצירת קבצים חדשים. - (אופציונלי)
--genruleיוצרAndroid.bpgenrules במקום קוד Rust. הפקודה genrules יוצרת את קוד Rust הנדרש תוך כדי הפעלה שלmכדי למנוע הוספה של ארטיפקטים שנוצרו לניהול גרסאות.
נוצרת ספרייה
generated_rsשמכילה קובץAndroid.bpואת קובצי התוכנה שמתווכים בין האפליקציה למערכת ההפעלה (middleware) שנוצרו. הספרייה הזו מאורגנת בספריות משנה שמתאימות לשמות המלאים של חבילות השירותים שהגדרתם.-
טיפול ביחסי תלות
כברירת מחדל, VSIDLC יוצר קוד רק לקטלוג הראשי, ולא לקטלוגים של יחסי תלות. אם בקטלוג שלכם נעשה שימוש בסוגים או ביחידות שירות שמוגדרים בקטלוגים אחרים,
צריך לציין את הנתיב לכל קטלוג תלות באמצעות הדגל -d:
vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...
צריך לספק נתיבים לכל גרף התלות, כולל תלויות טרנזיטיביות (תלויות של תלויות). לדוגמה, נניח שיש לכם את עץ התלות הבא בקטלוג:
איור 2. דוגמה לעץ תלות של VSIDLC.
כדי ליצור תוכנת ביניים לכל קטלוג בעץ, צריך להריץ את הפקודות הבאות:
| קטלוג היעד | פניות קשורות | פקודה |
|---|---|---|
| קטלוג הליבה של SDV | לא רלוונטי | vsidlc -o ./generated -c ./path/to/sdv_core_catalog |
| קטלוג האבחון | קטלוג הליבה של SDV | vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| קטלוג SOMEIP | קטלוג האבחון, קטלוג הליבה של SDV | vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| קטלוג OEM | קטלוג האבחון, קטלוג SOMEIP, (באופן טרנזיטיבי) קטלוג SDV Core | vsidlc -o ./generated -c ./path/to/oem_catalog -d ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
עיצוב הפלט של Rust
כברירת מחדל, VSIDL משתמש ב-rustfmt כדי לעצב את הפלט של Rust. כדי שברירת המחדל תפעל בצורה תקינה, צריך להגדיר את משתנה הסביבה $ANDROID_BUILD_TOP או את משתני הסביבה RUSTFMT_PATH ו-RUSTFMT_TOML_PATH. כדי לשנות את פורמט ברירת המחדל ש-Rust מוציא, משתמשים באפשרות --rust-formatter עם pretty-please או none:
כדי לשנות את פורמט הפלט ל-crate
prettyplease, משתמשים בערךpretty-please:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-pleaseכדי לשנות את פורמט הפלט ל'ללא', משתמשים בערך
none:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
המאמרים הבאים
אחרי יצירת תוכנת הביניים, אפשר לעבור אל הטמעת הלוגיקה העסקית.