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

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

בלקוחות מקומיים, החל מ-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 כך שתאפשר ללקוח המקורי לגשת ל-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)