از VHAL با مشتری اصلی استفاده کنید

VHAL از جاوا و کلاینت‌های بومی پشتیبانی می‌کند. Car Service تنها کلاینت جاوا برای VHAL است. برای برنامه‌های خودرو، به جای ارتباط مستقیم با VHAL، از APIهای خودرو (مثلاً CarPropertyManager ) برای دسترسی به ویژگی‌های VHAL استفاده کنید. در واقع، SELinux دسترسی مستقیم را مسدود می‌کند. برای جزئیات بیشتر، به مستندات Car API در Package Index مراجعه کنید.

برای کلاینت‌های نیتیو، از اندروید ۱۳ به بعد، به جای اتصال مستقیم به VHAL، از libvhalclient استفاده کنید. این یک کتابخانه کلاینت است که یک رابط مشترک، 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)