שימוש ב-VHAL עם הלקוח המקורי

‫VHAL תומך ב-Java ובלקוחות מקומיים. ‫Car Service הוא לקוח Java היחיד של VHAL. באפליקציות לרכב, כדי לגשת למאפייני VHAL, צריך להשתמש בממשקי ה-API לרכב (לדוגמה, CarPropertyManager) במקום לתקשר ישירות עם VHAL. למעשה, SELinux חוסם גישה ישירה. פרטים נוספים מופיעים במסמכי ה-API של Car בכתובת Package Index.

בממשקי לקוח מקוריים, החל מ-Android 13, צריך להשתמש ב-libvhalclient במקום להתחבר ישירות ל-VHAL. זוהי ספריית לקוח שחושפת ממשק נפוץ אחד,IVhalClient.h ליישומי AIDL ו-HIDL VHAL. בדוגמה הבאה מוצג איך ליצור לקוח מקורי של VHAL ולהשתמש בו כדי לקבל מספר זיהוי רכב (VIN):

#include <IVhalClient.h>
#include <VehicleHalTypes.h>
#include <VehicleUtils.h>

using ::aidl::android::hardware::automotive::vehicle::VehicleProperty;
using ::android::frameworks::automotive::vhal::IVhalClient;
using ::android::hardware::automotive::vehicle::toInt;

int main(int argc, char** argv) {
  auto vhalClient = IVhalClient::tryCreate();
  if (vhalClient == nullptr) {
    // handle error.
    return -1;
  }
  auto result = vhalClient->getValueSync(
      *vhalClient->createHalPropValue(toInt(VehicleProperty::INFO_VIN)));
  // Use result

  return 0;
}

צריך להגדיר את מדיניות SELinux כדי לאפשר ל-Native Client לגשת ל-VHAL. לדוגמה:

# Define my domain
type my_native_daemon, domain;

# Define the exec file type.
type my_native_daemon_exec, exec_type, file_type, system_file_type;

# Initialize domain.
init_daemon_domain(my_native_daemon)

# Allow using hwbinder for HIDL VHAL, not required if AIDL is used.
hwbinder_use(my_native_daemon)
# Allow using binder for AIDL VHAL
binder_use(my_native_daemon)
# Allow my_native_daemon to be a VHAL client.
hal_client_domain(my_native_daemon, hal_vehicle)