יצירת תוכנת ביניים

תוכנת הביניים 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:

קלטים ופלטים של VSIDLC

איור 1. קלטים ופלטים של VSIDLC.

הסבר על התרשים:

  1. כקלט, אתם מספקים את הקבצים הבאים שמאורגנים בתוך ספריות שנקראות קטלוגים:

    • קובצי Proto (עם הסיומת .proto) מכילים מבני נתונים שמועברים בין יחידות השירות שהוגדרו על ידי VSIDL.
    • קבצים מסוג VSIDL (עם הסיומת .vsidl) מגדירים חבילות שירות, יחידות שירות ובעלות על סוג יחידה.
    • קבצי Android.bp בכל ספריית קטלוג מגדירים יעדי בנייה של rust_protobuf לכל קובצי ה-proto בקטלוג. ‫VSIDLC משתמש ב-crate_name שצוין ביעדים האלה כדי להפנות לסוגי הודעות ה-protobuf שנוצרו ב-Rust.
  2. מריצים את 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:

  1. אם לא הגדרתם את הסביבה, מריצים את הפקודה source build/envsetup.sh.

  2. מריצים את הפקודה הבאה כדי ליצור את VSIDLC:

    m vsidlc
    
  3. מוודאים שבספריית הקטלוג של VSIDL יש את הקבצים הנדרשים של build,‏ protobuf ו-VSIDL.

    חשוב לוודא שכל קובץ פרוטו שייך רק ליעד ספרייה אחד בקטלוג.
  4. מריצים את הפקודה 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.bp genrules במקום קוד 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 ...

צריך לספק נתיבים לכל גרף התלות, כולל תלויות טרנזיטיביות (תלויות של תלויות). לדוגמה, נניח שיש לכם את עץ התלות הבא בקטלוג:

דוגמה לעץ תלות של VSIDLC

איור 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
    

המאמרים הבאים

אחרי יצירת תוכנת הביניים, אפשר לעבור אל הטמעת הלוגיקה העסקית.