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

يتوافق VHAL مع Java والبرامج الأصلية. ‫Car Service هو برنامج Java الوحيد الذي يتيح استخدام VHAL. بالنسبة إلى تطبيقات السيارات، استخدِم واجهات برمجة التطبيقات الخاصة بالسيارات (مثل CarPropertyManager) للوصول إلى خصائص VHAL بدلاً من التواصل مباشرةً مع VHAL. في الواقع، يحظر SELinux الوصول المباشر. للحصول على التفاصيل، يُرجى الاطّلاع على مستندات Car API على فهرس الحِزم.

بالنسبة إلى البرامج الأصلية، بدءًا من Android 13، استخدِم libvhalclient بدلاً من الاتصال مباشرةً بطبقة HAL الخاصة بالمركبة (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)