ההטמעה לדוגמה מבוססת על ארכיטקטורה של שני שכבות. בשכבה העליונה, DefaultVehicleHal, מיושמת ממשק VHAL AIDL ומספקת לוגיקה כללית של VHAL לכל מכשירי החומרה. בשכבה התחתונה, FakeVehicleHardware,
מיישמת את הממשק IVehicleHardware. הכיתה הזו מדמה את הלוגיקה של VHAL ליצירת אינטראקציה עם חומרה בפועל או עם ציר רכב, והיא ספציפית למכשיר. לחלופין, ספקים יכולים להתאים את אותה ארכיטקטורה, לעשות שימוש חוזר באותה כיתה DefaultVehicleHal (להרחיב אותה כדי לשכתב שיטה) ולספק הטמעה משלהם של IVehicleHardware.
איור 1. הטמעת VHAL לדוגמה
DefaultVehicleHal מכיל את הלוגיקה הבאה, שנחשבת לגנרית וניתן להחיל אותה על כל הטמעה של VHAL.
הטמעת הממשק IVehicle.
ביצוע בדיקות בסיסיות של קלט, כולל בדיקה של מזהים כפולים.
הקצאת אובייקטים של לקוח (לדוגמה, GetValuesClient) לכל פעולה לכל לקוח של Binder, והוספה של כל אחד מהם למאגר גלובלי.
ניהול הלוגיקה של קריאות חזרה אסינכרניות (callbacks), כמו הוספת בקשה בהמתנה למאגר של בקשות בהמתנה.
הפונקציה פותרת בקשות בהמתנה כשאנחנו מקבלים את התוצאות, או מחזירה שגיאה כשהזמן לטעינת אחת מהבקשות בהמתנה פג.
סריאליזציה ופענוח של LargeParcelable (ראו ParcelableUtils.h).
ניהול המינוי (ראו SubscriptionManager.h).
בדיקת ההרשאות. (ראו הפונקציות checkReadPermission ו-checkWritePermission).
קריאה תקופתית לפונקציה IVehicleHardware.checkHealth ושליחת אותות של פעימות לב (ראו פונקציית checkHealth).
IVehicleHardware הוא ממשק כללי שמשמש לייצוג של הטמעה של VHAL שמותאמת לחומרה. ההטמעה של ההפניה ל-IVehicleHardware היא FakeVehicleHardware, שמשתמשת במפה בזיכרון כדי לאחסן את ערך המאפיין ולא מתקשרת עם אוטובוס רכב בפועל. היא מיועדת להרצה במהדמ, ואין לה יחסי תלות ספציפיים לחומרה. אסור להשתמש בו כפי שהוא בהטמעות של ספקים, וצריך להוסיף לו לוגיקה ספציפית לרכב.
החל מ-Android 14, FakeVehicleHardware קורא את הגדרות הנכס הנתמכות בזמן הריצה במהלך האיפוס מהתיקייה /vendor/etc/automotive/vhalconfig/ של המכשיר, שמכילה קובץ תצורה בפורמט JSON. קובץ ה-README של VHAL מכיל מידע על הפורמט ועל התוכן של קובץ התצורה.
FakeVehicleHardware תומך גם בשינוי של קובץ התצורה לצורך בדיקה. אם נכס המערכת persist.vendor.vhal_init_value_override מוגדר (צריך להגדיר את הנכס הזה בזמן ה-build או בשלב מוקדם מאוד במהלך האתחול לפני האיפוס של VHAL), המערכת משתמשת בקובץ התצורה מהתיקייה /vendor/etc/automotive/vhaloverride/ במכשיר כדי לשנות את התצורה הקיימת. אפשר להשתמש בגישה דומה בהטמעה של ספק, כך שההגדרות של הנכסים הנתמכים ב-VHAL לא יהיו מקודדות ואפשר יהיה להחליט עליהן באופן דינמי בזמן ההתחלה.
רשימת ההגדרות של מאפייני הרכב חייבת להיות סטטית אחרי שמפעילים את VHAL.
החל מגרסה 16 של Android, GRPCVehicleHardware
מספק הטמעה נוספת של IVehicleHardware. ההטמעה הזו מבוססת על ההנחה שיש שרת נפרד שפועל במכונה מרוחקת או במכונה וירטואלית, שמכיל את הלוגיקה לטיפול בנכס. ה-VHAL שפועל במכשירי AAOS פועל כשרתי proxy שמעביר בקשות לשרת המרוחק. פרטים נוספים זמינים במאמר grpc.
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-07-26 (שעון UTC).
[[["התוכן קל להבנה","easyToUnderstand","thumb-up"],["התוכן עזר לי לפתור בעיה","solvedMyProblem","thumb-up"],["סיבה אחרת","otherUp","thumb-up"]],[["חסרים לי מידע או פרטים","missingTheInformationINeed","thumb-down"],["התוכן מורכב מדי או עם יותר מדי שלבים","tooComplicatedTooManySteps","thumb-down"],["התוכן לא עדכני","outOfDate","thumb-down"],["בעיה בתרגום","translationIssue","thumb-down"],["בעיה בדוגמאות/בקוד","samplesCodeIssue","thumb-down"],["סיבה אחרת","otherDown","thumb-down"]],["עדכון אחרון: 2025-07-26 (שעון UTC)."],[],[],null,["# Reference implementation\n\nWe provide a\n[reference implementation](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current)\nfor the AIDL VHAL. The main service thread is implemented\nat\n[`VehicleService.cpp`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/vhal/src/VehicleService.cpp).\nThe VHAL interface implementation is located at\n[`DefaultVehicleHal.cpp`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/vhal/src/DefaultVehicleHal.cpp).\n\n\nThe reference implementation is based on a two-layer architecture. On the upper layer,\n`DefaultVehicleHal`, implements VHAL AIDL interface and provides VHAL logic\ngeneric to all hardware devices. On the lower layer, `FakeVehicleHardware`,\nimplements the `IVehicleHardware` interface. This class simulates the VHAL logic\nof interacting with actual hardware or vehicle bus and is device-specific. Optionally, vendors\ncan adapt this same architecture, reuse the same `DefaultVehicleHal` class (extending\nit to overwrite a method), and provide their own `IVehicleHardware` implementation.\n**Figure 1.** VHAL reference implementation\n\n[`DefaultVehicleHal`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/vhal/src/DefaultVehicleHal.cpp)\ncontains the following logic, which is considered to be generic and can apply to any VHAL\nimplementation.\n\n- Implements the `IVehicle` interface.\n- Performs basic input checks, including a check for duplicate IDs.\n- Allocates client objects (for example, `GetValuesClient`) for each operation for each binder client, and adds each to a global pool.\n- Manages async callbacks logic, such as adding a pending request to a pending request pool. Resolves pending requests when we receive the results or returns error when one of the pending requests times out.\n- Serializes and deserializes `LargeParcelable` (see `ParcelableUtils.h`).\n- Manages subscription (see `SubscriptionManager.h`).\n- Checks permissions. (See the `checkReadPermission` and `checkWritePermission` functions).\n- Periodically calls `IVehicleHardware.checkHealth` and sends heartbeat signals (see the `checkHealth` function).\n\n[`IVehicleHardware`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/hardware/include/IVehicleHardware.h)\nis a generic interface used to represent a VHAL's hardware-specific\nimplementation. The reference implementation for `IVehicleHardware` is\n[`FakeVehicleHardware`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/fake_impl/hardware/src/FakeVehicleHardware.cpp),\nwhich uses an in-memory map to store property value and does\nnot communicate with an actual vehicle bus. It's intended to run on an emulator and have no\nhardware-specific dependencies. Vendor implementations must not use it as-is and must add\nvehicle bus-specific logic.\n\nStarting in Android 14, `FakeVehicleHardware` reads the supported property config at run-time\nduring initialization from the device's `/vendor/etc/automotive/vhalconfig/` folder,\nwhich contains a JSON-style config file. See the\n[reference VHAL README file](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/default_config/config/README.md)\nfor config file format and config file content.\n\n`FakeVehicleHardware` also supports config file override for testing. If the\nsystem property `persist.vendor.vhal_init_value_override` is set (this property must be\nset at build time or very early during boot before VHAL initialization), it uses the config\nfile from the `/vendor/etc/automotive/vhaloverride/` folder on the device to override\nthe existing configuration. A vendor implementation can use a similar approach so that the VHAL-\nsupported property configuration is not hard-coded and can be dynamically decided at start time.\nThe list of vehicle property configs must be static after VHAL is initialized.\n\nStarting in Android 16, [`GRPCVehicleHardware`](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/grpc/GRPCVehicleHardware.cpp)\nprovides another reference `IVehicleHardware` implementation. This implementation\nassumes there is a separate server running on a remote machine or VM which contains the property\nhandling logic. The VHAL running on AAOS devices acts as a proxy that forwards requests to\nthe remote server. See [grpc](https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/android16-release/automotive/vehicle/aidl/impl/current/README.md#grpc)\nfor more details."]]