استخدام VHAL مع العميل الأصلي

يتوافق VHAL مع Java والبرامج الأصلية. ‫Car Service هو برنامج Java الوحيد الذي يتيح استخدام VHAL. بالنسبة إلى تطبيقات السيارات، استخدِم Car APIs (على سبيل المثال، 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)